Algorytmy i struktury danych Wykład 6 Tablice rozproszone cz. 2
Na poprzednim wykładzie Wiele problemów wymaga dynamicznych zbiorów danych, na których można wykonywać operacje: wstawiania (Insert) szukania (Search) usuwania (Delete)
Na poprzednim wykładzie Taki abstrakcyjny typ danych nazywamy słownikiem.
Na poprzednim wykładzie Efektywnym sposobem implementacji takich typów danych są tablice z techniką dostępu nazywaną rozproszoną (hash tables).
Na poprzednim wykładzie Polega one na obliczaniu adresu danego elementu (rekordu) na podstawie fragmentu tego rekordu zwanego kluczem. Umożliwia to (zazwyczaj) odnalezienie danego rekordu w jednej próbie.
Na poprzednim wykładzie 1. Zbiór kluczy 2. Funkcja rozpraszająca (haszującą) 3. Tablica adresów
Na poprzednim wykładzie Jeżeli dla dwóch (lub kilku) rekordów ich klucze zwracają tą samą wartość funkcja rozpraszającej to dochodzi do kolizji.
Na poprzednim wykładzie Techniki rozwiązywania kolizji: 1. Łańcuchowanie oddzielne 2. Łańcuchowanie bezpośrednie
Na poprzednim wykładzie Do analizy przydatny będzie parametr n N Gdzie n to liczba rekordów a N to liczba komórek tablicy
Na poprzednim wykładzie Analiza (poszukiwanie zakończone sukcesem): 1. Łańcuchowanie oddzielne (1+ ) <- wyprowadzenie 2. Łańcuchowanie bezpośrednie (1+e 2 /(8 ) )
Na poprzednim wykładzie Analiza (poszukiwanie zakończone sukcesem): Przykład: Łańcuchowanie oddzielne 1000 rekordów, 500 komórek tablicy. Ilu sondowań spodziewamy się przed znalezieniem rekordu?
Adresowanie otwarte 1. Nie ma listy synonimów (przestrzeni w pamięci dodatkowej). 2. Jeżeli występuje kolizja to obliczany jest nowy adres rekordu.
Adresowanie otwarte 2. Jeżeli występuje kolizja to obliczany jest nowy adres rekordu (początkowo dla i=1). h H ( k) 0 h i [H(k) G(i)]mod N dla i 1,2,..., N 1
Adresowanie otwarte Uwaga: w łańcuchowaniu bezpośrednim potrzebny był wskaźnik do adresu następnego synonimu. Jego brak pozwala zaoszczędzić miejsce w pamięci. Zaoszczędzone miejsce może być wykorzystane do implementacji większej tablicy adresów.
Adresowanie otwarte W zależności od postaci funkcji G(i) wyróżniamy różne typy adresowania otwartego: Z sondowaniem liniowym Z sondowaniem kwadratowym Z sondowaniem sześciennym Z sondowaniem losowym Z podwójnym rozpraszaniem h [h G(i)]mod N dla i 1,2,..., N 1 i 0
Adresowanie z sondowaniem liniowym W tym przypadku funkcja G(i) =i czyli h H( k) 0 h i [H(k) i]mod N dla i 1,2,..., N 1 Przykład: wstawianie kluczy do tablicy k={9,13,19,27,23,7,17,8,2,11} H(k) = k mod 10
Adresowanie z sondowaniem liniowym Uwagi: 1. Stosunkowo proste w implementacji 2. Dochodzi do grupowania rekordów, wydłużając wyszukiwanie. Jeżeli i komórek jest zajętych, zajęcie następnej pustej następuje z prawdopodobieństwem (i+1)/n
Adresowanie z sondowaniem liniowym Uwagi: 2. Cd: grupowanie jest spowodowane faktem, że sondowanie liniowe nie rozprasza po tablicy.
Adresowanie otwarte Uwagi ogólne Zamiast pisać h H( k) 0 h i [K(k) i]mod N dla i 1,2,..., N 1 Można zapisać: h(k,i) Gdzie h jest funkcją zdefiniowaną dla zbioru k,i U {0,1,..., N 1} {0,1,..., N 1}
Adresowanie otwarte Algorytm wstawiania klucza do tablicy i 0 while(i m) j h(k,i) if T[j] T[j] NULL k else i i 1 if i m then "Nie ma miejsca"
Adresowanie otwarte Algorytm wyszukiwania klucza w tablicy Kiedy algorytm powinien się zatrzymać (w przypadku gdy nie ma klucza w tablicy)?
Adresowanie otwarte Algorytm wyszukiwania klucza w tablicy i 0 while(i m and T[j]! Null) j h(k,i) if T[j] k return j else i i 1 if i m or T[j] NULL then "Nie ma rekordu"
Adresowanie z sondowaniem kwadratowym W tym przypadku funkcja G(i) =b*i+a*i^2 czyli h H( k) 0 h i [H(k) i]mod N dla i 1,2,..., N 1 Przykład k={9,13,19,27,23,7,17,8,2,11} H(k) = k mod 10
Uwagi: Adresowanie z sondowaniem kwadratowym 1. By wykorzystać wszystkie adresy w tablicy wartości a,b i N muszą być odpowiednio dobrane (np. a =1,b=0,N=11 dla h(k,0)=3 ) 2. Dochodzi do tak zwanego wtórnego grupowania rekordów (jeżeli h(k,0)=h(k,0) to h(k,i)=h(k,i)).
Adresowanie z sondowaniem sześciennym W tym przypadku funkcja G(i) =i^3 czyli h H( k) 0 h i [H(k) i]mod N dla i 1,2,..., N 1 Przykład k={9,13,19,27,23,7,17,8,2,11} H(k) = k mod 10
Adresowanie otwarte z sondowaniem Funkcja G(i): losowym 1. Generuje liczby z przedziału [0,,N-1] z jednakowym prawdopodobieństwem 2. W kolejnych N wywołaniach zwraca tę samą liczbę 3. Dla tego samego klucza k zwraca tę samą sekwencję liczb
Adresowanie otwarte z sondowaniem losowym Uwagi: trudno skonstruować dobrą funkcję generującą liczby losowe.
Adresowanie otwarte z podwójnym rozpraszaniem h H( k) 0 h i [H(k) ih '(k)]mod N dla i 1,2,..., N 1 Przykład K={18,41,22,31,8,7,11,3,9,17} H(k)=k mod 10 H (k)=1 + k mod 7
Adresowanie otwarte z podwójnym rozpraszaniem Co zrobić by sondowana była cała tablica? H (k) musi być względnie pierwsza do N np. N jest potęgą 2 a H (k) zwraca liczbę nieparzystą N jest liczbą pierwszą a H (k) zawsze zwraca liczbę mniejszą od N
Adresowanie otwarte z podwójnym rozpraszaniem N jest liczbą pierwszą a H (k) zawsze zwraca liczbę mniejszą od N Hk ( ) k mod N H'( k) 1 (k mod N') np. N' N 1
Adresowanie otwarte z podwójnym rozpraszaniem Jest to jedna z najlepszych metod adresowania otwartego (ciągi przewidywanych miejsc w tablicy mają wiele cech losowych permutacji).
Adresowanie otwarte z podwójnym rozpraszaniem Przewidywane miejsce w tablicy zależy od wartości klucza na dwa sposoby.
Adresowanie otwarte z podwójnym rozpraszaniem Analiza: 1. Wyszukiwanie zakończone porażką 1/(1- ) Przykład: 500 rekordów, 1000 komórek tablicy. Jakiej liczby sondowań spodziewamy się zanim nie ustalimy tego, że rekordu nie ma w tablicy?
Adresowanie otwarte z podwójnym rozpraszaniem Analiza: 1. Wyszukiwanie zakończone porażką 1/(1- ) Przykład: 900 rekordów, 1000 komórek tablicy. Jakiej liczby sondowań spodziewamy się zanim nie ustalimy tego, że rekordu nie ma w tablicy?
Adresowanie otwarte z podwójnym Analiza: 2. Wstawianie 1/(1- ) rozpraszaniem
Adresowanie otwarte z podwójnym rozpraszaniem Analiza: 3. Wyszukiwanie zakończone sukcesem 1/ log e 1/(1- )
Adresowanie otwarte z podwójnym rozpraszaniem Analiza: 3. Wyszukiwanie zakończone sukcesem 1/ log e (1/(1- )) Ilu sondowań spodziewamy się przed Znalezieniem rekordu? rekordów 500, komórek tablicy 1000 rekordów 900, komórek tablicy 1000
Porównanie metod
Porównanie metod
Porównanie metod Dlaczego w takim razie używa się adresowania otwartego? Mniej kosztowne w implementacji.