32. A Knuth-Morris-Pratt algoritmus

Hasonló dokumentumok
MINTAILLESZTÉS Brute-Force algoritmus (BF) Knuth-Morris-Pratt algoritmus (KMP) Quick-Search algoritmus (QS)

Szövegfeldolgozás II.

Mintaillesztő algoritmusok. Ölvedi Tibor OLTQAAI.ELTE

Knuth-Morris-Pratt algoritmus

35. MINTAILLESZTÉS AUTOMATÁVAL

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

LINEÁRIS PROGRAMOZÁSI FELADATOK MEGOLDÁSA SZIMPLEX MÓDSZERREL

Nagyságrendek. Kiegészítő anyag az Algoritmuselmélet tárgyhoz. Friedl Katalin BME SZIT február 1.

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Programozási segédlet

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

Fourier transzformáció

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

Gráfelméleti feladatok. c f

Adatszerkezetek II. 10. előadás

Függvények növekedési korlátainak jellemzése

Diszkrét matematika 2.

Minden egész szám osztója önmagának, azaz a a minden egész a-ra.

ELEMI PROGRAMOZÁSI TÉTELEK

9. Előadás. Megyesi László: Lineáris algebra, oldal. 9. előadás Mátrix inverze, mátrixegyenlet

Függvény határérték összefoglalás

19. AZ ÖSSZEHASONLÍTÁSOS RENDEZÉSEK MŰVELETIGÉNYÉNEK ALSÓ KORLÁTJAI

Algoritmusok és adatszerkezetek 2.

Számelméleti alapfogalmak

First Prev Next Last Go Back Full Screen Close Quit

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

1. tétel. 1. Egy derékszögű háromszög egyik szöge 50, a szög melletti befogója 7 cm. Mekkora a háromszög átfogója? (4 pont)

9. Trigonometria. I. Nulladik ZH-ban láttuk: 1. Tegye nagyság szerint növekvő sorrendbe az alábbi értékeket! Megoldás:

ismertetem, hogy milyen probléma vizsgálatában jelent meg ez az eredmény. A kérdés a következő: Mikor mondhatjuk azt, hogy bizonyos események közül

Maple: Deriváltak és a függvény nevezetes pontjai

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Operációs rendszerek. 10. gyakorlat. AWK - bevezetés UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Algoritmusok bonyolultsága

Az Országos Középiskolai Tanulmányi Verseny tanévi első fordulójának feladatmegoldásai

6. Függvények. 1. Az alábbi függvények közül melyik szigorúan monoton növekvő a 0;1 intervallumban?

Diszkrét matematika 2.C szakirány

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

11. Előadás. 11. előadás Bevezetés a lineáris programozásba

9. Előadás. Megyesi László: Lineáris algebra, oldal. 9. előadás Mátrix inverze, Leontyev-modell

Programozási módszertan. Dinamikus programozás: A leghosszabb közös részsorozat

ALAPFOGALMAK 1. A reláció az program programfüggvénye, ha. Azt mondjuk, hogy az feladat szigorúbb, mint az feladat, ha

Adatbázisok elmélete 12. előadás

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Láncolt listák Témakörök. Lista alapfogalmak

Diszkrét matematika 2.C szakirány

f(x) vagy f(x) a (x x 0 )-t használjuk. lim melyekre Mivel itt ɛ > 0 tetszőlegesen kicsi, így a a = 0, a = a, ami ellentmondás, bizonyítva

Országos Középiskolai Tanulmányi Verseny 2009/2010 Matematika I. kategória (SZAKKÖZÉPISKOLA) 2. forduló feladatainak megoldása

KOVÁCS BÉLA, MATEMATIKA I.

Rekurzió. Dr. Iványi Péter

OSZTHATÓSÁG. Osztók és többszörösök : a 3 többszörösei : a 4 többszörösei Ahol mindkét jel megtalálható a 12 többszöröseit találjuk.

L'Hospital-szabály március 15. ln(x 2) x 2. ln(x 2) = ln(3 2) = ln 1 = 0. A nevez határértéke: lim. (x 2 9) = = 0.

