Algorytmy i Struktury Danych, 15. ćwiczenia
2010-01-18
1 Plan zajęć
• algorytm Karpa-Rabina
• liczenie tablicy P w algorytmie KMP
• rozszerzenie KMP na wiele wzorców
• wzorzec-tekst dwuwymiarowy
2 Zastosowanie haszowania do wyszukiwania wzorca
Algorytm 1: Algorytm KarpaRabina Dane: Tekst T [1..n] i wzorzec P [1..m]
// Zakładamy, że dysponujemy funkcją haszującą h ;
1
Oblicz wartość p = h(P [1..m]) ;
2
for i = 1 to n − m do
3
Oblicz wartość x = h(T [i..(i + m − 1)]) ;
4
if p = x then
5
sprawdź czy P = T [i..(i + m − 1)] i jeśli tak, to wypisz
6
odnalezienie wzorca na pozycji i ;
7 8
Do efektywnej implementacji algorytmu musimy tak dobrać funkcję h aby było możliwe obliczenie w czasie O(1) wartości h(T [i..(i + m − 1)]) na podstawie h(T [(i − 1)..(i + m − 2)]) i T . Przykład:
h(c1c2. . . cm) = (c1pm−1+ c1pm−2+ . . . cmp0) mod q
h(T [i..(i+m−1)]) = ((h(T [(i−1)..(i+m−2)])−T [i−1]pm−1)·p+T [i+m−1]) mod q Powyższy algorytm można łatwo rozszerzyć do wyszukiwania dwuwymiaro- wego wzorca.
1
3 KMP – ciekawostki
KMP(T, P )
n = length(T ) ;
1
m = length(P ) ;
2
π = Compute-Prefix-Function(P ) ;
3
q = 0 ;
4
for i = 1 to n do
5
while q > 0 and P [q + 1] 6= T [i] do
6
q = π[q] ;
7
if P [q + 1] = T [i] then
8
q = q + 1 ;
9
if q = m then
10
wzorzec występuje w T na pozycji i + 1 − m ;
11
q = π[q] ;
12 13 14
• przykład, że KMP może spędzić nad jedną pozycją O(m) razy: T = am−1b, W = am,
• możemy zdefiniować tablicę P0 jako “ulepszoną” tablicę prefikso-sufiksów, P0[i] = max(−1, {j : W [1..j] = W [(i − j + 1)..i] and W [j + 1] 6= W [i + 1]})
• przykład, że KMP’ (dla tablicy P0) może spędzić nad jedną pozycją Ω(log n) razy:
– dla KMP’ delay = O(log m): Z lematu o okresowości można udowod- nić, że jeśli P0[i] = j, P0[j] = k, to i ≥ k + j, czyli P0[Fi] ≤ i. Jeśli i ≤ k + j to można udowodnić, że W [k + 1] = W [j + 1].
– niech F0= a, F1= ab, Fn+1= Fn+ Fn−1, Fn0 oznacza Fn z usunię- tymi dwoma ostatnimi znakami, rozważmy T = Fn0cc, W = Fn
Lemat o okresowości: jeśli słowo x ma okresy p i q, takie, że p + q ≤ |x| to nwd(p, q) jest również okresem x (wystarczy pokazać, że (dla p > q) p − q jest również okresem x).
4 Algorytm Aho-Corasick
Wyszukiwanie wielu wzorców w czasie liniowym (do sumy długości wzorców i przeszukiwanego tekstu).
Dane są wzorce W1, . . . , Wk.
• Przygotowujemy drzewo TRIE zawierające wzorce W1, . . . , Wk,
• Dla każdego węzła drzewa L(v) oznacza napis powstały z konkatenacji etykiet na ścieżce z korzenia do v,
• Dla każdego węzła musimy obliczyć f (v) (failure function), f (v) = x jeśli L(x) jest najdłuższym sufiksem L(v)
2
• Dla każdego węzła oblicz out(v) (zbiór wzorców które są rozpoznawane po osiągnięciu v) (początkowo out(v) = {i} jeśli Wi kończy się w v, potem idąc od korzenia uzupełniamy out(v) := out(v) + out(f (v)))
5 Algorytm Bakera
Wyszukiwanie dwuwymiarowych wzorców.
Dany jest tekst T [1..n, 1..n] oraz wzorzec W [1..m, 1..m] należy wyznaczyć pary (i, j) t.że T [i..(i + m − 1), j..(j + m − 1)] = W .
• przygotuj zbiór wzorców {Wi= W [i, 1..m] : 1 ≤ i ≤ m} (kolejne kolumny wzorca),
• za pomocą algorytmu Aho-Corasick znajdź wystąpienia wzorców Wiw po- szczególnych kolumnach tekstu, wynikiem niech będzie tablica A[1..n, 1..n]
t.że A[i, j] = k jeśli A[i, j..(j + m)] = Wk lub A[i, j] = −1 wpp.
• za pomocą algorytmu KMP w poszczególnych wierszach tabli A odszukaj wystąpienia ciągu 1, 2, . . . , m (jeśli kolumny Wi się powtarzają, to ciąg będzie trochę inny)
6 Zadanie z 2. klasówki 2010-01-15
Mamy n stałych funkcji fi : [ai, bi] → 1, ..., n, 1 ≤ ai ≤ bi ≤ n. Zaproponuj algorytm obliczenia maksimum z wartości fi(j), dla każdego j z {1, 2, . . . , n} i tych funkcji fi, które zawierają j w swojej dziedzinie. Jeśli takiej funkcji nie ma, to za maksimum przyjmujemy 0.
Uwagi: rozwiązania w czasie O(n log n) będą punktowane za maksimum 7 punktów; 11 punktów można uzyskać za rozwiązanie w czasie o(n log n).
3