Mintaillesztés
Knuth-Morris-Pratt (KMP) algoritmus
CSÓKA BOGLÁRKA
Algoritmusok és bonyolultságuk 2019. 04. 12.
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
2
Bevezetés
Lényege: egy minta összes előfordulását keresi a szövegben
Jelentősége: első lineáris idejű „string matching” 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
3
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])
4
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.
5
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
6
Mintapélda: táblán
Pszeudokódok
7
8
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
9
i=
1 n
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: if ha belemegy: növeli 1-gyel
5-9. sorokból álló ciklusmag amortizált költsége O(1)
10
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
11
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)
12
Ö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
13
Források
Új algoritmusok (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein) 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-searchi ng/