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: