Mintaillesztő algoritmusok Ölvedi Tibor OLTQAAI.ELTE
Mintaillesztő algoritmusok Amiről szó lesz: Bruteforce algoritmus Knuth-Morris-Pratt algoritmus Rabin-Karp algoritmus Boyer-Moore algoritmus Boyer-Moore-Horspool algoritmus Zhu-Takaoka algoritmus Aho-Corasick algoritmus
Bruteforce eljárás Minden lehetséges helyen keres Minden karaktert lehetséges kezdőnek tekint Kivéve a legutolsókat Majd ezek után leellenőrzi karakterenként az egyezést
Bruteforce eljárás almanemalmalmdegalmafaisvan
Bruteforce eljárás almanemalmalmdegalmafaisvan a
Bruteforce eljárás almanemalmalmdegalmafaisvan
Bruteforce eljárás almanemalmalmdegalmafaisvan alm
Bruteforce eljárás almanemalmalmdegalmafaisvan
Bruteforce eljárás almanemalmalmdegalmafaisvan alm_
Bruteforce eljárás almanemalmalmdegalmafaisvan alm_ almafa
Knuth-Morris-Pratt algoritmus Javítsunk az algoritmuson, úgy, hogy csak egyszer megyünk végig az elemeken Ha egymásba illeszkedő helyek vannak, tároljuk el azt külön, és egyszerre vizsgáljuk több helyen az illesztést
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan a
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan alm
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan alma a
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan al
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan alm_
Knuth-Morris-Pratt algoritmus almanemalmalmdegalmafaisvan alm_ almafa
Rabin-Karp algoritmus Még gyorsabb algoritmus főleg, ha több mintát is keresünk A lényeg: hashelés Kicsit módosítani kell nagy bemenetek esetén Majd a módosítás utáni hibákat kijavítani Feldolgozás két lépcsőben
Rabin-Karp algoritmus keresendő hosszával azonos hosszúságú részkaraktersorozatokat leképezünk egész számokra Majd az így kapott egészeket hasonlítjuk össze Egyezéseknél megvizsgáljuk magukat a karaktersorozatokat is. Így összességében kevesebb az összehasonlítás
Rabin-Karp algoritmus A hasítófüggvény: A karaktereket lekódoljuk ASCII szerint számokra Majd valami nagyobb prím alapú számrendszerben tekintjük az így kapott számok sorozatát egy szám jegyeinek Ezeket a számjegyekből álló számokat pedig átszámítjuk az alapértelmezett számrendszerbe Más hasítással is megoldható
Rabin-Karp algoritmus Eredmény: csak egész számokat hasonlítunk össze, nem karaktersorozatokat Ezáltal gyorsabb A karakterek összehasonlítása csak nagyon ritkán történik meg Egyszerre több számmal is összehasonlíthatjuk a hashelés során kapott értékeket, ha több mintát is keresünk
Boyer-Moore algoritmus Működése meglepő Visszafele keres Nagy ugrásokkal halad Kevés összehasonlítást végez Főleg akkor hasznos, ha a mintában sok az ismétlődő karakter
Boyer-Moore algoritmus - - - - - - - X - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N - - - - - - - - A N P A N M A N
Boyer-Moore algoritmus Az algoritmus a tényleges keresés előtt legenerál számára hasznos táblákat Rossz karakter eltolási tábla Milyen messze van a minta jobb szélétől a legutolsó, karakter Jó végződés eltolási tábla Mennyit kell lépni ahhoz, hogy olyan hlyet találjunk, ahol már lehet mintára illeszkedés
Boyer-Moore algoritmus 1. tábla Karakter Távolság A 1 M 2 N 3 P 5 Minden más karakter 8
Boyer-Moore algoritmus 2. tábla i Minta Eltolás 0 (N) 1 1 (A)N 8 2 (M)AN 3 3 (N)MAN 6 4 (A)NMAN 6 5 (P)ANMAN 6 6 (N)PANMAN 6 7 (A)NPANMAN 6 Megjegyzés: (*) olyan karaktert jelöl, ami nem *
Boyer-Moore-Horspool algoritmus Az előzőnek egy egyszerűsített változata A második táblát nem használja Helyzettől függően kicsit lassabban állapítja meg, mennyit kell lépnie A sebessége nagyjából megegyezik a Boyer- Moore algoritmuséval Csak nagyon ritka esetben lassul be ahhoz képest
Zhu-Takaoka algoritmus Boyer-Moore algoritmus átdolgozása Két karaktert dolgoz fel egyszerre Gyorsabb a kiértékelés Ugrási táblák létrehozása viszont lassabb, ezek nagyon megnőhetnek Értelmes használni, ha: Kevés eleme van az ábécének Rövid a keresendő minta Lehetne folytatni 3 vagy több karakteres bontásban is
Aho-Corasick algoritmus A keresendő minták szótára alapján generál egy gráfot, milyen karakter esetén mit kell tennie Hasznos, ha több szövegben is kell ugyan azokat a mintákat megkeresni Elég egyszer legenerálni Erre épül az fgrep parancs Unix környezetben
Útvonal () - Aho-Corasick algoritmus Szótár {a, ab, bc, bca, c, caa} Szerepel-e a szótárban? (a) + () (ab) + (b) (b) - () Végződés (bc) + (c) (bca) + (ca) (a) (c) + () (ca) - (a) (a) (caa) + (a) (a) Közvetlen végződés
Aho-Corasick algoritmus Gráf csúcsa Maradék Kimenet: helyzet abccab elemzése Átmenet () abccab Indulás a gyökérből Kimenet (a) bccab a:1 () -> (a) Aktuális csúcs (ab) ccab ab:2 (a) -> (ab) Aktuális csúcs (bc) cab bc:3, c:3 (ab) -> (b) -> (bc) Aktuális csúcs, szótári végződés csúcs (c) ab c:4 (bc) -> (c) -> () -> (c) Aktuális csúcs (ca) b a:5 (c) -> (ca) Szótári végződés csúcs (ab) ab:6 (ca) -> (a) -> (ab) Aktuális csúcs
Mintaillesztő algoritmusok Köszönöm a figyelmet! Ölvedi Tibor OLTQAAI.ELTE