8. Előadás. Megyesi László: Lineáris algebra, , oldal. 8. előadás Mátrix rangja, Homogén lineáris egyenletrendszer

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Kétfázisú szimplex algoritmus és speciális esetei

3. előadás. Programozás-elmélet. A változó fogalma Kiterjesztések A feladat kiterjesztése A program kiterjesztése Kiterjesztési tételek Példa

Vektorgeometria (1) First Prev Next Last Go Back Full Screen Close Quit

Formális nyelvek és automaták

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

Exponenciális, logaritmikus függvények

Az egydimenziós harmonikus oszcillátor

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Megoldások. alapfüggvény (ábrán: fekete)

Hadamard-mátrixok Előadó: Hajnal Péter február 23.

Adatbázis rendszerek Gy: Algoritmusok C-ben

Infobionika ROBOTIKA. X. Előadás. Robot manipulátorok II. Direkt és inverz kinematika. Készült a HEFOP P /1.0 projekt keretében

Csima Judit október 24.

Szögfüggvények értékei megoldás

Sorozatok és Sorozatok és / 18

Egybevágóság szerkesztések

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

Formális nyelvek és automaták

Bevezetés az informatikába

Konjugált gradiens módszer

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Arany Dániel Matematikai Tanulóverseny 2008/2009-es tanév első (iskolai) forduló haladók II. kategória

Nagy Gábor compalg.inf.elte.hu/ nagy

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

Diszkrét matematika 2. estis képzés

Függvények határértéke, folytonossága

1 Lebegőpontos számábrázolás

Többváltozós, valós értékű függvények

Shannon és Huffman kód konstrukció tetszőleges. véges test felett

Fibonacci számok. Dinamikus programozással

15. A VERSENYRENDEZÉS

Funkcionálanalízis. n=1. n=1. x n y n. n=1

Számítási feladatok a Számítógépi geometria órához

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

6. Függvények. Legyen függvény és nem üreshalmaz. A függvényt az f K-ra való kiterjesztésének

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Dinamikus programozás II.

Diszkrét matematika 2. estis képzés

Számelmélet (2017. február 8.) Bogya Norbert, Kátai-Urbán Kamilla

KOVÁCS BÉLA, MATEMATIKA I.

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

6. Előadás. Megyesi László: Lineáris algebra, oldal. 6. előadás Bázis, dimenzió

I.5. A LOGIKAI FÜGGVÉNYEK EGYSZERŰSÍTÉSE (MINIMALIZÁCIÓ)

Átírás:

32. A Knuth-Morris-Pratt algoritmus A nyers erőt használó egyszerű mintaillesztés műveletigénye legrosszabb esetben m*n-es volt. A Knuth-Morris-Pratt algoritmus (KMP-vel rövidítjük) egyike azon mintaillesztő eljárásoknak, amelyek ügyes észrevételek és mélyebb megfontolások alapján hatékonyabb módon oldják meg az stringkeresés feladatát. 32.1. Az algoritmus elve Amikor az egyszerű mintaillesztés során az illeszkedés elromlott, a mintát egy pozícióval eltoltuk és az elejétől újra kezdtük a minta és a lefedett szövegrész összehasonlítását. Nem biztos azonban, hogy a már megvizsgált szövegrész minden karakterén újra át kell haladni. Amennyiben az illeszkedés elromlik, akkor egy hibás kezdetünk van, de ez a kezdet ismert, mivel az elromlás előtti karakterig egyezett a mintával. Ezt az információt használjuk fel arra, hogy elkerüljük az állandó visszalépést a szövegben a minta kezdetére. Tekintsük a 32.1. ábrán látható illeszkedési feladatot. 32.1. ábra. Példa illeszkedésvizsgálatra (KMP) A példában a minta 6. pozíciójánál romlik el az illeszkedés, hiszen a minta első 5 pozíciója illeszkedett. Kérdés, hogy hová pozícionálhatjuk a mintát a szövegben, és honnan vizsgáljuk tovább az illeszkedést, hogy a minta előfordulását megtaláljuk (ha létezik, át ne "ugorjuk") és az eddig megszerzett 5 illeszkedő karakternyi információt felhasználjuk. Látható, hogy a minta illeszkedő részének ( M [1..5] ) van olyan valódi kezdőszelete (valódi prefixe), amely egyezik ezen illeszkedő rész egy valódi végszeletével (valódi szuffixével), hiszen M[ 1..3] M[3..5] ('ABA' = 'ABA'). A vizsgálatot ezért úgy is folytathatjuk, hogy a kezdőszelete rátoljuk a vele megegyező végszeletre, ahogyan a 32.2. ábrán látható. 32.2. ábra. A minta megfelelő eltolása (KMP) (A továbbiakban inkább a karakterisztikusabb pefix és szuffix kifejezéseket használjuk a leírásban.) Egy prefix vagy szuffix valódi, ha hossza legalább 1, és kisebb, mint annak a sorozatnak a hossza, amelynek a prefixe vagy szuffixe. Amennyiben a mintával akkorát ugrunk, hogy a minta eleje az említett szuffixnél kezdődjön, azaz az prefix a vele egyező szuffixszel kerüljön fedésbe, a prefixet már nem kell újra vizsgálni, mivel az azonos a szuffixel, ami megegyezik a szöveg lefedett részével, mivel az részsorozata az eredetileg illeszkedő M [ 1..5] k 5] szövegrésznek. Ezek után az illeszkedés vizsgálatot a szöveg "elromlott" S [ k 6] karakterével, és az említett prefix utáni első karakterrel lehet tovább folytatni. Mi a teendő több ilyen egyező prefix és szuffix pár esetén? A példában is találhatunk egy másik párost, az M[ 1..1] M[5..5] ('A'='A'). Ha annak megfelelően pozícionáljuk a mintát, ahogyan a 32.3. ábra is mutatja, majd a következő karaktertől kezdünk összehasonlítani, azt tapasztaljuk, hogy nem illeszkedik a minta a szövegre, mert "átugrottunk" egy illeszkedést.

