150 likes | 166 Views
Mintaillesztés Knuth -Morris- Pratt (KMP) algoritmus. Csóka Boglárka. Miről lesz szó?. Bevezetés Elmélet - mintaillesztés majd KMP Konkrét példa Futási idő elemzése Gyakorlati alkalmazás Összefoglalás. Bevezetés. Lényege : egy minta összes előfordulását keresi a szövegben
E N D
MintaillesztésKnuth-Morris-Pratt (KMP) algoritmus Algoritmusok és bonyolultságuk 2019. 04. 12. Csóka Boglárka
Miről lesz szó? • Bevezetés • Elmélet - mintaillesztés majd KMP • Konkrét példa • Futási idő elemzése • Gyakorlati alkalmazás • Összefoglalás
Bevezetés • Lényege: egy minta összes előfordulását keresi a szövegben • Jelentősége: első lineáris idejű „stringmatching” algoritmus (1970) • Ötlet: ha nem egyezik meg meghatározza, hogy hol kezdődhet a következő illeszkedés (szóból nyert információval), így elkerülhető a korábban megvizsgált karakterek újra egyeztetése
Elmélet – mintaillesztés I. • Jelölések: • szöveg: n hosszúságú T[n] tömb • minta: m hosszúságú P[m] tömb (ahol m ≤ n) • Ezen tömbök elemei: ∑ véges ábécé jelei (pl. {0,1} vagy {a, b, …. , z}) • Azt mondjuk, hogy a P minta előfordul s eltolással a T szövegben (vagy másképpen fogalmazva a P minta a T szöveg (s + 1)-edik pozíciójára illeszkedik), ha 0 ≤ s ≤ n − m és T[s+1 . . s+m] = P[1 . . m] (azaz: ∀ j ∈ [1 . . m] : T[s + j] = P[j])
Elmélet - mintaillesztés II. • Konkatenáció: Az x és y sorozatok konkatenációja egy olyan sorozat, amelyben x jeleit y jelei követik, és a hossza |x| + |y|. Jele xy. • Prefix: A w sorozat az x sorozat prefixe, ha x = wy. • Szuffix: A w sorozat az x sorozat szuffixe, ha x = yw. Példa: X = abcca W1 = ab, Y1= cca W2 =cca, Y2= ab „ab” prefixe az „abcca”-nak „cca” szuffixe az „abcca”-nak
Elmélet – KMP Előfeldolgozás • π[1 . . m] segédfüggvényt határozzuk meg a minta alapján (Futásidő: Θ(m)). • Megadja, hogy hogyan illeszkedik a minta önmaga eltoltjaira. • Leghosszabb prefixet nézünk ami szuffix is. Illesztés Mintapélda: táblán
Futásidő I. Amortizáló elemzés segítségével (potenciál módszer): • A Φ potenciál függvény minden Di adatszerkezethez egy valós Φ(Di) számot rendel, ami a Di adatszerkezethez rendelt potenciál. • c*i= ci + Φ(Di) − Φ(Di−1) Művelet amortizációs költsége = tényleges költség + a művelet által okozott potenciálváltozás • n művelet: ∑ c*i felső becslés n i=1
Futásidő II. Prefix függvény: • k potenciált rendelünk az algoritmus aktuális k értékéhez (nem lehet negatív) • 3. sor: kezdeti értéke k=0 • 6. sor: while ciklus ha belemegy: csökkenti, mert π[k] < k ciklusmag egyes végrehajtásait kiegyenlíthetjük a potenciál függvény értékének csökkentésével • 8. sor: ifha belemegy: növeli 1-gyel 5-9. sorokból álló ciklusmag amortizált költsége O(1)
Futásidő III. • A külső ciklus m-szer fut le, így a futási ideje: Θ(m) • Hasonlóan megmutatható az Illesztő függvényre, hogy futási ideje: Θ(n). • Így összegezve Θ(m+n) idő alatt futó lineáris algoritmus
Gyakorlati alkalmazás • Legtöbb szókeresési szituációban ez használatos, mivel gyorsabb és kevesebb memóriát használ, mint a többi algoritmus • Hosszú szövegek, melyek kevés féle karakterből állnak (pl. DNS- láncokban minta keresése) • Kód, videó (lásd: források)
Összefoglalás • Célja: a szövegben szereplő összes minta megtalálása, helyeiknek visszaadása • Lineáris futási idejű, leghatékonyabb algoritmus • Alapötlete: prefix függvényből információt nyerünk, melynek segítségével megoldható, hogy nem kell mindig visszalépni a szövegben a minta kezdetére
Források • Új algoritmusok (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, CliffordStein) http://www.informatom.hu/sze/01/LGB_SZ001/Cormen-Lieserson-Rivest-Stein.-.Uj.algoritmusok.pdf • ELTE Algoritmusok és adatszerkezetek honlap: http://tamop412.elte.hu/tananyagok/algoritmusok/lecke33_lap1.html • Videó: https://www.youtube.com/watch?v=2ogqPWJSftE • Kód: https://www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/