Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

11 Knuth-Morris-Pratt algoritmus KMP féle sztringkereső algoritmus Szükséges matematikai fogalmak:  Legyen Ω egy ábécé és x=x 1 x 2 …x n, k ∈ N karakterekből.

Hasonló előadás


Az előadások a következő témára: "11 Knuth-Morris-Pratt algoritmus KMP féle sztringkereső algoritmus Szükséges matematikai fogalmak:  Legyen Ω egy ábécé és x=x 1 x 2 …x n, k ∈ N karakterekből."— Előadás másolata:

1 11 Knuth-Morris-Pratt algoritmus KMP féle sztringkereső algoritmus Szükséges matematikai fogalmak:  Legyen Ω egy ábécé és x=x 1 x 2 …x n, k ∈ N karakterekből álló sztring, melynek elemei (x i ) az Ω ábécé betűi.  Az x sztringnek u-val jelölt részsztringjét x prefixének nevezzük, ha u=x 1 …x b, 0<=b<=k.  Az x sztringnek u-val jelölt részsztringjét x suffixének nevezzük, ha u=x k-b+1 …x k, 0<=b<=k.  Az x-nek egy u prefixet vagy suffixet valódi prefixnek ill. valódi suffixnek nevezzük, ha u≠x, azaz ha b

2 22 Knuth-Morris-Pratt algoritmus Példa X=abacab  6 db valódi prefixe van: ε, a, ab, aba, abac, abaca  6 db valódi suffice van: ε, b, ab, cab, acab, bacab  Borderek: ε, ab Az üres sztring (ε), minden legalább 1 hosszúságú Ω ábécé feletti sztringnek bordere. Ugyanakkor ε-nak nincs bordere. 19:12:00

3 33 Knuth-Morris-Pratt algoritmus Az alapsztringben megtartjuk azt a pozíciót, amelyen áll. A mintát pedig úgy toljuk arrébb, hogy a pozíciónktól balra továbbra is fennálljon az egyezés. Mekkora legyen a léptetés? A bacbababaabcbab ↕↕↕↕↕↕ P ababaca 19:12:00

4 44 Knuth-Morris-Pratt algoritmus ababaca, ababaca, ababaca, ababaca ababaca, ababaca, ababaca Megoldás:  A minta léptetésének mértékét a minta egyező prefixenek a legszélesebb bordere határozza meg. Ebben a példában az egyező prefix hossza 5. Ennek a leghosszabb bordere pedig 3. A léptetés teljes mértéke 5-3=2.  Előfordulhat, hogy ezután sem lesz egyezés. Ekkor még inkább jobbra kell a mintát csúsztatni. Újabb egyező bordereket keresve. (Újabb léptetések: 3-2=1, ill. 1-0=1.) 19:12:00

5 5 KMP és mezítlábas algoritmusok A bacbababaabcbab ↕ P ababaca 1 A bacbababaabcbab ↕ P ababaca 1 A bacbababaabcbab ↕↕ P ababaca 1+2 A bacbababaabcbab ↕↕ P ababaca 1+2 A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕↕↕↕↕↕ P ababaca A bacbababaabcbab ↕↕↕↕↕↕ P ababaca A bacbababaabcbab P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕↕↕↕ P ababaca A bacbababaabcbab P ababaca A bacbababaabcbab ↕ P ababaca A bacbababaabcbab ↕ P ababaca =13 A bacbababaabcbab ↕↕ P ababaca =19 A bacbababaabcbab ↕↕↕↕↕↕ P ababaca A bacbababaabcbab ↕↕↕↕↕↕ P ababaca :12:00

6 66 Knuth-Morris-Pratt algoritmus Legyen x egy hosszú sztring. Legyen az x sztringnek r is és s is egy bordere, úgy hogy |r|<|s|. x=abacabacaba s=abacaba r=aba Ekkor belátható, hogy r bordere az s-nek is:  r prefixe volt x-nek, a hosszuk miatt (|r|<|s|) látható, hogy s-nek is.  A suffixre ez hasonlóan belátható. Ha s a legszélesebb bordere x-nek, akkor az x következő (második legszélesebb) bordere az s legszélesebb bordere lesz. 19:12:00

