A Knuth-Morris-Pratt algoritmus (KMP-algoritmus) egy hatékony algoritmus , amely egy karakterláncban lévő részkarakterláncot keres . Az algoritmus futási ideje lineárisan függ a bemenő adatok mennyiségétől, vagyis nem lehet aszimptotikusan hatékonyabb algoritmust kidolgozni.
Az algoritmust D. Knuth és W. Pratt , valamint tőlük függetlenül D. Morris dolgozta ki [1] . Munkájuk eredményét 1977 -ben közösen publikálták [2] .
Adott egy minta (karakterlánc) és egy karakterlánc . Meg kell határozni azt az indexet, amelytől kezdve a minta szerepel a karakterláncban . Ha nem szerepel benne , akkor olyan indexet ad vissza, amely nem értelmezhető pozícióként a karakterláncban (például negatív szám). Ha nyomon kell követnie egy minta minden előfordulását a szövegben, akkor érdemes egy további függvényt beiktatni, amely minden minta megtalálásakor meghívódik.
Az Aho-Korasik algoritmus azt is lehetővé teszi, hogy egyetlen karakterláncot keressen lineáris időben. De ennek az algoritmusnak a gyenge pontja a véges automata, amely kifejezetten O (| tű |·|Σ|) műveletekbe van beépítve, és ugyanannyi memóriát igényel.
Ha csak egy sort keres, minden állapotnak csak egy „közvetlen” átmenete lesz. Az oldalsó átmenetek kiszámítása dinamikusan történik, anélkül, hogy bármilyen módon gyorsítótáraznák őket.
ha szénakazal[i] = tű[állapot] akkor állapot = állapot + 1 egyébként állapot = side-transition(állapot, szénakazal[i])Könnyen belátható, hogy az Aho-Korasik algoritmus utótag hivatkozásai a kívánt sablon előtagfüggvényei.
Tekintsünk egy karakterlánc-összehasonlítást a pozícióban , ahol a minta egy szövegrészhez illeszkedik . Tegyük fel, hogy az első eltérés a és között fordult elő , ahol . Aztán és .
Eltoláskor teljesen elképzelhető, hogy a minta előtagja (kezdőkarakterek) konvergál a szöveg egyes utótagjaihoz (vég karakterei) . A leghosszabb előtag hossza, amely egyben utótag is, az index karakterláncából származó előtag függvény értéke .
Ez a következő algoritmushoz vezet: legyen az index karakterláncából származó előtag függvény értéke . Ezután az eltolódást követően a helyről folytathatjuk az összehasonlítást anélkül , hogy elveszítené a minta lehetséges helyét. Megmutatható, hogy a táblázat a keresés megkezdése előtt összehasonlításra számítható (amortizálható) . És mivel a karakterláncot pontosan egyszer fogjuk bejárni, az algoritmus teljes futási ideje egyenlő lesz , ahol a szöveg hossza .
A függvény visszaadja – a karakterlánc azon elemeinek számát, amelyek a talált előfordulásokat -ben fejezik be .
Húrok | |
---|---|
Karakterlánc hasonlósági mértékek | |
Substring keresés | |
palindromák | |
Sorozat-igazítás | |
Utótag szerkezetek | |
Egyéb |
Donald Knuth | |
---|---|
Publikációk |
|
Szoftver | |
Betűtípusok |
|
Hozzáértő programozás |
|
Algoritmusok |
|
Egyéb |
|