32.3. ábra. Nem megfelelő eltolás több egyező prefix és suffix pár esetén Tehát a legkisebb olyan ugrást kell választanunk, ahol a minta egy prefixe illeszkedik a részsorozat egy szufixére. Akkor "ugrunk" a legkisebbet, ha a legnagyobb ilyen prefixet választjuk. 32.2. Az algoritmus helyessége M[1..5] részsorozatának Ahhoz, hogy az algoritmus helyességét belássuk, a következő kérdéseket kell tisztáznunk. Tegyük fel, hogy a minta részsorozata illeszkedett a szöveg S[ k 1.. részsorozatára és az illeszkedés a következő pozíción romlott el, azaz M[ 1.. j] M [ 1.. j] és M[ j 1] k j 1] 1. Ha létezik részsorozatnak olyan valódi prefixe ( p M[ 1.. x] ) és szuffixe ( s M[ j]), hogy, akkor valóban állítható-e, hogy az ugrás után biztosan nem kell újra vizsgálni az M [ 1.. x] és az általa lefedett S[ k szövegrészt? M[ 1.. j] p s Biztosan nem kell, mivel p s, azaz M[ 1.. x] M[ j], továbbá az illeszkedés az M [ j 1] pozíción romlott el, tehát M[ 1.. j], és ezek tetszőleges, jelenleg fedésben lévő részsorozatai is azonosak, azaz S[ k M[ j] M[ 1.. x] k. Érvelésünket alátámasztja a 32.4. ábra. 32.4. ábra. Példa egyező valódi prefix-szuffix párosra 2. Mit tegyünk, ha nincs ilyen egymással megegyező valódi prefix-szuffix páros? Mivel M [ 1.. j] illeszkedett és M [ j 1] k j 1], i ( k i k j) eltolásra a minta biztosan nem fog illeszkedni. Ahogyan a 32.5. ábrán is látszik, ahhoz hogy ilyen i eltolással illeszkedjen, az kellene, hogy legyen legalább 1 hosszú valódi, egymással azonos prefixszuffix páros ( p s ), mert az M[ 1.. x] k részsorozatoknak illeszkedniük kell (ekkor i k j x ) ahhoz, hogy teljes illeszkedés lehessen. Ebből pedig következik, hogy M[ 1.. x] M[ j], mivel M[ 1.. j].

(Beláttuk tehát, hogy az M[ 1.. j] feltétel esetén, az i ( k i k j) érvényes eltolás szükséges feltételét is.) Tehát a mintával "átugorhatjuk" a már vizsgált S[ k 1.. részt, és az illesztést a minta elejétől és a szöveg S [ k j 1] pozíciójától újra kezdhetjük. Ezt a konklúziót a 32.5. ábra is alátámasztja. 32.5. ábra. Példa nem egyező valódi prefix-szuffix párra 3. Mit tegyünk, ha több ilyen egymással megegyező, valódi prefix-szuffix páros is van? Ha több ilyen prefix-szuffix páros is van, akkor a leghosszabbat kell venni, mert ekkor "ugrunk" a legkisebbet. Ilyenkor nem fordulhat elő, hogy átugrunk egy előfordulást. Definiáljuk a next függvényt, amely megadja a minta egyes kezdőrészleteire a leghosszabb egymással egyező prefix-szuffix párok hosszát. Ezt felhasználva meg tudjuk adni a mintával való "ugrás" mértékét. j [1.. m 1]: next(j) max{h [0.. j 1]}, ahol M[1.. h] = M[j h + 1.. j] A next függvénnyel kapcsolatban a következő megjegyzéseket tesszük. A next értelmezési tartományát elegendő ( m 1)-ig definiálni, mert ha ( j m )-ig illeszkedik a minta, akkor találtunk egy érvényes eltolást, tehát készen vagyunk, és nem kell a mintával tovább lépkednünk. A h = 0 legkisebb értékét, akkor veszi fel a függvény, ha nincs a minta M [ 1.. j] kezdőszeletében egymással megegyező, valódi prefix-szuffix páros. Továbbá, ha létezik ilyen prefix-szuffix páros, az attól lesz valódi, hogy a hosszát ( )-gyel felülről korlátozzuk. j 1 A next függvény csak a mintától függ, így értékeit a minta ismeretében a keresés előtt kiszámíthatjuk, és eltárolhatjuk egy next [ 1.. m 1] vektorban. 32.3. A KMP algoritmus A minta elejétől kezdjük összehasonlítani a szöveg és a minta egymással fedésben lévő karaktereit. Amennyiben a szöveg és minta karakterei azonosak, akkor a szövegben és a mintában egyaránt eggyel továbblépünk. Azonban, ha a karakterek különböznek, a következőket tesszük. Ha a minta elején állunk ( j 0 esetén): a szöveg következő pozíciójától ( S [ k j 2] ) és a minta elejétől kezdve újra kezdjük az illeszkedés vizsgálatot, mivel a next függvény a valódi prefix-szuffix hosszát adja meg, de az 1 hosszú sorozatnak nincs valódi prefixe vagy szuffixe ( next [ 1] 0 ).

Ha nem a minta elején állunk ( esetén), akkor a next függvényben rögzített eltolást hajtjuk végre: azt mondjuk, hogy eddig j hosszon illeszkedett a minta, továbbiakban hosszon illeszkedik. Az összehasonlítást a minta M [ next [ j] 1] karakterétől és a szöveg S [ k j 1] karakterétől folytatjuk, azaz a szövegben onnan, ahol az illeszkedés elromlott. next[ j] j 0 Mivel a szövegben legfeljebb 1 hosszú lépésekkel haladunk végig, az egyszerűség kedvéért a k eltolásnak megfelelő változó helyett használjunk egy i változót, amellyel a szövegben szekvenciálisan haladunk ( ), majd az algoritmus végén beállítjuk a k változó értékét. A KMP algoritmus a 32.6. ábrán látható. i k j 32.6. ábra. A KMP algoritmus Az initnext eljárás során töltjük fel a next vektort. A feltöltés ötlete: a minta elcsúsztatott keresése önmagán (KMP algoritmussal), miközben feljegyezzük a legnagyobb illeszkedő részek hosszát. Nézzük meg egy példán a feltöltés menetét. Legyen a minta M = 'ABABAC'. Már korábban láttuk, hogy next [ 1] 0. Ezután a next [2] értékét szeretnénk meghatározni. Ekkor az M [1..2] kezdőrészletnek keressük a legnagyobb egymással megegyező, valódi prefix-szuffix párját. A legnagyobb ilyen valódi prefix-szuffix 1 hosszúságú lehet. Tehát az a kérdés, hogy az M[ 1] M[2] egyenlőség teljesül-e? Ehhez a mintát csúsztassuk el eggyel, és a fedésben lévő karaktereket vizsgáljuk (lásd: 32.7. ábra): 32.7. ábra. A next vektor kiszámítása (1) Látható, hogy a két karakter nem azonos, így next [ 2] 0.

Most a meghatározása következik. Ekkor az legnagyobb egymással megegyező, valódi prefix-szuffix párját. A legnagyobb ilyen valódi prefix-szuffix 2 hosszú lehet. Azaz M[ 1..2] M[2..3] egyenlőség teljesül-e? Azonban ez nem teljesülhet, mivel már M[ 1] M[2] sem teljesült. Ezt nem is vizsgáljuk, mivel már az előző menetben sem volt egyezés. Helyette a mintát eggyel jobbra csúsztatjuk, és az M[ 1] M[3] egyenlőséget vizsgáljuk (lásd: 32.8. ábra): next[3] M[1..3] kezdőrészletnek keressük a 32.8. ábra. A next vektor kiszámítása (2) A vizsgált egyenlőség fennáll, ezért feljegyezzük, hogy next [ 3] 1. Ezután a next [4] kiszámítása a cél. Ekkor az M [1..4] kezdőrészletnek keressük a legnagyobb egymással megegyező, valódi prefix-szuffix párját. A legnagyobb ilyen valódi prefix-szuffix 3 hosszú lehetne, de M[ 1] M[2] egyenlőséget már korábban is megvizsgáltuk és nem teljesült, így ez nem jöhet szóba. Azonban, az előző menetben M[ 1] M[3] teljesült, így az ennek megfelelő elcsúsztatott pozíciót megtartva vizsgáljunk tovább, mert további karakter egyezés esetén ez lehetne a leghosszabb prefix-szuffix pár (lásd: 32.9. ábra): 32.9. ábra. A next vektor kiszámítása (3) Valóban az M[ 2] M[4] teljesül, így feljegyezzük next [ 4] 2 értéket. A next [5] meghatározásához, az előző menethez hasonlóan a mintát nem csúcstatjuk el, hanem a következő karaktert vizsgáljuk (lásd: 32.10. ábra): 32.10. ábra. A next vektor kiszámítása (4) Azt látjuk, hogy M[ 3] M[5], így feljegyezzük next [ 5] 3. Összefoglaljuk egy ábrán a next függvény kiszámítását (lásd: 32.11. ábra): 32.11. ábra. A next vektor kiszámítása (összefoglalás) A next vektor kitöltésének részletes végigkövetése után már nem nehéz felírni az initnext eljárást, amely 32.12. ábrán látható. Ezzel teljessé vált a 32.6. ábrán megadott KMP mintaillesztő algoritmus, ugyanis az inicializáló eljárását is megalkottuk.

32.12. ábra. Az initnext algoritmus (KMP) Az initnext eljárás különlegessége az, hogy a KMP mintaillesztés inicializálására szolgál, de a next vektor kitöltésére is lényegében a KMP algoritmust használjuk. Ezt az teszi lehetővé, hogy a kitöltés éppen olyan mértékben halad előre a next vektoron, mint ami a számítás továbblépéséhez szükséges, amivel egy saját belső inicializáló eljárást valósítunk meg. A KMP algoritmus műveletigényének megállapításához vegyük figyelemben, hogy inicializáló tevékenység, az initnext eljárás lépésszáma (m). Tegyük fel, hogy m n ; ekkor a keresés műveletigénye legjobb és legrosszabb esetben is egyaránt (n). A KMP algoritmust ezért stabil eljárásnak mondhatjuk. Mivel a KMP algoritmus működése során a szövegben csak legfeljebb egy pozícióval történő előre lépést teszünk (nincs visszalépés), így az algoritmus puffer használata nélkül is átírható szekvenciális sorozat, illetve fájl formában adott szövegre.