Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 1 lgorytmy tekstowe na rzykładzie KMP Postawowe ojęcia Niech będzie dowolnym skończonym nieustym zbiorem symboli. Zbiór nazywamy alfabetem. Dowolny ciąg symboli ze zbioru nazywamy słowem (nad alfabetem ). Przykład. jest słowem nad alfabetem. Przez oznaczamy słowo uste, rzez oznaczamy (nieskończony) zbiór wszystkich słów nad alfabetem. Przez będziemy oznaczać długość słowa, n.,. Konkatenacja słów i jest to słowo owstałe o doisaniu słowa za słowem. Słowo jest refiksem słowa, jeśli dla ewnego słowa. nalogicznie, słowo jest sufiksem słowa, jeśli dla ewnego słowa. Przykłady. "!$# jest refiksem słowa!$#&%(')!+* ; %(')!+* jest jego sufiksem. jest refiksem i sufiksem każdego słowa. Każde słowo jest swoim własnym refiksem i sufiksem. jest refiksem, ale -, jest właściwym refiksem. nalog- Jeśli iczne definiujemy właściwy sufiks. Problem wyszukiwania wzorca to mówimy, że Dane słowa. ( wzorzec ) i! ( tekst ) nad ewnym alfabetem,./ 01!. Problem znaleźć wszystkie wystąienia wzorca. w tekście!. Przykład wzorzec 2 * wystęuje w tekście 232 ** 2 * 2 * na ozycjach 2, 5 i. 54 Przyjmiemy oznaczenia./ i! 56. lg. 1 rzedstawia algorytm naiwny rozwiązujący roblem wyszukiwania wzorca. lgorytm doasowuje wzorzec we wszystkich możliwych miejscach. lgorithm 1 naiwny 1 98 2 while ;0 3 B8 4 while.d 5 G8 H4 6=>4@ 6 if then Write( ) 8 98I )! do F do
4 O Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 2 Uwaga! Do alfabetu dodajemy dwa nowe, secjalne symbole, owiedzmy $ i @. Przed uruchomieniem algorytmu 1 $ doisujemy na końcu!, natomiast @ na końcu.. Pełnią one rolę strażników w wewnętrznej ętli while. Złożonośc czasowa oczywiście JLKMK Porawianie alg. naiwnego 6N>41 &O 6P4 JLK dostaliśmy niezgodność. Wiemy, że.dqfrsr F asuje do! TRURV Załóżmy, że dla zy warto srawdzać od nowa, czy wzorzec wystęuje na nastęnej ozycji ( ) może możemy rzeskoczyć kilka symboli Zobaczmy co się dzieje, gdy wzorzec wystęuje na jednej z ozycji F)RWRWRT (Rys. 1). O. ). ti] 1]=ti+j k] ti+j 1]=k] t 1..j] j] Rysunek 1 Wzorzec. wystęuje na jednej z ozycji F)RWRWRT. Widzimy, że w takiej sytuacji refiks.dxyrsr F jest równocześnie jego (właściwym) sufiksem! tzn..dqfrur %.D % FRUR F. Jeśli to jest ierwsze miejsce, w którym wystęuje taka sytuacja, możemy beziecznie rzesunąć do %. Wystarczy znać %. Innymi słowy, dla Z chcemy więc znać liczbę albo inaczej \ długość największego właściwego sufiksu.dqfrsr F, który jest równocześnie refiksem. ^]`_a \ 0 %Lb À c).dxfrur % jest sufiksem.dxfrur \e Wtedy możemy beziecznie doasowywać wzorzec w miejscu F. Zauważmy, że onieważ F b f 5 więc FgZh. Dla rzyjmijmy i \. Wtedy nie ma j sensu doasowywać wzorca w miejscu F, bo miejsce doasowania nie zmieni się. W takiej sytuacji rzesuwamy się tylko o jedną ozycję (g8 ), ale niewiele tracimy, bo H skoro to dla orzedniej wartości wykonano tylko jedno orównanie. więc ostatecznie k]`_a k rzesuwamy na ozycję K+Fl FmO. Zauważmy też, że nie musimy już srawdzać ierwszych F liter wzorca!
6 Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 3 Przykład. Tablica dla wzorca. no no. 1 2 3 4 5 6 8 9 10.D a b a c a b a c a a 0 0 1 0 1 2 3 4 5 1 Załóżmy, że tablicę mamy już obliczoną. Wykorzystując owyższe rozważania możemy orawić algorytm naiwny tak, żeby sożytkować informację zawartą w tablicy. Poniższy algorytm wymyślili anowie Knuth i Pratt oraz (niezależnie) Moris w 19 roku. lgorithm 2 lgorytm KMP (Knutha-Morisa-Pratta) 1 98 2 B8 6=>4@ 3 while ;0 q 4 {.DQFRSR FS.D 5 B8 F 6 while.d )! G8 H4 8 if then 9 Write( ) "]u_a 10 98I K$Fv do q F F do FmO FRUR \! rmrsrs t F ) } Twierdzenie. Niech. i! będ który na wejściu dostaje słowa. i! oraz tablicę!,./ w4 a dowolnymi słowami,./p0 działa w czasie JLK,! O. 16. lgorytm KMP, Uzasadnienie. Przyjmujemy, że orównanie dowolnych dwóch liter wykonuje się w czasie stałym. Wtedy orównanie dwóch liter możemy traktować jako oerację dominującą. Porównania liter wzorca z literami tekstu możemy odzielić na dwie kategorie orówania ozytywne (równość zachodzi) i negatywne (litery są różne). Ponieważ na końcu każego obrotu zewnętrznej ętli while wartość zmiennej rośnie, a w każdym obrocie tej ętli tylko raz wystęuje orównanie negatywne, odczas wykonania całego algorytmu całkowita liczba orównań negatywnych nie rzekracza 6Nq41. Równie łatwo oliczyć ozytywne orównania. Przyjrzyjmy się jednemu obrotowi zewnętrznej ętli while. Załóżmy, że o wykonaniu wewnętrznej ętli while xz. Niech ly oznacza nową {]`_a wartość (o wykonaniu z8i K+Fl F}O ), natomiast y nową wartość (o wykonaniu f ~8 F na oczątku kolejnego obrotu ętli). Wtedy vy F oraz \y \ czyli y y. Jeśli natomiast o wykonaniu wewnętrznej ętli while, to y, Fy F czyli y Fy ƒz^. Widzimy, że odczas działania algorytmu wartość wyrażenia nie maleje. Tymczasem o każdym ozytywnym orównaniu wartość rośnie. więc żadna litera tekstu nie będzie więcej niż raz ozytywnie orównana. Stąd wszystkich ozytywnych orównań jest nie więcej niż liter tekstu czyli 6. To kończy uzasadnienie.
ˆ ˆ Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 4 Jak obliczyć tablicę Przyomnijmy \ długość największego właściwego sufiksu.dqfrsr F, który jest równocześnie refiksem. gdybyśmy chcieli znać długości wszystkich właściwych sufiksów.dxfrur \, które są refiksami. Niech. i. Najdłuższym takim sufiksem jest F. Jego - długość to ˆ. Zastanówmy się nad nastęnym od względem długości takim sufiksem (oznaczmy go rzez Š ). Ponieważ i )Š są sufiksami. i WŠ jest krótszy niż, a więc WŠ jest właściwym sufiksem Y. o więcej, onieważ Š był nastęny od względem długości, jest on najdłuższym właściwym sufiksem Y, który jest równocześnie refiksem.. więc ŠY S H. nalogicznie ostęujemy rzy obliczaniu długości kolejnych sufiksów (atrz Rys 2)..DXYRSR.DXYRSR.DXYRSR.DXYRSR.D RSR \ Œ F F F Hˆ ^ H H Rysunek 2 Długości wszystkich właściwych sufiksów.dxyrsr. można znaleźć w tablicy., które są równocześnie refiksami Wniosek 1. Z tablicy sa równocześnie refiksami. sa to liczby można odczytać długości wszystkich właściwych sufiksów.dqfrur F, które F \U F )RWRWR)R Jak obliczyć tablicę Skorzystamy z rogramowania dynamicznego. k j Rysunek 3.DQFRSR % jest właściwym sufiksem i równocześnie refiksem.dqfrsr F. Jeśli.dXFRUR % jest właściwym sufiksem i równocześnie refiksem.dqfrur F (atrz Rys. 3) to.dqfrur % ) jest właściwym sufiksem i refiksem.dxfrur ),.D %.D F.
R 4 Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 5 więc żeby obliczyć F trzeba znaleźć najdłuższy sufiks.dxfrur refiksem.dqfrur ), który da się rzedłużyć, czyli najmniejsze ' takie że.d o ).D \R o, będący róznocześnie Jeśli nie ma takiego ' (tzn. żadnego, nawet ustego refiksu nie da się rzedłużyć), to lgorithm 3 Obliczanie tablicy 8 1 2 X) 8 3 for B8 to 4 do 4 {obliczamy F } 5 2N8 ) 6 while K 2{Z O and KX.D 2 2N8 8 if.d 2 ).D F then 9 F 8 2 10 else 11 F 8 ),.D FmO do \ 23 {róbujemy któtszy sufiks} H Twierdzenie. Złożoność czasowa algorytmu 3 dla słowa. długości 4 lgorithm 4 Obliczanie tablicy 1 8 2 X) 8 3 2N8 4 for B8 to 4 do 5 {obliczamy F } 6 while K 2{Z O and KX.D 2 2N8 8 if.d 2 ).D F then 9 2N8I2 F 8 2 10 11 else 12 F 8 ), wersja II.D FmO do 23 {róbujemy któtszy sufiks} wynosi K O. Uzasadnienie. Sójrzmy na algorytm 4. Powstał on na odstawie algorytmu 4 o dodaniu linii 3, 9 i usunięciu linii 5. Zauważmy, że działa on dokładnie tak samo jak ierwotny algorytm,
4 Łukasz Kowalik, SD 2003 lgorytmy tekstowe na rzykładzie KMP 6 tylko wartości zmiennej 2 zmieniają się w innych momentach. Łatwiej nam będzie analizować algorytm 4. Znowu rzyjmujemy, że orównanie dowolnych dwóch liter wykonuje się w czasie stałym. Żeby oszacować złożoność algorytmu wystarczy obliczyć liczbę wykonań instrukcji 2=8 23. Zauważmy, że wartości zmiennej 2 zmieniają się tylko w liniach i 9. W linii zawsze jednostek, maleją, natomiast w linii 9 zawsze rosną. Podczas całego algorytmu 2 rośnie o 4w a więc maleć może co najwyżej 4 razy (maleje co najmniej o 1). To kończy uzasadnienie. 6 H4 Wniosek 2. Złożoność czasowa algorytmu KMP jest rzędu K algorytmu KMP jest rzędu K O. O, złożoność amięciowa