Algorytmy i Struktury Danych, 10. ćwiczenia
2015-12-04
1 Plan zajęć
• Join i Split na 2-3-4 drzewach
• usuwanie z B-drzew
• haszowanie uniwersalne
2 Join i Split na 2–3–4 drzewach
http://courses.csail.mit.edu/6.046/spring04/handouts/ps5-sol.pdf i ogólnie o 2–3–4 drzewach:
https://www.cs.purdue.edu/homes/ayg/CS251/slides/chap13b.pdf
3 Przejście z 2–3–4 drzew na czerwono-czarne
• węzeł z jednym kluczem zamieniany jest na czarny węzeł,
• węzeł z dwoma kluczami zamieniany jest na dwa węzły czarny i jego czer- wonego syna (możemy dowolnie wybrać lewy czy prawy),
• węzeł z trzema kluczami jest zamieniany na czarny węzeł z dwoma czer- wonymi synami.
4 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ą.
Niech k, l ∈ Zp (k 6= l). Dla danej funkcji haszującej ha,b, niech:
1
• 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= 0 i 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
qued
5 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]]
2
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.
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 − α
qued 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.
Wynika bezpośrednio z twierdzenia 2. qued
[[CLR, Rozdział 11, strona 243–244]]
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 .
Wyszukanie elementu k wymaga tyle samo czasu ile kosztowało jego wsta- wienie, 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 – i–ta 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 − α
qued (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
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,
3
• 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ść.
qued
B-drzewa definicja
• każdy węzeł ma następujące pola n, c[], key[],
• każdy węzeł wewnętrzny utrzymuje n kluczy i n + 1 wskaźników do synów,
• klucze są uporządkowane rosnąco,
• klucz w poddrzewie c[i] mają wartości pochodzą z przedziału [key[i − 1], key[i]] (definiujemy key[0] = −∞, key[n + 1] = ∞),
• wszystkie liście mają leżą na tej samej głębokości,
• każdy węzeł zawiera nie więcej niż 2t − 1 kluczy,
• każdy węzeł oprócz korzenia zawiera co najmniej t − 1 kluczy.
B-drzewa usuwanie
• jeśli klucz k jest w węźle x i x jest liściem, to usuń k z węzła,
• jeśli klucz k jest w węźle wewnętrznym x, to:
– niech y1 syn x poprzedzający k, y2 syn x występujący po k, k1 po- przednik k w drzewie, k2 następnik k w drzewie,
– jeśli węzeł y1 ma co najmniej t kluczy, to rekurencyjnie usuń k1 i zastąp k przez k1,
– w przeciwnym przypadku, jeśli węzeł y2ma co najmniej t kluczy, to rekurencyjnie usuń k2i zastąp k przez k2,
– w przeciwnym przypadku, y1i y2mają po t − 1 kluczy, scal węzeł y1, klucz k i węzeł y2otrzymując węzeł y0, usuń rekurencyjnie k z węzła y.
• jeśli klucz k nie występuje w węźle wewnętrznym x, to:
– znajdź odpowiednie poddrzewo y w którym może znajdować się k, – jeśli y ma co najmniej t kluczy, usuń rekurencyjnie k z y,
– wpp., jeśli y ma t − 1 kluczy, ale jeden z sąsiadów y ma t kluczy, to dodaj jeden klucz do y (jeden klucz przechodzi z x do y, jeden z brata y do x),
– wpp., scal y z dowolnym bratem i usuń k z tak utworzonego węzła (je- śli x jest korzeniem, to może to spowodować zmniejszenie wysokości drzewa).
4