plik


ÿþInstrukcja IEF Algorytmy i struktury danych Laboratorium 2:  Przeszukiwanie tekstów cd. 1. Algorytm KMP (Knuth, Morris Pratt). Algorytm KMP opublikowany zostaB w roku 1976 i stanowi rozwinicie algorytmu naiwnego. Algorytm naiwny wykonuje wiele powtarzajcych si przeszukiwaD, nie wykorzystujc w przypadku niezgodno[ci którego[ znaku wzorca informacji wcze[niej przebadanej. W algorytmie KMP wykorzystywana jest informacja o mo\liwo[ci wykonania przesunicia wzorca o wicej ni\ jeden znak. i  indeks tekstu j  indeks wzorca N  dBugo[ tekstu M - dBugo[ wzorca. " tworzenie tablicy przesuni Tablica przesuni (zwyczajowo nazwana next) wykorzystywana jest w algorytmie KMP do wyznaczania maksymalnych bezpiecznych przesuni wzorca wzgldem przeszukiwanego tekstu. Tworzona jest wedBug nastpujcego algorytmu: a) next[0]=-1 j=1 b) umie[ kopi pierwszych j znaków wzorca pod fragmentem wzorca zBo\onym z pierwszych j liter wzorca, przesunitych w prawo o jeden znak c) przesuwaj te kopi w prawo do chwili gdy: - wszystkie nakBadajce znaki s identyczne, lub - nie ma nakBadajcych si znaków d) next[j] jest równe liczbie nakBadajcych si znaków j=j+1 je[li j jest równe dBugo[ci wzorca  stop, w przeciwnym wypadku skocz do punktu b). next[0]=-1; for(i=0,j=-1;i<M-1;i++,j++,next[i]=j) while((j>=0)&&(wzor[i]!=wzor[j])) j=next[j]; " algorytm KMP - wykorzystanie tablicy przesuni a) i=0 j=0 b) wyznaczy tablic przesuni next dla danego wzorca c) dopóki text[i]=wzor[j] i nie przeszukano caBego tekstu zwiksz i oraz j o jeden d) je[li przeszukano caBy tekst, wtedy mo\liwe s dwa przypadki: je[li j=M to wzorzec zaczyna si na pozycji i-M, w przeciwnym przypadku wzorzec nie zostaB znaleziony e) poniewa\ tekst[i]!=wzor[j], wic nale\y skoczy do c) zmieniajc j na next[j]. Je[li j=-1, nale\y zwikszy i oraz j o jeden i równie\ skoczy do c). for(i=0,j=0;i<N && j<M; i++, j++) while((j>=0) && (tekst[i]!=wzor[j])) j=next[j]; if(j==M) printf("\nwzor zaczyna sie od indeksu %d\n",i-M+1); else printf("\n brak wzorca w tekscie\n"); PrzykBad Znalez wzorzec BABAABBB w tek[cie BABABAABBABAABBB indeks T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i “! tekst T B A B A B A A B B A B A A B B B wzorzec W B A B A A B B B j ‘! indeks W 0 1 2 3 4 5 6 7 next -1 0 0 1 2 0 1 1 Poniewa\ znaki text[i] i wzor[j] s zgodne, nastpuje przesunicie i oraz j a\ do momentu stwierdzenia niezgodno[ci lub znalezienia caBego wzorca. W przykBadzie niezgodno[ wystpuje na pozycji 4: indeks T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i “! tekst T B A B A B A A B B A B A A B B B wzorzec W B A B A A B B B j ‘! indeks W 0 1 2 3 4 5 6 7 next -1 0 0 1 2 0 1 1 Z tego powodu konieczne jest przesunicie wzorca tak, aby znak o indeksie next[4] (czyli 2), oznaczony pismem pogrubionym znalazB si pod znakiem o indeksie i (oznaczonym kolorem szarym): indeks T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i “! tekst T B A B A B A A B B A B A A B B B wzorzec W B A B A A B B B j ‘! indeks W 0 1 2 3 4 5 6 7 next -1 0 0 1 2 0 1 1 Poniewa\ znaki tekstu o indeksach od 4 do 8 s zgodne z odpowiednimi znakami (od 2 do 6) wzorca, wic nastpuje przesunicie indeksów i oraz j zgodnie z c). Ró\ne znaki wystpuj na pozycji 9: indeks T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i “! tekst T B A B A B A A B B A B A A B B B wzorzec W B A B A A B B B j ‘! indeks W 0 1 2 3 4 5 6 7 next -1 0 0 1 2 0 1 1 Z tego powodu konieczne jest przesunicie wzorca (poprzez zmian j) tak, aby znak o indeksie next[7] (czyli 1), oznaczony pismem pogrubionym znalazB si pod znakiem o indeksie i (oznaczonym kolorem szarym): indeks T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i “! tekst T B A B A B A A B B A B A A B B B wzorzec W B A B A A B B B j ‘! indeks W 0 1 2 3 4 5 6 7 next -1 0 0 1 2 0 1 1 Poniewa\ wszystkie pozostaBe znaki s zgodne z wzorcem, wzorzec zostaB odnaleziony na pozycji 16-8=8. Warto[ 8 wynika z warto[ci indeksu i o jeden wikszej od dBugo[ci napisu. 2. Algorytm BM (Boyera i Moore a) W algorytmie tym w przeciwieDstwie do algorytmu KMP porównywany jest ostatni znak wzorca. Je[li badany znak ( o indeksie i) tekstu nie wchodzi w skBad wzorca, mo\liwe jest przesunicie indeksu i o dBugo[ wzorca. Je[li znak ten wystpuje  konieczne jest przesunicie wzorca tak, aby znak ten znalazB si pod odpowiadajcym mu znakiem wzorca. K - maksymalna ilo[ ró\nych liter w tek[cie i we wzorcu (zakBadamy, \e wystpuj tylko du\e litery) " tworzenie tablicy przesuni for(i=0;i<K;i++) shift[i]=M; for(i=0;i<M;i++) shift[wzor[i]-'A']=M-i-1; PrzykBad: wzorzec ABGBD tekst ABCDEFGH A B G B D 0 1 2 3 4 dBugo[ wzorca wynosi 5 Zawarto[ tablicy shift k  A  B  C  D  E  F  G  H shift[k] 4 1 5 0 5 5 2 5 " algorytm BM - wykorzystanie tablicy przesuni a) wyznaczy tablic przesuni shift dla danego wzorca b) je[li dBugo[ wzorca > dBugo[ tekstu  stop, nie znaleziono c) rozpocz przeszukiwanie od ostatniej litery wzorca i odpowiadajcej jej literze tekstu i=M-1, j=M-1 d) dopóki j>=0 wykonuj dopóki i-ty znak tekstu oraz j-ty znak wzorca ró\ni si, wykonuj u\ywajc tablicy shift wyznacz przesunicie x odpowiadajce znakowi T[i] je[li M-j>x, zwiksz i o warto[ M-j; w przeciwnym przypadku  zwiksz i o warto[ przesunicia x je[li i jest wiksze lub równe od dBugo[ci tekstu  stop, wzorca nie znaleziono ustaw j na ostatni znak wzorca zmniejsz i oraz j o jeden e) odnaleziono wzorzec na pozycji i+1 for(i=M-1,j=M-1;j>=0 ; i--, j--) while(tekst[i]!=wzor[j]) { x=shift[tekst[i]-'A']; if(M-j>x) i+=M-j; else i+=x; if(i>=N) { printf("\nbrak\n"); return 0; } } printf("\nwzor zaczyna sie od indeksu %d\n",i+1); PrzykBad: wzorzec: ABGBD tekst: ABGHHABGBDEH M=5 N=12 M d" N - poszukiwania mo\na rozpocz od i=j=4 indeks T 0 1 2 3 4 5 6 7 8 9 10 11 i “! tekst T A B G H H A B G B D E H wzorzec W A B G B D j ‘! indeks W 0 1 2 3 4 Poniewa\ j>0 i znaki H i D ró\ni si, wic nale\y wyznaczy przesunicie x=shift[ H ]=5. Poniewa\ warunek 5-4>5 nie jest speBniony i=4+5=9; indeks T 0 1 2 3 4 5 6 7 8 9 10 11 i “! tekst T A B G H H A B G B D E H wzorzec W A B G B D j ‘! indeks W 0 1 2 3 4 Poniewa\ i-ty znak tekstu i j-ty znak wzorca s identyczne, wic nale\y zbada poprzedni znak, zmniejszajc je o jeden: indeks T 0 1 2 3 4 5 6 7 8 9 10 11 i “! tekst T A B G H H A B G B D E H wzorzec W A B G B D j ‘! indeks W 0 1 2 3 4 Postpujc analogicznie oka\e si, \e wzorzec zostaB odnaleziony. 3. Zadania do wykonania: " Prosz napisa program, który wczytuje dowolny tekst oraz wzorzec. Szuka wzorca algorytmem KMP. Uogólni algorytm, aby znajdowaB wszystkie wzorce, ich ilo[, albo ich brak. " Prosz napisa program, który wczytuje dowolny tekst oraz wzorzec. Szuka wzorca algorytmem BM. Uogólni algorytm, aby znajdowaB wszystkie wzorce, ich ilo[, albo ich brak.

Wyszukiwarka

Podobne podstrony:
Instrukcja IEF Algorytmy i struktury?nych lab1
Algorytmy I Struktury Danych (Wyklady) info
algorytmy i struktury
Algorytmy i struktury danych Wyklad 4
Algorytmy i struktury danych Wyklad 3
Algorytmy Struktury?nych
Algorytmy i struktury danych Prosty program Simulated Annealing
notatek pl W,matematyka,Algorytmy i Struktury Danych
NP Algorytmy i struktury?nych Boryczka do wyk éadu
Algorytmy i struktury danych all
Algorytmy i struktury danych Programy do wykladu 3
Algorytmy i struktury danych rot
Algorytmy i struktury danych 04 Listy
C Algorytmy i struktury?nych?lstr

więcej podobnych podstron