27c - Hashovacie tabuľky (tabuľky s rozptýlenými položkami)
Tabuľky s priamym prístupom
množina kľúčov, ktoré budeme vyhľadávať
množina adries, na ktorých ležia jednotlivé prvky
existuje mapovacia funkcia = mechanizmus, ktorému predáme kľúč a on vráti adresu
časová zložitosť 1
problém je v nájdení vhodnej mapovacej funkcie (keby sme mali zoznam všetkých mapovacích funkcií, tak tam sú napr. funkcie, ktoré mapujú všetky hodnoty na jeden kľúč, alebo všetky hodnoty na všetky kľúče, atď)
Mapovacia funkcia:
je dané mapovacie pole intervalom najčastejšie [0..n] resp. [1..N]
mapovacia funkcia transformuje kľúč na index, ktorého hodnota musí byť v danom intervale
najčastejšie 2 etapy:
jedno-jednoznačná mapovacia funkcia = vracia rozličné hodnoty pre rôzne kľúče pre každú hodnotu a kľúč
kolízia = dva rôzne kľúče sa namapujú na rovnaké miesto (funkcia je jednoznačná, ale nie je jedno-jednoznačná)
synonymá = tie kľúče, ktoré sa namapujú na rovnaké miesto
2 požiadavky na mapovaciu funkciu:
rýchlosť
čo najmenej kolízií
maximálna doba vyhľadávania je daná dĺžkou najdlhšieho zoznamu synoným
Explicitné a implicitné zreťazenie:
index sekvenčný prístup
hashovacia tabuľka pozostáva z mapovacieho priestoru (pole) a zo zoznamu synoným, každý zoznam synoným začína na jednom prvku mapovacieho poľa
explicitné zreťazenie = prvok obsahuje adresu následníka
každý prvok má nejakú zložku, ktorá určuje, či je voľný alebo obsadený
koniec zoznamu synoným je daný prvým voľným prvkom, ktorý sa nájde so zadaným krokom
nové synonymum sa uloží na prvé voľné miesto
tabuľka musí obsahovať aspoň jeden voľný prvok (každá sekvencia potrebuje jeden voľný stav na konci - ten môže byť spoločný pre viaceré sekvencie)
tabuľka je implementovaná kruhovým poľom
sekvencie sa môžu prelínať
rušenie položiek prakticky nie je možné (jedine zaslepenie)
krok 1 je nevhodný (kvôli prelínaniu), krok musí byť nesúdeliteľný s veľkosťou poľa ⇒ prvočíslo