7 77 Knuth-Morris-Pratt algoritmus A minta egy x prefixének az r bordere, néha bővíthető az a karakterrel úgy, hogy ra bordere xa-nak. (Ha szerencsénk van, a minta a-val folytatódik.) abacababadabacabaca Könnyű belátni, hogy amennyiben r a legszélesebb bordere volt x-nek, akkor ra is a legszélesebb bordere lesz xa-nak. Az algoritmus előfeldolgozási szakaszában egy m+1 elemű következő névvel ellátott tömböt számítunk ki. A tömb KÖV[i] eleme (i-edik eleme) a minta sztring i hosszúságú prefixéhez tartozó legszélesebb border hossza. i=0,..,m. 19:12:00

8 88 Knuth-Morris-Pratt algoritmus Mivel a 0 hosszúságú üres sztringnek nincs bordere, a KÖV[0]=-1 lesz. (Most 0-val kezdődnek az indexek.) m értéke mindig a mintasztring hossza. Például, ha a számítás során már meghatároztuk a KÖV tömb 0-ás indexű elemét, és még néhány további elemét az i.-ig: KÖV[0],…,KÖV[i], és most meg szeretnénk határozni a következő elemet: KÖV[i+1]. Meg kell nézni, hogy a mintának a p 1 …p i prefixének egy bordere bővíthető-e az előbbi módon a minta következő, p i+1 -edik karakterével. abacababadabacabaca 19:12:00

9 99 Knuth-Morris-Pratt algoritmus 1 :abacababadabacabaca, 11 :abacababadabacabaca 2 :abacababadabacabaca, 12 :abacababadabacabaca 3 :abacababadabacabaca, 13 :abacababadabacabaca 4 :abacababadabacabaca, 14 :abacababadabacabaca 5 :abacababadabacabaca, 15 :abacababadabacabaca 6 :abacababadabacabaca, 16 :abacababadabacabaca 7 :abacababadabacabaca, 17 :abacababadabacabaca 8 :abacababadabacabaca, 18 :abacababadabacabaca 9 :abacababadabacabaca, 19 :abacababadabacabaca 10 :abacababadabacabaca A bővítés akkor tehető meg, ha p köv[i]+1 =p i+1. A bordereket KÖV [i], KÖV[KÖV[i]], … behelyettesítve egyre mélyebben a KÖV értékeket, csökkenő sorrendjükben kell megvizsgálni. Ha a border nem bővíthető egy kisebb bordert veszünk veszünk, hátha az bővíthető. Ha az sem, akkor egy mégkisebbet, szűkebbet és így tovább. 19:12:00

10 10 Előfeldolgozó ciklus pszeudo-kódja Function KÖVFELTÖLT(P) 1. m  hossz(P) 2. i  0 3. j  KÖV[0]  While i

11 11 KMP előfeldolgozó algoritmus Olyan ciklust tartalmaz, amelyben egy j változó rendre felveszi a KÖV tömb eggyel csökkenő indexű értékeit, addig amíg az értéke -1-re nem csökken. Egy j szélességű border bővíthető lesz a p i+1 -s karakterrel, ha a p j+1 =p i+1 Ha bővíthető volt a border tovább léptetjük a változókat, majd a KÖV tömb aktuális elemének értékül adjuk a j-t (border hosszát). Ha nem, a j változónak új értéket adunk. 19:12:00

12 12 KMP algoritmus pszeudo-kódja Function KMP(A,P) 1. n  hossz(A) 2. m  hossz(P) 3. KÖV  KÖVFELTÖLT(P) 4. i  j  0 5. KÖV[0]  While i

13 13 Knuth-Morris-Pratt algoritmus A borderek vizsgálata akkor ér véget, ha már nincs bővíthető border (j értéke -1). Ha a j változót növeltük, akkor p 1 …p i+1 prefix legszélesebb bordere j hosszúságú. Példa: p=abacababadabacabaca 19:12:00

14 14 Knuth-Morris-Pratt algoritmus Ha eltérést talál az algoritmus a j+1-edik pozíción, a továbbiakban a minta j hosszúságú, illeszkedő prefixének a legszélesebb borderét vizsgáljuk. (Ennek hossza: KÖV[j]). Úgy léptetjük a mintát, hogy ez a border továbbra is illeszkedjen az alapsztring már ellenőrzött részére. A léptetés mértéke: j-KÖV[j]. Ha még mindig eltérés van, a következő bordert vizsgáljuk, addig amíg el nem fogy a border (j=-1), vagy a j+1-edik helyen egyezés van, és a ciklus folytatódhat. A bacbababaabcbab ↕↕↕↕↕↕ P ababaca 19:12:00

