Algorytmy i Struktury Danych, 12. ¢wiczenia
2009-01-19
1 Plan zaj¦¢
• konstrukcja uniwersalnej klasy funkcji haszuj¡cych z Cormena (rozdziaª 11)
• adresowanie otwarte (rozdziaª 11.4)
• algorytm Rabina
• liczenie tablicy P w algorytmie KMP
• rozszerzenie KMP na wiele wzorców
• wzorzec-tekst dwuwymiarowy
2 Uniwersalna klasa funkcji haszuj¡cych
[[CLR, rozdziaª 11. Strona 234]]
Dla dowolnej pary liczb a ∈ Zp∗ ({1, . . . , p − 1}), b ∈ Zp, niech:
ha,b(k) = ((ak + b) mod p) mod m Rodzina wszystkich takich funkcji to:
Hp,m= {ha,b: a ∈ Zp∗i b ∈ Zp}
Twierdzenie 1 Klasa funkcji haszuj¡cych Hp,m, jest klas¡ uniwersaln¡.
Dowód: Niech k, l ∈ Zp (k 6= l). Dla danej funkcji haszuj¡cej ha,b, niech:
• r = (ak + b) mod p,
• s = (al + b) mod p. Zauwa»my, »e r 6= s:
r − s ≡ a(k − l) mod p
Poniewa» a i (k − l) s¡ ró»ne od zera, st¡d te» ich iloczyn (modulo p) jest równie» ró»ny od zera. Co wi¦cej ka»da mo»liwa para (a, b) z a 6= 0 daje inn¡
par¦ (r, s) z r 6= s. Poniewa» mo»liwych par (r, s) z r 6= s jest tylko p(p − 1),
istnieje zatem wzajemnie jednoznaczne odwzorowanie mi¦dzy parami (a, b) z a 6= 0i parami (r, s) z r 6= s. Tak wi¦c dla ka»dej pary ró»nych kluczy k i l, je±li wybierzemy (a, b) równomiernie losowo z Zp∗× Zp, to wynikow¡ par¡ (r, s) mo»e by¢ z jednakowym prawdopodobie«stwem ka»da para ró»nych liczb modulo p.
Wynika st¡d, »e prawdopodobie«stwo kolizji dwóch ró»nych kluczy k i l jest równe prawdopodobie«stwu, »e r ≡ s ( mod m), gdzie r i s s¡ ró»nymi losowymi warto±ciami modulo p. Dla ustalonego r liczba tych s, spo±ród pozostaªych p−1 mo»liwych warto±ci, dla których s 6= r i s ≡ r ( mod m), wynosi co najwy»ej:
dp/me − 1 ≤ (p − 1)/m
Prawdopodobie«stwo, »e r i s koliduj¡ modulo m wynosi co najwy»ej:
(p − 1)/m
(p − 1) = 1/m
Zatem dla ka»dej pary ró»nych warto±ci k, l ∈ Zp mamy:
P r{ha,b(k) = ha,b(l)} ≤ 1/m
3 Adresowanie otwarte
[[CLR, rozdziaª 11.4. Strona 236]]
• adresowane liniowe:
h(k, i) = (h0(k) + i) mod m
• adresowanie kwadratowe:
h(k, i) = (h0(k) + c1i + c2i2) mod m
• haszowanie dwukrotne:
h(k, i) = (h1(k) + ih2(k)) mod m [[CLR, Rozdziaª 11, strona 242]]
Twierdzenie 2 Je±li wspóªczynnik zapeªnienia tablicy z haszowaniem wynosi α = n/m < 1, to oczekiwana liczba sprawdzanych pozycji w czasie wyszukiwania elementu, który nie wyst¦puje w tablicy, jest nie wi¦ksza ni» 1−α1 , o ile jest speªnione zaªo»enie o równomiernym haszowaniu.
Dowód: Niech X b¦dzie zmienn¡ losow¡ równ¡ liczbie sprawdzanych pozycji.
P r[X ≥ i] = n
m· n − 1
m − 1· · · n − i + 2
m − i + 2 ≤ αi−1 (zauwa»my, »e m−jn−j ≤ mn dla 0 ≤ j < m)
E[X] =
∞
X
i=1
P r[X ≥ i] ≤
∞
X
i=1
αi−1=
∞
X
i=0
αi= 1 1 − α
Twierdzenie 3 Je»eli wspóªczynnik zapeªnienia tablicy z haszowaniem wynosi α, to wstawianie z adresowaniem otwartym wymaga ±rednio co najwy»ej 1−α1 sprawdze« pozycji w tablicy, o ile speªniony jest warunek równomiernego haszo- wania.
Dowód: Wynika bezpo±rednio z twierdzenia 2. [[CLR, Rozdziaª 11, strona 243244]]
Twierdzenie 4 Zaªó»my, »e element znajduje si¦ w tablicy z haszowaniem przez adresowanie otwarte, a wspóªczynnik zapeªnienia tablicy α speªnia nierówno±¢
α < 1. Wtedy oczekiwana liczba sprawdze« pozycji w tablicy wykonywanych w czasie wyszukiwania tego elementu jest nie wi¦ksza ni» α1ln1−α1 .
Dowód: Wyszukanie elementu k wymaga tyle samo czasu ile kosztowaªo jego wstawienie, st¡d mo»emy u±redni¢ koszt wstawienia wszystkich elementów.
1 n
n−1
X
i=0
m m − i= m
n
n−1
X
i=0
1 m − i = 1
α(Hm− Hm−n) (Hi ita liczba harmoniczna).
1
α(Hm− Hm−n) = 1 α
m
X
k=m−n+1
1 k ≤ 1
α Z m
m−n
1 xdx = 1
αln m m − n = 1
αln 1 1 − α
(stary CLR) 12.4-3 adresowanie otwarte, dwukrotne haszowanie, wykaza¢, »e ci¡g kontrolny jest permutacj¡ gdy h2(k)jest wzgl¦dnie pierwsze z m
Dowód: Bez utraty ogólno±ci mo»emy zaªo»y¢, »e h1(k) = 0. Niech a = h2(k), d = gcd(a, n). Ci¡g kontrolny ma posta¢ ax( mod n). Rozwa»my równanie ax ≡ z( mod n).
• z = d, z algorytmu Euklidesa wynika, »e istnieje rozwi¡zanie równania ax + ny = gcd(a, n) = d x0,
• z = kd x := kx0
• d 6 |z powiedzmy, »e istniej¡ caªkowite x, y speªniaj¡ce równanie ax = z + ny, jednak d|n i d|a st¡d lewa strona jest podzielna przez d, natomiast prawa nie! sprzeczno±¢.
4 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.
5 KMP ciekawostki
KMP(T, P ) n = length(T );
1
m = length(P );
2
π =Compute-Prex-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 zdeniowa¢ tablic¦ P0 jako ulepszon¡ tablic¦ prekso-suksó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).
6 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 suksem 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)))
7 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)