Algorytmy i Struktury Danych, 11. ćwiczenia
2016-12-22
Spis treści
1 Algorytm Aho-Corasick 1
2 Algorytm Bakera 1
3 Algorytm Karpa-Rabina 2
1 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)
• 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)))
2 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)
1
3 Algorytm Karpa-Rabina
Algorithm 1: Algorytm KarpaRabina Data: Tekst T [1..n] i wzorzec P [1..m]
// Zakładamy, że dysponujemy funkcją haszującą h Oblicz wartość p = h(P [1..m])
for i = 1 to n − m do
Oblicz wartość x = h(T [i..(i + m − 1)]) if p = x then
sprawdź czy P = T [i..(i + m − 1)] i jeśli tak, to wypisz odnalezienie wzorca na pozycji i
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.
2