15 15 Knuth-Morris-Pratt algoritmus Ha a minta minden karaktere (m db) illeszkedik az alapsztring megfelelő részére (j=m, 14-dik sor), akkor i-m+1-et adja (az illeszkedés következő indexét). Az összehasonlítások során az alapsztringben soha nem vizsgál meg újra a korábban már vizsgált karaktereket (i-t nem csökkenti), szemben a mezítlábas algoritmussal. j változó csökkentésének felső korlátja m (a minta hossza) 19:12:00

16 16 Shift-And (Dömölki-féle) algoritmus (Dömölki Bálint formális nyelvekkel foglalkozott). Később publikálták az algoritmust Baeza és Yates. (Dömölki-alg., Baeza-Yates- alg.) Az algoritmus alapötlete: Legyen p a minta sztringünk, amelynek hossza m. Vegyünk egy m elemű D vektort, amelynek a j-edik eleme 1 értékű, akkor, és csak akkor, ha a minta első j karaktere (p 1 …p j ) szuffixe az alapsztring első i karakterének (a 1 …a i ), egyébként pedig nulla. 19:12:00

17 17 Shift-And (Dömölki-féle) algoritmus Ha a p minta mérete kisebb mint a számítógép processzorának szóhossza, akkor ez a vektor a processzor egy regiszterében is tárolható. (Ilyenkor a későbbi keresés ezzel gyorsítható.) Tegyük fel, hogy az alapsztringet már megvizsgáltuk az i-edik karakteréig, és most olvassuk az i+1-edik karaktert. Ehhez egy új D’- vel jelölt vektort kell meghatározni. 19:12:00

18 18 Shift-And (Dömölki-féle) algoritmus Megfigyelés: A D’ vektor j+1-edik elemének értéke akkor és csak akkor lesz egy, ha  egyrészt a D vektor j-edik eleme 1-es volt, vagyis p 1 …p j szuffixe volt a 1 …a i -nek,  másrészt, a i+1 =p j+1,azaz a soron következő karaktere megegyezik a minta soron következő karakterével. Két része van az algoritmusnak: előfeldolgozás és keresés. 19:12:00

19 19 Shift-And (Dömölki-féle) algoritmus Előfeldolgozás: Fel kell építeni egy 2 dimenziós B bitmátrixot. Ennek a mátrixnak az oszlopait (m db van belőlük) a minta karaktereivel címkézzük fel, a sorait pedig az ábécé egymástól különböző karaktereivel címkézzük. A sorok címkéi között nem lehet egyforma, de az oszlopoknál igen. A mátrixban egy elem értéke 1-es, ha a sorának és oszlopának az értéke megegyezik, és nulla egyébként. 19:12:00

20 20 Shift-And (Dömölki-féle) algoritmus További 3 db m elemű segédvektor is kell, amelyeket a következő kezdőértékkel látunk el: D segédvektort kezdetben csupa nulla értékkel töltjük fel. Az U segédvektor legelső eleme 1, a többi 0, és végül a V segédvektor utolsó, azaz m-edik eleme 1 és a többi 0. Az algoritmus egy „eltoló” (shift) műveletet is fog még alkalmazni: SHIFT(X)=SHIFT(x 1,x 2,…x m )=(0,x 1,…,x m-1 ). Jobbra tolás: balról bejön egy nulla, jobboldalt az utolsó elem eltűnik. 19:12:00

21 21 Shift-And (Dömölki-féle) algoritmus Algoritmus: a sztringet karakterenként vizsgálja, és minden a i karakterenként a D vektort frissiti a következő formula felhasználásával: D’=(SHIFT(D) ٧ U) ٨ B a i Ha a keresés során az i-edik karakter feldolgozásakor teljesül D ٨ V ≠(0,….,0,0,0), akkor megtaláltuk p egy előfordulását a-ban. p első karaktere a i-m+1-edik karakterére illeszkedik. V=(0,0,0,…,0,0,1) 19:12:00

22 Shift-And (Dömölki-féle) algoritmus iaiai D(régi)Shift(D)Shift(D) ٧ UBaiBai D(új) 1a(0,0,0,0) (1,0,0,0)(1,0,1,0)(1,0,0,0) 2t (0,1,0,0)(1,1,0,0)(0,1,0,1)(0,1,0,0) 3a (0,0,1,0)(1,0,1,0) 4c (0,1,0,1)(1,1,0,1)(0,0,0,0) 5g (1,0,0,0)(0,0,0,0) 6a (1,0,0,0)(1,0,1,0)(1,0,0,0) 7t (0,1,0,0)(1,1,0,0)(0,1,0,1)(0,1,0,0) 8a (0,0,1,0)(1,0,1,0) 9t (0,1,0,1)(1,1,0,1)(0,1,0,1) 22 Egy Példa: a=atacgatatata p=atat B:atat a1010 t0101 * :12:00

