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

KMP (mintaillesztés) Gubicza József (GUJQAAI.ELTE)

Hasonló előadás


Az előadások a következő témára: "KMP (mintaillesztés) Gubicza József (GUJQAAI.ELTE)"— Előadás másolata:

1 KMP (mintaillesztés) Gubicza József (GUJQAAI.ELTE)

2 Az algoritmus 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ő prefixel kell odébb tolni a mintát, az „elromlott” karakterhez. Példa: B C B C D B C B C B C D B C B C D Szöveg: Minta:

3 Az algoritmus 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)

4 Az initnext eljárás Az initnext gyakorlatilag a minta elcsúsztatott keresését hajtja végre önmagán (KMP algoritmussal), és közben eltárolja a legnagyobb illeszkedő részek hosszát.

5 Initnext A B B A B C Mi a leghosszabb prefix, a mintában a második karakterig tekintve? Mivel a prefix legalább 1 hosszú kell legyen, így az a kérdés, hogy M[1] = M[2] ? A B B A B C M[1] != M[2] Next[2] = ?Next[2] = 0 Next[1] = 0

6 Initnext A B B A B C M[1] != M[2] Mi a leghosszabb prefix az első 3 karakterig tekintve? Mivel M[1] != M[2] => M[1..2] != M[2..3] Így 2 hosszú prefix nincs. Így az maradt a kérdés, hogy van-e egy hosszú prefixünk? Mivel tudjuk, hogy M[1] != M[2], így eltolva az alsó mintát a harmadik karakter alá, láthatjuk, hogy M[1] != M[3]. Így.. Next[2] = 0 Next[3] = ?Next[3] = 0M[1] != M[3] Next[1] = 0

7 Next[3] = 0 Initnext A B B A B C M[1] != M[2] Mi a leghosszabb prefix az első 4 karakterig? [Felhasználva a táblázatban levő egyenlőtlenségeket.] (3 hosszú prefix?) M[1]!=M[2] => M[1..3] != M[2..4] (2 hosszú prefix?) M[1]!=M[3] => M[1..2] != M[3..4] 1 hosszú prefix vizsgálatánál, már M[1]-et nem kell M[2] és M[3]-al összehasonlítani Így… Next[2] = 0 Next[4] = ? M[1] != M[3] A B B A B C M[1] = M[4]Next[4] = 1 Next[1] = 0

8 Next[4] = 1 Next[3] = 0 Initnext A B B A B C M[1] != M[2] Mi a leghosszabb prefix az első 5 karakterig? [Felhasználva a táblázatban levő egyenlőtlenségeket.] (4 hosszú prefix?) M[1]!=M[2] => M[1..4] != M[2..5] (3 hosszú prefix?) M[1]!=M[3] => M[1..3] != M[3..5] 2 hosszú prefix? Next[2] = 0 Next[5] = ? M[1] != M[3] A B B A B C M[1] = M[4] Next[5] = 2 Next[1] = 0

9 Folytatás Ezzel elkészült a next vektorunk! Értékeit felhasználva, mostmár elkezdhetünk az algoritmuson is dolgozni. S lesz a szöveg (hossza n), M a minta (hossza m), i és j az algoritmusban szereplő indexek, valamint szem előtt tartjuk az előbb kapott next értékeit.

10 A KMP algoritmus

11 IJS:D A B B A B A B B A B C(->n = 12) M: A B B A B C(->m = 6) D A B B A B A B B A B C Next[1..3] = 0 Next[4] = 1 Next[5] = 2 A B B A B C Ezen a ponton, j := next[5], j értéke így 2 lesz! 6262 A vizsgált értékek: i+1 és j+1 Tehát most megnézzük, hogy S szöveg első karaktere megegyezik e, M minta első karakterével Most pedig azt nézzük, hogy a szöveg második karaktere, megegyezik-e a minta első karakterével (csúsztatunk).

12 D A B B A B A B B A B C IJ S:D A B B A B A B B A B C(->n = 12) M: A B B A B C(->m = 6) Next[1..3] = 0 Next[4] = 1 Next[5] = 2 A B B A B C Ezen a ponton, j := next[2], j értéke így 0 lesz! 6060 A B B A B C Ha j = m, legyen k := i – (m-1) = 12 – 5 = 7 u := igaz Tehát találtunk (ezt u jelzi) a mintára illeszkedő szövegrészt, mégpedig a 7. pozíciótól


Letölteni ppt "KMP (mintaillesztés) Gubicza József (GUJQAAI.ELTE)"

Hasonló előadás


Google Hirdetések