algorithm suffix - Comprensione dell'algoritmo di Ukkonen per gli alberi di suffisso




tree array (2)

Trova una copia del manuale di Algoritmi a stringa di Gusfield. Ha la migliore esposizione della costruzione dell'albero dei suffissi che ho visto. La linearità è una conseguenza sorprendente di una serie di ottimizzazioni dell'algoritmo di alto livello.

Questa domanda ha già una risposta qui:

Sto facendo un po 'di lavoro con l'algoritmo di Ukkonen per costruire alberi di suffisso, ma non sto capendo alcune parti della spiegazione dell'autore per la sua complessità lineare-temporale.

Ho imparato l'algoritmo e l'ho codificato, ma la carta che sto usando come fonte principale di informazioni (link qui sotto) è un po 'confusa in alcune parti quindi non è chiaro per me perché l'algoritmo sia lineare.

Qualsiasi aiuto? Grazie.

Link al documento di Ukkonen: http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf


Questo può essere risolto in O (n ^ 2) usando la programmazione dinamica.

Elaborare gli elementi di input in ordine e mantenere un elenco di tuple per ciascun elemento. Ogni tupla (A, B), per l'elemento che indicherò, A = lunghezza della sotto-sequenza crescente più lunga che termina con i e B = indice del predecessore della lista [i] nella sotto-sequenza crescente più lunga che termina alla lista [i ].

Partire dall'elemento 1, l'elenco di tuple per l'elemento 1 sarà [(1,0)] per l'elemento i, scansionare l'elenco 0..i e trovare l'elenco di elementi [k] tale che lista [k] <elenco [i] , il valore di A per l'elemento i, Ai sarà Ak + 1 e Bi sarà k. Se ci sono più di questi elementi, aggiungili alla lista di tuple per l'elemento i.

Alla fine, trova tutti gli elementi con valore massimo di A (lunghezza di LIS che termina con l'elemento) e torna indietro usando le tuple per ottenere l'elenco.

Ho condiviso il codice per lo stesso su http://www.edufyme.com/code/?id=66f041e16a60928b05a7e228a89c3799





algorithm complexity-theory suffix-tree