Processing math: 100%

Słownik podsłów bazowych i konstrukcja tablicy sufiksowej w czasie O(n log n)

Opiszemy uproszczoną wersję algorytmu Karpa-Millera-Rosenberga (w skrócie algorytmu KMR) rozwiązywania problemów tekstowych metodą słownika podsłów bazowych. Ustalmy pewnie tekst x długości n.

Zakładamy w tej sekcji, że dodatkowym symbolem jest xn+1=#, leksykograficznie najmniejszy symbol. Przez segment k-bazowy rozumiemy segment tekstu x[i..i+2k1] długości 2k lub kończący się na xn+1.

Teoretycznie możemy założyć, że po symbolu # mamy bardzo dużo takich symboli na prawo i każdy segment startujący wx[1..n] ma dokładnie długość 2k.

Słownik podsłów bazowych (w skrócie DBF(x), od ang. dictionary of basic factors) składa się z logn tablic

NAZWA0, NAZWA1, NAZWA2,NAZWAlogn.

Zakładamy, że NAZWAk[i] jest pozycją słowa x[i..i+2k1] na posortowanej liście (bez powtórzeń) wszystkich podsłów długości 2k słowa x. Jeśli długość wystaje poza koniec x to przyjmujemy że są tam (wirtualnie) same symbole #. Poniżej przedstawiamy przykład słownika podsłów bazowych DBF(abaabbaa).

Algorytm liczenia tablic Nazwa jest bardzo prosty. Załóżmy od razu, że symbole są ponumerowane leksykograficznie. Wtedy NAZWA0 jest zasadniczo równa tekstowi x.

Rysunek6: Słowo rozmiaru 2k+1 otrzymuje najpierw nazwę-kompozycję: kombinacją nazw (będących liczbami naturalnymi z przedziału [1..n]) dwóch podsłów długości 2k .

Opis jednej iteracji (transformacja:NAZWAk => NAZWAk+1)

Dla każdego i tworzymy nazwę-kompozycję slowa x[i..i+2k+11] jako NAZWAk[i],NAZWAk[i+2k] Każda taka kompozycja jest parą liczb naturalnych. Sortujemy te pary za pomocą algorytmu radix-sort i w ten sposób otrzymujemy tablicę, która koduje (w porządku leksykograficznym) każdą parę liczbą naturalną (pozycją w porządku leksykograficznym). Wartością NAZWAk+1[i] jest kod pary (NAZWAk[i],NAZWAk[i+2k]).

Zauważmy, że tablica sufiksowa odpowiada tablicy NAZWAlogn. Możemy to podsumować następująco:
1. słownik DBF(x) możemy skonstruować w czasie O(nlogn)i pamięci O(nlogn) (jest to również rozmiar słownika).
2. Tablicę sufiksową możemy otrzymać,stosując algorytm KMR, w czasie O(nlogn) i pamięci O(n). (Potrzebujemy pamiętać jedynie ostatnie dwie tablice w każdej iteracji.)