Algorytmy i Struktury Danych, 9. ćwiczenia 206-2-09 Plan zajęć usuwanie z B-drzew join i split na 2-3-4 drzewach drzepce adresowanie otwarte w haszowaniu z analizą 2 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+ 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 ], key[i]] (definiujemy key[0] =, key[n + ] = ), wszystkie liście mają leżą na tej samej głębokości, każdy węzeł zawiera nie więcej niż 2t kluczy, każdy węzeł oprócz korzenia zawiera co najmniej t 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 y syn x poprzedzający k, y 2 syn x występujący po k, k poprzednik k w drzewie, k 2 następnik k w drzewie, jeśli węzeł y ma co najmniej t kluczy, to rekurencyjnie usuń k i zastąp k przez k, w przeciwnym przypadku, jeśli węzeł y 2 ma co najmniej t kluczy, to rekurencyjnie usuń k 2 i zastąp k przez k 2, w przeciwnym przypadku, y i y 2 mają po t kluczy, scal węzeł y, klucz k i węzeł y 2 otrzymując węzeł y, 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 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). 3 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/cs25/slides/chap3b.pdf 4 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 czerwonego syna (możemy dowolnie wybrać lewy czy prawy), węzeł z trzema kluczami jest zamieniany na czarny węzeł z dwoma czerwonymi synami. 5 Drzepce Definicja:. drzewo zachowuje warunki BST, 2. każdy węzeł v, przechowuje swój prioritet pr(v), priorytety spełniają warunki kopca, tzn. pr(v) < pr(parent(v)) (dla v root) Z dużym prawdopodobieństwem wysokość drzepca jest równa O(log n). Kosz opertacji: search O(log n), insert O(log n), delete O(log n), join O(log n), https://en.wikipedia.org/wiki/treap 2
6 Uniwersalna klasa funkcji haszujących [[CLR, rozdział. Strona 234]] Dla dowolnej pary liczb a Z p ({,..., p }), b Z p, niech: Rodzina wszystkich takich funkcji to: h a,b (k) = ((ak + b) mod p) H p,m = {h a,b : a Z p i b Z p } Twierdzenie Klasa funkcji haszujących H p,m, jest klasą uniwersalną. Niech k, l Z p (k l). Dla danej funkcji haszującej h a,b, niech: r = (ak + b) mod p, s = (al + b) mod p. Zauważmy, że r 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 0 daje inną parę (r, s) z r s. Ponieważ możliwych par (r, s) z r s jest tylko p(p ), istnieje zatem wzajemnie jednoznaczne odwzorowanie między parami (a, b) z a 0 i parami (r, s) z r s. Tak więc dla każdej pary różnych kluczy k i l, jeśli wybierzemy (a, b) równomiernie losowo z Z p Z p, 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 ( ), gdzie r i s są różnymi losowymi wartościami modulo p. Dla ustalonego r liczba tych s, spośród pozostałych p możliwych wartości, dla których s r i s r ( ), wynosi co najwyżej: p/m (p )/m Prawdopodobieństwo, że r i s kolidują modulo m wynosi co najwyżej: (p )/m (p ) = /m Zatem dla każdej pary różnych wartości k, l Z p mamy: P r{h a,b (k) = h a,b (l)} /m 3
7 Adresowanie otwarte [[CLR, rozdział.4. Strona 236]] adresowane liniowe: h(k, i) = (h (k) + i) adresowanie kwadratowe: h(k, i) = (h (k) + c i + c 2 i 2 ) haszowanie dwukrotne: h(k, i) = (h (k) + ih 2 (k)) [[CLR, Rozdział, strona 242]] Twierdzenie 2 Jeśli współczynnik zapełnienia tablicy z haszowaniem wynosi α = n/m <, to oczekiwana liczba sprawdzanych pozycji w czasie wyszukiwania elementu, który nie występuje w tablicy, jest nie większa niż α, 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 m n i + 2 m i + 2 αi (zauważmy, że n j m j n m dla 0 j < m) E[X] = P r[x i] α i = i= i= α i = α Twierdzenie 3 Jeżeli współczynnik zapełnienia tablicy z haszowaniem wynosi α, to wstawianie z adresowaniem otwartym wymaga średnio co najwyżej α sprawdzeń pozycji w tablicy, o ile spełniony jest warunek równomiernego haszowania. Wynika bezpośrednio z twierdzenia 2. [[CLR, Rozdział, 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ść α <. Wtedy oczekiwana liczba sprawdzeń pozycji w tablicy wykonywanych w czasie wyszukiwania tego elementu jest nie większa niż α ln α. 4
Wyszukanie elementu k wymaga tyle samo czasu ile kosztowało jego wstawienie, stąd możemy uśrednić koszt wstawienia wszystkich elementów. n n m m i = m n n (H i i ta liczba harmoniczna). m i = α (H m H m n ) α (H m H m n ) = α m k=m n+ k m α m n x dx = α ln m m n = α ln α (stary CLR) 2.4-3 adresowanie otwarte, dwukrotne haszowanie, wykazać, że ciąg kontrolny jest permutacją gdy h 2 (k) jest względnie pierwsze z m Bez utraty ogólności możemy założyć, że h (k) = 0. Niech a = h 2 (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 x 0, z = kd x := kx 0 d 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ść. 5