tablica LCP
tablica LCP | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Typ | Szyk | |||||||||
Wynalezione przez | Manber i Myers (1993) | |||||||||
Złożoność czasowa i przestrzenna w notacji dużego O | ||||||||||
|
W informatyce najdłuższa wspólna tablica prefiksów ( tablica LCP ) jest pomocniczą strukturą danych w stosunku do tablicy sufiksów . Przechowuje długości najdłuższych wspólnych przedrostków (LCP) między wszystkimi parami kolejnych sufiksów w posortowanej tablicy sufiksów.
Na przykład, jeśli A := [ aab , ab , abaab , b , baab ] jest tablicą sufiksów, najdłuższy wspólny przedrostek między A [1] = aab i A [2] = ab to a o długości 1, więc H [2] = 1 w tablicy LCP H . Podobnie LCP dla A [2] = ab i A [3] = abaab to ab , więc H [3] = 2.
przechodzenia drzewa sufiksów z góry na dół i z dołu do góry , przyspiesza dopasowywanie wzorców w tablicy sufiksów i jest warunkiem wstępnym dla skompresowanych drzew sufiksów.
Historia
Tablica LCP została wprowadzona w 1993 roku przez Udi Manbera i Gene'a Myersa wraz z tablicą sufiksów w celu poprawy czasu działania ich algorytmu wyszukiwania ciągów.
Definicja
Niech tablicą sufiksów łańcucha o długości , gdzie jest wartowniczym, który jest unikalny i leksykograficznie mniejszy niż jakikolwiek inny znak. Niech oznaczają podłańcuch w zakresie od do . Tak więc, jest sufiksem Displaystyle
Niech oznacza długość najdłuższego wspólnego przedrostka między dwoma łańcuchami { . Wtedy tablica LCP tablicą liczb całkowitych o rozmiarze , że jest nieokreślony i na każde . Zatem przechowuje długość najdłuższego wspólnego przedrostka leksykograficznie sufiksu i jego poprzednika w tablicy sufiksów
Różnica między tablicą LCP a tablicą sufiksów:
- Tablica sufiksów: reprezentuje rangę leksykograficzną każdego sufiksu tablicy.
- Tablica LCP: zawiera dopasowanie prefiksu o maksymalnej długości między dwoma kolejnymi sufiksami po ich posortowaniu leksykograficznym.
Przykład
Rozważ ciąg :
I | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Si] | B | A | N | A | N | A | $ |
i odpowiadająca jej posortowana tablica sufiksów :
I | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
A[i] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
Tablica sufiksów z sufiksami wypisanymi pod spodem pionowo:
I | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
A[i] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
S[A[i], n][1] | $ | A | A | A | B | N | N |
S[A[i], n][2] | $ | N | N | A | A | A | |
S[A[i], n][3] | A | A | N | $ | N | ||
S[A[i], n][4] | $ | N | A | A | |||
S[A[i], n][5] | A | N | $ | ||||
S[A[i], n][6] | $ | A | |||||
S[A[i], n][7] | $ |
Następnie tablica LCP jest konstruowana przez porównanie leksykograficznie kolejnych sufiksów w celu określenia ich najdłuższego wspólnego przedrostka:
I | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Cześć] | nieokreślony | 0 | 1 | 3 | 0 | 0 | 2 |
Na przykład to długość najdłuższego wspólnego przedrostka wspólny dla sufiksów i . Zauważ, że , ponieważ nie ma
Wydajne algorytmy konstrukcyjne
Algorytmy konstrukcji tablic LCP można podzielić na dwie różne kategorie: algorytmy, które obliczają tablicę LCP jako produkt uboczny tablicy sufiksów oraz algorytmy, które wykorzystują już skonstruowaną tablicę sufiksów w celu obliczenia wartości LCP.
) dostarczają algorytm do obliczania tablicy LCP wraz w Kärkkäinen i Sanders (2003) pokazują możliwa jest również modyfikacja ich algorytmu czasowego w taki sposób obliczał również tablicę LCP Kasai i in. (2001) przedstawiają pierwszy algorytm czasu (FLAAP), który oblicza tablicę LCP na podstawie tekstu i tablicy sufiksów.
Zakładając, że każdy symbol tekstowy zajmuje jeden bajt, a każdy wpis sufiksu lub tablicy LCP zajmuje 4 bajty, główną wadą ich algorytmu jest duże zajęcie miejsca wynoszące 13 bajtów, podczas gdy oryginalne wyjście sufiks tablica LCP) zajmuje tylko . Dlatego Manzini (2004) stworzył udoskonaloną wersję algorytmu Kasai et al. ( ) ( ) i zmniejszył zajmowaną przestrzeń do . ) przedstawiają kolejne udoskonalenie algorytmu Kasai ( -algorytm), które poprawia czas działania. Zamiast rzeczywistej tablicy LCP algorytm ten buduje permutowaną tablicę LCP (PLCP), w której wartości pojawiają się w kolejności tekstowej, a nie leksykograficznej.
Gog i Ohlebusch (2011) podają dwa algorytmy które chociaż teoretycznie były powolne ( w praktyce
Począwszy od 2012 r., obecnie najszybszy algorytm budowy macierzy LCP w czasie liniowym pochodzi od Fischera (2011) , który z kolei jest oparty na jednym z najszybszych algorytmów konstrukcji macierzy sufiksów (SA-IS) autorstwa Nong, Zhang & Chan (2009) . Fischer & Kurpicz (2017) oparty na DivSufSort Yuty Mori jest jeszcze szybszy.
Aplikacje
Jak zauważyli Abouelhoda, Kurtz i Ohlebusch (2004), kilka problemów związanych z przetwarzaniem ciągów znaków można rozwiązać za pomocą następujących rodzajów przechodzenia przez drzewo :
- przechodzenie od dołu do góry przez całe drzewo sufiksów
- przechodzenie z góry na dół poddrzewa drzewa sufiksów
- przechodzenie przez drzewo sufiksów za pomocą łączy sufiksów.
Kasai i in. (2001) pokazują, jak symulować przechodzenie od dołu do góry drzewa sufiksów przy użyciu tylko tablicy sufiksów i tablicy LCP. Abouelhoda, Kurtz i Ohlebusch (2004) rozszerzają tablicę sufiksów o tablicę LCP i dodatkowe struktury danych oraz opisują, w jaki sposób ta ulepszona tablica sufiksów może być wykorzystana do symulacji wszystkich trzech rodzajów przechodzenia drzewa sufiksów. Fischer i Heun (2007) zmniejszają wymagania przestrzenne dla ulepszonej tablicy sufiksów poprzez wstępne przetwarzanie tablicy LCP dla zapytań o minimalny zakres . Zatem, każdy problem, który można rozwiązać za pomocą algorytmów drzewa sufiksów, można również rozwiązać za pomocą rozszerzonej tablicy sufiksów .
wzorzec o długości podłańcuchem łańcucha długości zajmuje czas, jeśli używana jest tylko tablica sufiksów. Wykorzystując dodatkowo informacje LCP, to ograniczenie można poprawić do czas. (2004) pokazują jak jeszcze bardziej poprawić ten czas pracy, aby osiągnąć czas Tak więc, używając tablicy sufiksów i informacji o tablicy LCP, na zapytanie decyzyjne można odpowiedzieć tak szybko, jak przy użyciu drzewa sufiksów .
Tablica LCP jest również istotną częścią skompresowanych drzew sufiksów, które zapewniają pełną funkcjonalność drzewa sufiksów, taką jak łącza sufiksów i zapytania o najniższego wspólnego przodka . Co więcej, użyć razem z tablicą sufiksów do obliczenia faktoryzacji Lempel Ziv LZ77 w
Najdłużej problem z podłańcuchem łańcucha o długości można rozwiązać w sufiksów, jak i tablicę LCP. aby znaleźć jej maksymalną wartość jej indeks gdzie jest przechowywany Najdłuższy podciąg, który występuje co najmniej dwa razy, jest wtedy dany przez .
W pozostałej części tej sekcji wyjaśniono bardziej szczegółowo dwa zastosowania tablicy LCP: W jaki sposób tablica sufiksów i tablica LCP łańcucha mogą być użyte do skonstruowania odpowiedniego drzewa sufiksów i jak można odpowiadać na zapytania LCP dotyczące dowolnych sufiksów przy użyciu zakresu minimalne zapytania w tablicy LCP.
Znajdź liczbę wystąpień wzoru
Aby znaleźć liczbę wystąpień danego ciągu długość ) w tekście (długość }
- względem tablicy sufiksów, aby znaleźć pozycję początkową i końcową wszystkich wystąpień .
- Teraz, aby przyspieszyć wyszukiwanie, używamy tablicy LCP, a konkretnie specjalnej wersji tablicy LCP (LCP-LR poniżej).
Problem z użyciem standardowego wyszukiwania binarnego (bez informacji LCP) polega na tym, że w każdym z porównań, które wpisem suffix array, co oznacza pełne porównanie ciągów do m znaków. Więc złożoność jest .
Tablica LCP-LR pomaga to poprawić w następujący sposób:
W dowolnym momencie algorytmu wyszukiwania binarnego bierzemy pod uwagę, jak zwykle, zakres tablicy sufiksów i jej centralny punkt i zdecyduj, czy kontynuujemy nasze poszukiwania w lewym podzakresie , czy w prawym podzakresie . Aby podjąć decyzję, porównujemy z ciągiem w . Jeśli z nasze wyszukiwanie jest zakończone jeśli nie, porównaliśmy już pierwsze z , a następnie zdecydowaliśmy, czy jest leksykograficznie mniejszy czy większy niż . Załóżmy, że wynik jest taki, że większy niż . Tak więc w następnym kroku rozważamy i nowy punkt środkowy w środku
M ...... M' ...... R | wiemy: lcp(P,M)==k
Sztuczka polega teraz na tym, że LCP-LR jest wstępnie obliczany tak, że -lookup mówi nam najdłuższy wspólny przedrostek i } .
Wiemy już (z poprzedniego kroku), że sam ma przedrostek wspólnych z: : . Teraz są trzy możliwości:
- Przypadek 1: tj ma mniej znaków przedrostka wspólnego z M niż M ma wspólne z M'. Oznacza to, że (k+1)-ty znak M' jest taki sam jak znak M, a ponieważ P jest leksykograficznie większy niż M, musi być także leksykograficznie większy niż M'. Więc kontynuujemy w prawej połowie (M',...,R).
- Przypadek 2: tj. ma więcej wspólnych znaków przedrostka z niż ma wspólnego z . W konsekwencji, gdybyśmy porównali do , wspólny przedrostek byłby mniejszy niż a byłby leksykograficznie większy niż bez faktycznego porównania, kontynuujemy w lewej połowie .
- Przypadek 3: . i M 'są identyczne z pierwszymi . Aby zdecydować czy będziemy kontynuować w lewej, czy w prawej połowie, wystarczy porównać do od ten znak.
- Kontynuujemy rekurencyjnie.
Ogólny efekt jest taki, że żaden znak nie z jakimkolwiek znakiem tekstu więcej niż raz. Całkowita liczba porównań znaków jest ograniczona przez więc całkowita złożoność jest rzeczywiście .
obliczyć LCP-LR, aby był w stanie powiedzieć nam w dwoma wpisami tablicy sufiksów tablica LCP daje nam lcp tylko kolejnych wpisów, tj. . Jednak i w powyższym opisie niekoniecznie są kolejnymi wpisami.
Kluczem do tego jest uświadomienie sobie, że tylko niektóre zakresy binarnego: Zawsze i dzieli to na środku, a następnie kontynuuje w lewo lub w prawo i ponownie dzieli tę połowę i tak dalej. Można na to spojrzeć w inny sposób: każdy wpis tablicy sufiksów występuje jako centralny punkt dokładnie jednego możliwego zakresu podczas wyszukiwania binarnego. Jest więc dokładnie N różnych zakresów , które mogą odgrywać rolę podczas wyszukiwania binarnego i wystarczy wstępnie obliczyć i dla tych zakresów Więc to wartości, stąd LCP- ma
istnieje prosty algorytm rekurencyjny do obliczania LR w ze standardowej
Podsumowując:
- Możliwe czasie _
- Używanie LCP-LR podczas wyszukiwania binarnego pomaga przyspieszyć procedurę wyszukiwania od do .
- aby określić lewy i prawy koniec zakresu dopasowania dla a długość zakresu dopasowania odpowiada liczbie wystąpień P.
Konstrukcja drzewa sufiksów
uwagę tablicę sufiksów tablicę LCP ciągu = długości drzewo sufiksów skonstruować w time w oparciu o następujący pomysł: Rozpocznij od częściowego drzewa sufiksów dla leksykograficznie najmniejszego sufiksu i wielokrotnie wstawiaj pozostałe sufiksy w kolejności podanej przez tablicę sufiksów.
Niech częściowych sufiksów dla . Ponadto długością konkatenacji do
Zacznij od składającego się tylko z Aby wstawić do ścieżką na prawo ostatnio wstawionego liścia do korzenia, aż do najgłębszego węzła z został osiągnięty.
Musimy rozróżnić dwa przypadki:
-
Oznacza to, że połączenie etykiet na ścieżce od korzenia do - v najdłuższy wspólny przedrostek przyrostków i . W takim przypadku wstaw jako nowy liść i oznacz krawędź za pomocą . Tak więc etykieta krawędzi składa się z pozostałych znaków sufiksu
, które nie są już reprezentowane przez połączenie etykiet ścieżki od korzenia do - . Tworzy to częściowe drzewo sufiksów . . -
: Oznacza to, że połączenie etykiet na ścieżce od korzenia do - wyświetla mniej znaków niż najdłuższy wspólny przedrostek przyrostków i ZA i ZA
znaki są zawarte w etykiecie krawędzi skrajnej prawej krawędzi . musimy podzielić następujący sposób: dzieckiem skrajnej prawej ścieżce
- Usuń krawędź .
- Dodaj nowy węzeł wewnętrzny nową krawędź z etykietą . Nowa etykieta składa się z brakujących znaki najdłuższego wspólnego przedrostka i . Zatem połączenie etykiet ścieżki od korzenia wyświetla teraz najdłuższy wspólny przedrostek i i .
- Połącz się nowo utworzonym węzłem wewnętrznym krawędź oznaczoną . Nowa etykieta składa się z usuniętej krawędzi które nie były używane jako etykieta krawędzi .
- Dodaj za jako nowy liść połącz go z nowym węzłem wewnętrznym ( oznaczony jako . Zatem etykieta krawędzi się z pozostałych znaków sufiksu, przez konkatenację etykiet korzenia do- ścieżka.
- Tworzy to częściowe drzewo sufiksów . .
Prosty argument dotyczący amortyzacji pokazuje, że czas działania tego algorytmu jest ograniczony przez: }
Węzły, które są przemierzane w kroku, prawej ścieżki ( oprócz ostatniego węzła usuwane ze na prawo , kiedy . Te węzły nigdy nie zostaną ponownie pokonane przez wszystkie kolejne kroki . Dlatego w sumie zostanie pokonanych co najwyżej węzły
Zapytania LCP o dowolne sufiksy
Tablica LCP zawiera tylko najdłuższego wspólnego przedrostka każdej pary kolejnych sufiksów . Jednak za pomocą odwrotnej tablicy sufiksów ( , czyli sufiks , który zaczyna się na pozycji w jest przechowywany na pozycji w zapytaniach minimalnych o stałym zakresie czasu jest długości najdłuższego wspólnego przedrostka dowolnych sufiksów w czas.
Ze względu na porządek leksykograficzny tablicy sufiksów, każdy wspólny przedrostek sufiksów ma i być wspólnym przedrostkiem wszystkich sufiksów i pozycja w tablicy przyrostków . Dlatego długość najdłuższego przedrostka, który jest wspólny dla wszystkich tych przyrostków, jest minimalną wartością w przedziale . Wartość tę można znaleźć w czasie stałym, jeśli jest wstępnie przetwarzany dla zapytań o minimalny zakres.
uwagę łańcuch o długości dwie dowolne pozycje łańcuchu z , długość najdłuższego wspólnego przedrostka przyrostków i można obliczyć w następujący sposób: .
Notatki
- Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2004). „Zastępowanie drzew sufiksów ulepszonymi tablicami sufiksów” . Dziennik algorytmów dyskretnych . 2 : 53–86. doi : 10.1016/S1570-8667(03)00065-0 .
- Manber, Udi; Myers, Gene (1993). „Tablice sufiksów: nowa metoda wyszukiwania ciągów on-line” . SIAM Journal o informatyce . 22 (5): 935. CiteSeerX 10.1.1.105.6571 . doi : 10.1137/0222058 . S2CID 5074629 .
- Kasai, T.; Lee, G.; Arimura, H.; Arikawa, S.; Park, K. (2001). Obliczanie najdłuższego wspólnego przedrostka w czasie liniowym w tablicach sufiksów i jego zastosowania . Materiały z 12. dorocznego sympozjum na temat dopasowywania wzorów kombinatorycznych. Notatki z wykładów z informatyki. Tom. 2089. s. 181–192. doi : 10.1007/3-540-48194-X_17 . ISBN 978-3-540-42271-6 .
- Ohlebusch, Enno; Fischer, Johannes; Gog, Szymon (2010). CST++ . Przetwarzanie ciągów znaków i wyszukiwanie informacji. Notatki z wykładów z informatyki. Tom. 6393. str. 322. doi : 10.1007/978-3-642-16321-0_34 . ISBN 978-3-642-16320-3 .
- Kärkkäinen, Juha; Sanders, Piotr (2003). Prosta liniowa konstrukcja tablicy sufiksów roboczych . Materiały z 30. międzynarodowej konferencji na temat automatów, języków i programowania. s. 943–955 . Źródło 2012-08-28 .
- Fischer, Johannes (2011). Indukowanie tablicy LCP . Algorytmy i struktury danych. Notatki z wykładów z informatyki. Tom. 6844. s. 374–385. ar Xiv : 1101.3448 . doi : 10.1007/978-3-642-22300-6_32 . ISBN 978-3-642-22299-3 .
- Manzini, Giovanni (2004). Dwie sztuczki oszczędzające miejsce do obliczania macierzy LCP w czasie liniowym . Teoria algorytmów - SWAT 2004. Notatki z wykładów z informatyki. Tom. 3111. str. 372. doi : 10.1007/978-3-540-27810-8_32 . ISBN 978-3-540-22339-9 .
- Kärkkäinen, Juha; Manzini, Giovanni; Puglisi, Simon J. (2009). Permutowana tablica najdłuższego wspólnego prefiksu . Dopasowywanie wzorców kombinatorycznych. Notatki z wykładów z informatyki. Tom. 5577. str. 181. doi : 10.1007/978-3-642-02441-2_17 . ISBN 978-3-642-02440-5 .
- Puglisi, Simon J.; Turpin, Andrew (2008). Kompromisy czasoprzestrzenne dla obliczeń tablicowych z najdłuższym wspólnym prefiksem . Algorytmy i obliczenia . Notatki z wykładów z informatyki. Tom. 5369. str. 124. doi : 10.1007/978-3-540-92182-0_14 . ISBN 978-3-540-92181-3 .
- Gog, Szymon; Ohlebusch, Enno (2011). Szybkie i lekkie algorytmy konstrukcji macierzy LCP (PDF) . Proceedings of the Workshop on Algorithm Engineering and Experiments, ALENEX 2011. s. 25–34 . Źródło 2012-08-28 .
- Nong, Ge; Zhang Sen; Chan, Wai Hong (2009). Liniowa konstrukcja tablicy sufiksów przez prawie czyste sortowanie indukowane . Konferencja dotycząca kompresji danych 2009. P. 193. doi : 10.1109/DCC.2009.42 . ISBN 978-0-7695-3592-0 .
- Fischer, Johannes; Heun, Volker (2007). Nowa zwięzła reprezentacja informacji RMQ i ulepszeń w rozszerzonej tablicy sufiksów . Kombinatoryka, algorytmy, metodologie probabilistyczne i eksperymentalne. Notatki z wykładów z informatyki. Tom. 4614. str. 459. doi : 10.1007/978-3-540-74450-4_41 . ISBN 978-3-540-74449-8 .
- Chen, G.; Puglisi, SJ; Smyth, WF (2008). „Faktoryzacja Lempela-Ziva przy użyciu mniejszej ilości czasu i miejsca”. Matematyka w informatyce . 1 (4): 605. doi : 10.1007/s11786-007-0024-4 . S2CID 1721891 .
- Crochemore, M.; Ilie, L. (2008). „Obliczanie najdłuższego poprzedniego czynnika w czasie liniowym i aplikacjach”. Listy dotyczące przetwarzania informacji . 106 (2): 75. CiteSeerX 10.1.1.70.5720 . doi : 10.1016/j.ipl.2007.10.006 . S2CID 5492217 .
- Crochemore, M.; Ilie, L.; Smyth, WF (2008). Prosty algorytm obliczania faktoryzacji Lempla Ziva . Konferencja dotycząca kompresji danych (dcc 2008). P. 482. doi : 10.1109/DCC.2008.36 . hdl : 20.500.11937/5907 . ISBN 978-0-7695-3121-2 .
- Sadakane, K. (2007). „Skompresowane drzewa sufiksów z pełną funkcjonalnością” . Teoria systemów komputerowych . 41 (4): 589–607. CiteSeerX 10.1.1.224.4152 . doi : 10.1007/s00224-006-1198-x . S2CID 263130 .
- Fischer, Johannes; Mäkinen, Veli; Navarro, Gonzalo (2009). „Szybsze skompresowane drzewa sufiksów ograniczone entropią” . Informatyka teoretyczna . 410 (51): 5354. doi : 10.1016/j.tcs.2009.09.012 .
- Fischer, Johannes; Kurpicz, Florian (5 października 2017). „Demontaż DivSufSort” . Materiały Praskiej Konferencji Stringologicznej 2017 . ar Xiv : 1710.01896 .
Linki zewnętrzne
- Lustro implementacji ad-hoc kodu opisanego w Fischer (2011)
- SDSL: Succinct Data Structure Library — udostępnia różne implementacje tablic LCP, struktury obsługi zapytań o minimalny zasięg (RMQ) i wiele innych zwięzłych struktur danych
- Emulacja przechodzenia drzewa sufiksów od dołu do góry przy użyciu tablicy sufiksów i tablicy LCP (Java)
- Projekt indeksowania tekstu (konstrukcja drzew sufiksów w czasie liniowym, tablic sufiksów, tablicy LCP i transformacji Burrowsa-Wheelera)