I_P_W14_M16 Algorytm Knutha‑Morrisa‑Pratta
Algorytm Knutha‑Morrisa‑Pratta – implementacja w języku Java
Z e‑materiału Algorytm Knutha‑Morrisa‑PrattaAlgorytm Knutha‑Morrisa‑Pratta wiemy, że algorytm KMP jest rozszerzeniem algorytmu MP. Oba algorytmy zakładają zbudowanie tablicy częściowych dopasowań poprzez wcześniejszą analizę wzorca. Generowanie procesu przeszukiwania tekstu poprzedzone jest etapem budowy tablicy. Jednak dzięki mniejszej liczbie porównań, starty czasowe są zniwelowane.
W jaki sposób budujemy tablicę częściowych dopasowań? Jest to proces polegający na sprawdzaniu, jakiej szerokości są najdłuższe występujące w kolejnych prefiksach wzorca prefikso‑sufiksy.
Cały proces budowy tablicy częściowych dopasowań analizowaliśmy również w ramach zawartego w tej lekcji filmu. Powtórzyliśmy w nim najważniejsze pojęcia oraz zgłębiliśmy działanie opisywanego algorytmu z wyszczególnieniem wszystkich możliwych wariantów. Zdobytą, teoretyczną wiedzę wykorzystaliśmy także do zaimplementowania budowy tablicy w języku Java.
Inna, ale analogiczna do zawartej w filmie implementacja budowy tablicy została zaprezentowana poniżej. Możesz spróbować porównać obie implementacje i ocenić występujące różnice.
Specyfikacja problemu:
Dane:
wzorzec – łańcuch znaków
Wynik:
Program wyświetla długości prefikso‑sufiksów kolejnych prefiksów łańcucha wzorzec.
Po zbudowaniu tablicy częściowych dopasowań, możemy przejść do poszukiwania wzorca w tekście. Analizę tego elementu oraz jego implementację w języku Java również znajdziemy w filmie edukacyjnym.
Oto przykładowa implementacja wyszukiwania wzorca w tekście (również alternatywna w stosunku do implementacji zawartej w filmie), działająca zarówno dla tablicy wyznaczonej metodą MP, jak i KMP (wystarczy tylko zamienić funkcję budującą tablicę dopasowań).
Specyfikacja problemu:
Dane:
wzorzec – łańcuch znaków; poszukiwany wzorzec
tekst – łańcuch znaków
Wynik:
Program wyświetla pozycje wystąpień wzorca w łańcuchu. Wartość -1 nie wskazuje żadnej pozycji wzorca i oznacza, iż wzorzec nie pojawia się w przeszukiwanym łańcuchu.
Przykładowy program napisany w języku Java, który za pomocą algorytmu Knutha‑Morrisa‑Pratta wyszukuje wzorzec w tekście, może wyglądać tak:
Wynik działania przedstawionego programu:
Słownik
początkowa część łańcucha znaków składająca się z k znaków (k pierwszych znaków łańcucha)
końcowa część łańcucha znaków składająca się z k znaków (k ostatnich znaków łańcucha)
składający się z k znaków prefiks danego łańcucha znaków, który jest jednocześnie jego sufiksem (część łańcucha znaków występująca zarówno na jego początku, jak i końcu)