Knuth-Morris-Pratt

Analýza a důkaz správnosti:

  • Konstrukce prefix‑funkce říká, jaký je nejdelší vlastní prefix jehly, který je zároveň suffixem . Tvoříme to spojenými kroky posunů přes dopředu a zpět – každým znakem buď přibude, nebo „skočíme zpátky“ po . Celkem tedy každé provede amortizovaně konstantu operací, dohromady .
  • Během hledání v seně platí invariant: označuje délku nejdelšího prefixu jehly, který je_suffixem_ právě čtené části sena. Analogicky k výstavě automatu. Pohybem se „vracíme“ pomocí , pokud nedojde ke shodě, a při shodě zvyšujeme . Celkem v každé pozici se provede maximálně 1 dopředný či zpětný krok, tedy .
  • Správnost: Jakmile dosáhne , máme úplné shodné . Poté nastavíme na , abychom mohli pokrýt i překrývající se výskyty.

Aho-Corasicková

Popis problému

Chceme nalézt všechny dvojice takové, že , tj. jehla se vyskytuje v seně na pozici .

Výstup může být superlineární – například pokud jsou jehly vzájemnými sufixy.

Cílem je nalezení všech výskytů v čase

kde jsou délky jehel, délka sena a počet výskytů.


Struktura automatu

Automat se skládá z:

  • Dopředných hran: písmenkový strom prefixů jehel.
  • Zpětných hran: vedou do nejdelšího vlastního sufixu stavu, který je zároveň jiným stavem.
  • Zkratek: vedou do nejbližšího koncového stavu po zpětných hranách.

U každého stavu si pamatujeme:

  • – kam vede zpětná hrana,
  • – zkrácená hrana do koncového stavu,
  • – je-li ve stavu koncové slovo,
  • – kam vede dopředná hrana po znaku .


Důkaz složitosti

  • Každý krok v běží v čase (díky zpětným a zkratkovým hranám).
  • Hlásíme výskyty v čase .
  • Konstrukce automatu běží v čase , protože každé hledání jedné jehly simuluje algoritmus KMP. Celková složitost: