StartAlgorytmyPrzetwarzanie tekstuAlgorytm GS' (Galila Seiferasa)
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Algorytm GS' (Galila Seiferasa)
Ocena użytkowników:----- / 0
SłabyŚwietny 
Wpisany przez Tomasz Lubiński
wtorek, 26 lipca 2005 19:08
Podstawowym problemem dotyczącym tekstów jest problem wyszukiwania wzorca. Polega on na znalezieniu wszystkich wystąpień tekstu wzorzec, w tekście tekst. Przyjmujemy ponadto, że: |wzorzec|=m, |tekst|=n oraz n>=m.

Algorytm Galila-Seiferasa umożliwia rozwiązanie tego problemu w czasie liniowym i jednocześnie w pamięcie O(1). Przez pewien czas uważano nawet, że taki algorytm w ogóle nie jest możliwy. Poniżej zostanie opisana jego słabsza wersja.
Na potrzeby tego algorytmu wprowadziwy najpierw pojęcie wzorca łatwego. O wzorcu x powiemy, że jest łatwy, gdy żadne słowo niepuste postaci vvv nie jest jego prefiksem. Na przykład x=bcbcbcdef nie jest ławty, gdyż dla v=bc można zapisać, go jako x=vvvdef, natomiast x=abbababba jest wzorcem łatwym.
W przypadku, gdy mamy do czynienia ze wzorcem ławtym można skonstruować algorytm podobny do algorytmu KMP, w którym tablicę P zastępuje się przez pewne przybliżone oszacowania: P[j]<2j/3, przesunięcie(j)≥j/3

Gotowy algorytm ma postać:
while i<=n-m+1 do
begin
  j:=0;
  while ((j<m)and(wzorzec[j+1]=tekst[i+j])) do j:=j+1;
  if j=m then writeln((IntToStr(i)));
  i:=i+max(1,ceil(j/3));
end;

Algorytm GS' dla wzorców, ktore nie są łatwe, może (choć nie musi) dać odpowiedź niepoprawną. Dla następującego przykładu: wzorzec=aaaaaaab i tekst=aaaaaaaab zostanie wypisanych zero wystąpień wzorca, podczas gdy występuje on w tekscie począwszy od pozycji 2.
Przykładem zbioru łatwych wzorców jest zbiór słów Fibonacciego, który tworzy się podobnie jak ciąg liczb Fibonacciego, z tą jednak różnicą, że zamiast klasycznej sumy liczb stosuje się konkatenację lańcuchów: fibk+2=fibk+1fibk dla k>0. Na przykład dla fib1=a, fib2=b otrzymamy kolejno: fib3=ba, fib4=bab, fib5=babba, fib6=babbbabab.



Autor Język programowania Komentarz Otwórz Pobierz Ocena
Tomasz Lubiński C/C++
Implementacja w C/C++
Implementacja w C/C++
++++- / 1
Tomasz Lubiński Delphi/Pascal
Implementacja w Delphi/Pascal
Implementacja w Delphi/Pascal
++++- / 1
Tomasz Lubiński Java
Implementacja w Java
Implementacja w Java
++++- / 1
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: sobota, 11 czerwca 2011 14:21

Komentarze

 
photo
0 # Nerus 2010-11-20 13:18
Witam, chciałbym się dowiedzieć jaka jest różnica między algorytmem naiwnym a przedstawionym, dodatkowo chciałbym zaznaczyć że w kodzie C++ "chyba" występuje błąd tekst[i+j-1] "-1"
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Dodaj komentarz

Kod antysapmowy
Odśwież