KNUTH-MORRIS-PRATT ALGORITMUS (KMP) KÉSZÍTETTE: ZELNIK MÁRTON
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) TÖMÖREN Adott egy szöveg, és egy keresendő minta (szó). A feladat az, hogy megkeressük a szövegben a minta első előfordulását. A KMP lényege, hogy nem kell betűnként a szövegre illesztenünk a szót, hanem nagyobb lépésekkel haladhatunk. Ahova már láthatóan nem fog illeszkedni, ott nem is próbálkozunk
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) RÉSZLETESEN Ez az algoritmus egy lineáris idejű mintaillesztő algoritmus. Az algoritmus kiküszöböli a δ átmeneti függvény kiszámítását és az illesztési ideje Θ (n). Egy π[1..m] segédfüggvényt használunk, amelyet előzetesen számítunk ki a minta alapján Θ (m) idő alatt. A π tömb segítségével a δ átmeneti függvény értékei „menet közben” hatékonyan számolhatók. Ez azt jelenti, hogy bármely q=0,1,…,m állapotra és a єΣ jelre, π(q) érték adja meg δ (q,a) számítási módját és ez független a-tól. A π tömbnek csak m eleme van, míg δ -nak σ (m| Σ |), így az előfeldolgozás során megspóroljuk a | Σ | tényezőt, ha π-t határozzuk meg δ helyett. Alapötlet: a léptetés mértéke előre kiszámítható a mintára, továbbá a léptetés után az összehasonlítást nem kell a minta elejéről kezdeni.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ÉRDEKESSÉG Hasonlóan működik mint a Brute Force algoritmus, ám kihasználja a mintában levő prefix-suffix kapcsolatokat (ha vannak), így ha egy szöveg vizsgálata elromlik bizonyos karakternél, nem feltétlen kell a vizsgálatot a minta elejétől újrakezdeni. Csak a megfelelő prefixszel kell odébb tolni a mintát, az „elromlott” karakterhez. Viszont ahhoz, hogy tudjuk a mintával való ugrás lehetséges értékeit, definiálnunk kell egy next függvényt, amely megadja a minta egyes kezdőszeleteire a leghosszabb egymással egyező prefix-szuffix párok hosszát. Ezt a gyakorlatban egy vektorral lehet megvalósítani, amit az initnext(M[1..m],next[1..m-1]) eljárásban töltünk fel. (M a minta, m hosszúsággal)
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ALGORITMUS Initnext(M[1..m], next[1..m-1]) i, j := 0, 0 i<n ⋀ j<m S[i+1] = M[j+1] i, j := i+1, j+1j = 0 i := i+1j := next[j] j = m k, u := i+m, ↑u := ↓ next(j) = max{ h ∊ [ 0..j-1 ]: M[ 1..h ] = M[ j-h+1..j ] }
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg: ABCABCABCYXYZ… Minta: ABCABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik. A lehető legkisebb ugrással, a lehető legnagyobb azonos résszel kell tovább illesztenünk a mintát.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik. A lehető legkisebb ugrással, a lehető legnagyobb azonos résszel kell tovább illesztenünk a mintát. A következő illesztéshez a 2. ‚A’ betűre toljuk el. ►►
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik. A lehető legkisebb ugrással, a lehető legnagyobb azonos résszel kell tovább illesztenünk a mintát. A következő illesztéshez a 2. ‚A’ betűre toljuk el.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik. A lehető legkisebb ugrással, a lehető legnagyobb azonos résszel kell tovább illesztenünk a mintát. A következő illesztéshez a 2. ‚A’ betűre toljuk el.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) PÉLDA Szöveg:ABCABCABCYXYZ… Minta: ABCABCY ‚ABCABC’-ig jó, onnantól nem illeszkedik. A lehető legkisebb ugrással, a lehető legnagyobb azonos résszel kell tovább illesztenünk a mintát. A következő illesztéshez a 2. ‚A’ betűre toljuk el.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1.
Szöveg: ABABAX… Minta: ABABAY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s. Ha |p|=|s|>0 => p-t s-re toljuk.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s. Ha |p|=|s|>0 => p-t s-re toljuk. ►
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 1. Szöveg: ABABAX… Minta: ABABAY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s. Ha |p|=|s|>0 => p-t s-re toljuk.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 2.
Szöveg: ABCX… Minta: ABCY
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 2. Szöveg: ABCX… Minta: ABCY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s, de itt nincsenek ilyenek.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 2. Szöveg: ABCX… Minta: ABCY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s, de itt nincsenek ilyenek. Ha |p|=|s|=0 => teljes eltolást alkalmazunk.
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 2. Szöveg: ABCX… Minta: ABCY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s, de itt nincsenek ilyenek. Ha |p|=|s|=0 => teljes eltolást alkalmazunk. ►
KNUTH-MORRIS-PRATT ALGORITMUS (KMP) ELTOLÁS PÉLDA 2. Szöveg: ABCX… Minta: ABCY Az illeszkedő részen belül a maximális egyező prefix-szuffix pár p és s, de itt nincsenek ilyenek. Ha |p|=|s|=0 => teljes eltolást alkalmazunk.