23 23 Shift-And (Dömölki-féle) algoritmus A keresés akkor ér véget, ha a D vektor utolsó pozícióján megjelenik egy 1-es érték. A Dömölki algoritmus viszonylag gyors, a bitmátrix egyszer kerül kiszámításra, aztán bitenkénti ÉS illetve VAGY műveletek vannak csak. (Itt az a lényeg, hogy amit mi egy vektorral elvégzendő műveletsornak látunk (Shift, „vagyolás”, „éselés”), az valójában a számítógépnek egy, vagy két változóval történő egyetlen elemi művelet elvégzését jelenti.) De még mindig lehet javítani ezen az algoritmuson is. 19:12:00

24 24 SHIFT-OR-Algoritmus A SHIFT-AND algoritmusnál az 1-es bit sorra vándorolt az utolsó pozícióig. A Shift-Or algoritmus 0-s bittel éri el ugyanezt, mindent a fordítottjával jelöl. A vektorok is fordított bitekkel szerepelnek majd (D,V vektorok). A „vagyolás” kimaradhat, vagyis egy művelettel kevesebbet kell végrehajtani. (Az első „vagyolás” maradhat el, mivel nincs U tömb, az „éselés” pedig „vagyolás” lesz: itt ezt az egy műveletet kell elvégezni.) 19:12:00

25 25 SHIFT-OR-Algoritmus Változások a SHIFT-AND algoritmushoz képest: SHIFT(x 1,x 2,…x m )=(0,x 1,…,x m-1 ) B: negáció, 0: ha a sor és az oszlop cimkéi megegyeznek. U: nincs, megszűnik V: negáció  V=(1,1,…,1,0) Az algoritmus lépései módosulnak: D’=SHIFT(D) ٧ B ai Az U-t megspóroljuk, mert (0,1,…,1) csak 0-ra állítja az első bitet, ami amúgy is nulla, így ez a vektor és ez a lépés felesleges. 19:12:00

26 26 Több minta egyidejű illesztése A Shift-And-algoritmussal egyszerre több mintát is kereshetünk az alapsztringben. (A Shift-Or-ral nem lehet egyszerre több mintát vizsgálni, kivéve ha viszavesszük az U vektort.) A B bitmátrixot ki kell egészíteni  Sorai ugyanazok  Az oszlopai kiegészülnek a többi minta karaktereivel  Kitöltése ugyanúgy történik D, U és V is változik:  U=(1,0,…,0,0|1,0,…,0,0|…)  V=(0,0,…,0,1|0,0,…,0,1|…) 19:12:00

27 27 Több minta egyidejű illesztése Példa: a=atacgatatata p1=atat p2=gat p3=tata B: | atat gat tata a | t | g | * | U=(1,0,0,0|1,0,0|1,0,0,0) V=(0,0,0,1|0,0,1|0,0,0,1) D=(0,0,0,0|0,0,0|0,0,0,0) SHIFT(D) ٧ U=(1,0,0,0|1,0,0|1,0,0,0) (SHIFT(D) ٧ U) ٨ B a 1 =(1,0,0,0|0,0,0|0,0,0,0) 19:12:00

28 28 Minta illesztő algoritmusok Sok sztringkezelő algoritmus létezik még. Olyanok is vannak, amelyek összetett mintákát is tudnak illeszteni. Pl. „ab*c?d(.e)+f”  *: tetszőleges számú (0 vagy több) előfordulás,  +: 1 vagy több előfordulás,  ?: 0 vagy 1 előfordulás, .: tetszőleges karakter Igy a fenti minta illeszkedik az alábbi alapsztringekre: „fgabbbdreefad”, „rtacdhejefr”, „sabbbcdeenefh”, „addef” de nem illeszkedik az alábbiakra: „abbckld”, „acdbf”, „cvfdcd” 19:12:00


Letölteni ppt "11 Knuth-Morris-Pratt algoritmus KMP féle sztringkereső algoritmus Szükséges matematikai fogalmak:  Legyen Ω egy ábécé és x=x 1 x 2 …x n, k ∈ N karakterekből."

Hasonló előadás


Google Hirdetések