11. pˇrednáška Hashování
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Úvod
Úvod do programování
Mnohé aplikace nepotˇrebují ke svému provozu celou škálu operací podporovaných v dynamických strukturách (napˇr. stromech), ale vystaˇcí jen s operacemi Insert, Search, Delete.
Michal Krátký1 , Jiˇrí Dvorský1
Napˇríklad kompilátory programovacích jazyku˚ potˇrebují spravovat tabulky identifikátoru˚ v pˇrekládaném programu a dá se pˇredpokládat, že kompilátor nebude potˇrebovat operace ˇ nejmenšího identifikátoru a podobné. Dalším pˇríkladem výberu muže ˚ být disková cache (napˇr. perzistentní datové struktury).
1 Katedra
informatiky VŠB–Technická univerzita Ostrava
Úvod do programování, 2004/2005
c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
1/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Úvod
Úvod do programování
2/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Pˇrímo adresovatelné tabulky
Pˇrímé adresování je jednoduchá technika, která dobˇre funguje, pokud univerzum klíˇcu˚ U má malou mohutnost. Pˇredpokládejme, že aplikace potˇrebuje ke své cˇ innosti ˇ dynamicky se menící množinu a klíˇce prvku˚ množiny náleží do univerza U = {0, 1, . . . , m − 1}, kde m není velké. Dále pˇredpokládejme, že žádné dva prvky nemají shodné klíˇce.
Hashovací tabulky nabízí nástroje jak vytváˇret velice efektivní ˇ tabulky, kde složitost vyhledávání je, za nekolika rozumných pˇredpokladu, ˚ rovna O(1). I když nejhorší pˇrípad je stále Θ(n). Pˇrímo adresovatelné tabulky a hashovací tabulky jsou rozšíˇrením standardních polí. Pˇrímo adresovatelné tabulky používají pˇrímo klíˇce jako indexy v poli, hashovací tabulky transformují prostor klíˇcu˚ o velmi velké mohutnosti pomocí hashovací funkce do relativneˇ malého prostoru indexu˚ pole.
c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
Pro reprezentaci takové množiny použijeme pole nebo pˇrímo adresovatelnou tabulku T [0 . . . m − 1]. Každá pozice (slot) ˇ koresponduje s nejakým klíˇcem univerza U.
3/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Pˇrímo adresovatelné tabulky
Úvod do programování
4/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Hashovací tabulky
Hlavní problém s pˇrímým adresováním je zˇrejmý: jestliže univerzum U je velké, udržování tabulky T velikosti |U| je nemožné (|U| = 232 ). Množina všech aktuálneˇ uložených klíˇcu˚ K (K ⊂ U) muže ˚ být ovšem relativneˇ malá vzhledem k množineˇ U. Jestliže |K | |U|, hashovací tabulka spotˇrebuje mnohem ˇ méneˇ místa než pˇrímo adresovatelná tabulka. Pamet’ové nároky mohou být redukovány na Θ(|K |), pˇri zachování puvodní ˚ složitosti vyhledání prvku, totiž O(1). Slot k ukazuje na prvek s klíˇcem k . Jestliže množina neobsahuje prvek s klíˇcem k , pak tento slot má hodnotu NULL. Všechny tyto operace jsou velice rychlé – pracují v cˇ ase O(1). c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
5/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
6/31
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Hashovací tabulky
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Hashovací tabulky - kolize Dva klíˇce se mohou hashovací funkcí zobrazit na tentýž slot – dojde ke kolizi. Existují úˇcinné techniky jak kolize prvku˚ ˇrešit.
V pˇrímo adresovatelné tabulce je prvek s klíˇcem k uložen ve slotu k. V hashovací tabulce je uložen ve slotu h(k ), kde h je hashovací funkce. Hashovací funkce h zobrazuje univerzum klíˇcu˚ U na sloty hashovací tabulky T [0 . . . m − 1]: h : U → {0, 1, . . . , m − 1} ˇ Ríkáme, že prvek s klíˇcem k je hashován do slotu h(k ), ˇríkáme také, že h(k ) je hashovací hodnota klíˇce k . Hlavním úˇcelem hashovací funkce je transformace klíˇcu˚ z univerza U do jednotlivých slotu. ˚ Místo puvodních ˚ |U| klíˇcu˚ staˇcí udržovat jen m hodnot.
c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
7/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Úvod do programování
8/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
ˇ Separátní ˇretezení
Hashovací tabulky
V hashovací tabulce je v každém slotu ukazatel na seznam a prvky se stejnou hodnotou hashovací funkce se vkládají do pˇríslušného seznamu.
ˇ hashovací funkce úplneˇ zabranuje ˇ Nejvýhodnejší nebo alesponˇ minimalizuje poˇcet kolizí. Mužeme ˚ použít funkce s náhodným chováním. Funkce h musí být deterministická – pro každý klíˇc musí vždy spoˇcítat stejnou hodnotu h(k ). Jelikož |U| > m musí ˇ nevyhnutelneˇ existovat dva kolidující klíˇce a úplné odstranení kolizí není možné. Kvalitním návrhem hashovací tabulky a hashovací funkce lze ˇ ˇ výrazneˇ zmenšit poˇcet kolizí. Rešení kolizí : separátní ˇretezení a otevˇrené adresování.
c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
9/31
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
ˇ Separátní ˇretezení – Analýza
Úvod do programování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
ˇ Separátní ˇretezení – Analýza
ˇ Casová složitost vkládání je v nejhorším pˇrípadeˇ O(1) za pˇredpokladu, že vkládaný prvek není dosud v hashovací ˇ ˇ tabulce. Casová složitost vyhledávání a rušení prvku je úmerná délce seznamu ve slotu.
V nejhorším pˇrípadeˇ se všech n klíˇcu˚ se hashuje do jednoho slotu a vytváˇrí tak seznam délky n. Složitost pro nejhorší pˇrípad je tedy Θ(n) plus cˇ as nutný pro výpoˇcet hashovací funkce. Situace je stejná jako bychom použili jednoduchý seznam.
Necht’ je dána hashovací tabulka T s m sloty ve které je n ˇ ˇ uloženo n prvku. ˚ Císlo α= m se nazývá faktor naplnení hashovací tabulky. Je zˇrejmé, že toto cˇ íslo udává zárovenˇ ˇ i prum ˚ ernou délku seznamu ve slotu.
ˇ Složitost prum ˚ erného pˇrípadu závisí na tom, jak hashovací funkce rozptýlí jednotlivé klíˇce do prostoru slotu. ˚ Pˇredpokládejme, že libovolný klíˇc je hashován do všech slotu˚ ˇ ˇ nezávisle na tom kam se hashovaly stejneˇ pravdepodobn e, ostatní klíˇce. Takové hashování nazýváme jednoduché uniformní hashování.
Pˇri dalších úvahách budeme α považovat za konstantní a hodnoty m a n necháme rust ˚ k nekoneˇcnu.
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
10/31
11/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
12/31
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
ˇ Separátní ˇretezení – Analýza
ˇ Separátní ˇretezení – Analýza
Pˇredpokládejme, že výpoˇcet hodnoty hashovací funkce h pro klíˇc k jsme schopni provést v cˇ ase O(1) a cˇ as nutný pro prohledání seznamu ve slotu T [h(k )] tabulky T je lineárneˇ závislý na délce tohoto seznamu.
ˇ Veta ˇ ˇ Prum ˚ erná cˇ asová složitost úspešného vyhledání v hashovací ˇ tabulce se separátním zˇretezením je Θ(1 + α), za pˇredpokladu jednoduchého uniformního hashování.
ˇ Zbývá zjistit jaký je prum ˚ erný poˇcet klíˇcu, ˚ které musíme porovnat s klíˇcem k abychom zjistili, jestli se klíˇc k v tabulce vyskytuje. Mohou nastat dva pˇrípady: bud’ budeme pˇri hledání ˇ ˇ úspešní nebo neúspešní.
Jinými slovy nám tento výpoˇcet ˇríká následující: jestliže velikost ˇ hashovací tabulky je úmerná poˇctu prvku˚ v tabulce tj. n = O(m), potom α = n/m = O(m)/m = O(1). Proto ˇ lze vyhledávání realizovat v konstantním cˇ ase. Pˇri v prum ˚ eru ˇ ˇ použití obousmerného seznamu lze v prum ˚ erném pˇrípadeˇ rušit prvky se složitostí O(1).
ˇ Veta ˇ ˇ Prum ˚ erná cˇ asová složitost neúspešného vyhledání ˇ v hashovací tabulce se separátním zˇretezením je Θ(1 + α), za pˇredpokladu jednoduchého uniformního hashování. c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
13/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Úvod do programování
Pro urˇcení posloupnosti rozšíˇríme definici hashovací funkce tak, aby zahrnovala i poˇradí pokusu: h : U × {0, 1, . . . , m − 1} → {0, 1, . . . , m − 1}
15/31
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Úvod do programování
16/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Otevˇrené adresování – Rušení prvku˚ Smazání prvku je velice obtížné. Když smažeme prvek ze slotu i, nelze tento slot jednoduše oznaˇcit za prázdný. Tímto bychom mohli narušit posloupnost pokusu˚ pro jiný klíˇc, který testoval ˇ kolizi a tudíž musel pokraˇcovat slot i a zpusobil ˚ v nem ˇ v pokusech až do nejakého jiného slotu j. Jednou možností jak ˇrešit tento problém je oznaˇcit slot speciálním pˇríznakem deleted, který by vyhledávací procedura interpretovala jako obsazený slot a naopak vkládací procedura jako volný slot. Složitost vyhledávání pak ale nebude záviset ˇ tabulky α. Proto, když se požaduje jen na faktoru naplnení mazání prvku˚ z hashovací tabulky, volí se obvykle metoda ˇ separátního ˇretezení.
Algoritmus vyhledávání klíˇce k prochází stejnou posloupnost slotu˚ jako algoritmus pro vložení klíˇce k . Vyhledávání skonˇcí ˇ eˇ – klíˇc k je nalezen v nekterém ˇ bud’ úspešn z testovaných ˇ e, ˇ pokud jsme slotu. ˚ A naopak vyhledávání konˇcí neúspešn narazili na prázdný slot.
Úvod do programování
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Pro každý klíˇc k obdržíme posloupnost pokusu˚ (probe sequence) h(k , 0), h(k , 1), . . . , h(k , m − 1), která je permutací množiny {0, 1, . . . , m − 1}. To znamená, že každý slot v tabulce bude eventuálneˇ použit pro uložení prvku s klíˇcem k .
Michal Krátký, Jiˇrí Dvorský
14/31
Pˇri vkládání prvku do hashovací tabulky provádíme takzvané pokusy dokud nenajdeme hledaný prvek nebo prázdný slot. Otázkou je jak volit posloupnost slotu, ˚ které budeme prozkoumávat. Místo fixní posloupnosti 0, 1, . . . , m − 1, což by vedlo na složitost hledání Θ(n), vybereme takovou posloupnost slotu, ˚ která závisí na vkládaném klíˇci.
Otevˇrené adresování – Posloupnost pokusu˚
c 2005
Úvod do programování
Otevˇrené adresování – Hashovací funkce
Hlavní výhodou otevˇreného adresování je úspora místa, ˇ ˇ ponevadž místo ukazatelu˚ tato metoda vypocítává ˇ nutnou posloupnost slotu, ˚ které je nutno prozkoumat. Pamet’ ˇ k uložení ukazatelu˚ v seznamech prvku˚ mužeme ˚ venovat na zvýšení poˇctu slotu˚ hashovací tabulky, cˇ ímž dosáhneme zmenšení poˇctu kolizí a vyššího výkonu.
11. pˇrednáška Hashování
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Pˇri použití otevˇreného adresování jsou všechny prvky uloženy pˇrímo v hashovací tabulce. Každý slot tabulky obsahuje bud’ ˇ nejaký prvek nebo je prázdný. Pˇri hledání prvku v tabulce systematicky prohledáváme sloty tabulky dokud nenajdeme hledaný prvek nebo najdeme prázdný slot. α ≤ 1.
Michal Krátký, Jiˇrí Dvorský
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Otevˇrené adresování
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
17/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
18/31
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Otevˇrené adresování
Otevˇrené adresování – Lineární pokusy
V dalších analýzách cˇ innosti hashovacích tabulek pˇredpokládáme tzv. uniformní hashování, které tvrdí, že pro každý klíˇc jsou všechny permutace {0, 1, . . . , m − 1} ˇ ˇ posloupnosti pokusu˚ stejneˇ pravdepodobné. Zobecnení jednoduchého uniformního hashování generující se stejnou ˇ pravdepodobností jedno cˇ íslo.
ˇ Mejme dánu jednoduchou hashovací funkci h : U → {0, 1, . . . , m − 1}. Metoda lineárních pokusu˚ používá rozšíˇrenou hashovací funkci: h(k , i) = (h (k ) + i) mod m pro i = 0, 1, . . . , m − 1. Pro klíˇc k se nejprve prozkoumá slot T [h (k )]. Dále se zkoumá slot T [h (k ) + 1]. Postupujeme až ke slotu T [m − 1]. V tomto okamžiku se indexy pˇretoˇcí a pokraˇcujeme sloty T [0], T [1] až nakonec prozkoumáme slot T [h (k ) − 1]. Mužeme ˚ vygenerovat jen m pokusných sekvencí.
ˇ techniky pro generování posloupnosti Tˇri nejpoužívanejší pokusu: ˚ metodu lineárních pokusu˚ (linear probing), metodu kvadratických pokusu˚ (quadratic probing) a dvojité hashování ˇ ˇ (double hashing). Žádná z techto metod nesplnuje pˇresneˇ požadavky kladené na uniformní hashování (generují méneˇ ˚ místo m! ruzných ˚ posloupností). než m2 posloupností pokusu, Dvojité hashování je schopno vygenerovat nejvíce ruzných ˚ posloupností. c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
Metoda lineárních pokusu˚ je snadno implementovatelná, ale vyvolává problém s tzv. primárním shlukováním prvku, ˚ které ˇ mají tendenci se shlukovat v ˇretezcích. 19/31
h(k , i) = (h (k ) + c1 i + c22 i) mod m kde je pomocná Metoda kvadratických pokusu, ˚ c1 = 0 a c2 = 0 jsou pomocné konstanty a i = 0, 1, . . . , m − 1. Prvneˇ je otestován slot T [h (k )]; další sloty jsou testovány v poˇradí urˇceném funkcí h.
20/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Otevˇrené adresování – Dvojité hashování
h(k , i) = (h1 (k ) + ih2 (k )) mod m kde h1 a h2 jsou pomocné hashovací funkce. Na poˇcátku je testován slot T [h1 (k )]; následující pokusy jsou urˇceny posunem o h2 (k ) pozic modulo m. Je jasné, že dvojité ˇ ˇ rozptyl pro výber ˇ sekvencí pokusu, hashování umožnuje vetší ˚ protože na klíˇci k závisí nejen poˇcáteˇcní pozice, ale i velikost kroku o který se v tabulce posunujeme.
Vzhledem k jejímu kvadratickému charakteru nenastává zde tak silné shlukování jako v pˇrípadeˇ lineárních pokusu, ˚ ale jen tzv. sekundární shlukování (secondary clustering), které se podstatneˇ méneˇ projevuje na poˇctu potˇrebných pokusu˚ k nalezení hledaného prvku.
11. pˇrednáška Hashování
Úvod do programování
Dvojité hashování je patrneˇ nejlepší metodou pro urˇcení sekvence pokusu˚ pˇri otevˇreném adresování, protože permutace slotu˚ poskytované touto metodou mají nejblíže k náhodneˇ voleným permutacím. Dvojité hashování používá hashovací funkci tvaru:
h
Úvod do programování
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Metoda kvadratických pokusu˚ používá hashovací funkci tvaru
Michal Krátký, Jiˇrí Dvorský
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Otevˇrené adresování – Metoda kvadratických pokusu˚
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
21/31
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Otevˇrené adresování – Dvojité hashování
Úvod do programování
22/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Otevˇrené adresování – Dvojité hashování ˇ Velikost tabulky m se vetšinou volí prvoˇcíselná a funkce h2 se navrhuje tak, aby vždy vracela kladné cˇ íslo menší než m. Napˇríklad se dají použít tyto funkce:
Je dána hashovací tabulka velikosti 13, hashovací funkce h1 (k ) = k mod 13 a h2 (k ) = 1 + (k mod 11). Protože 14 ≡ 1 mod 13 a 14 ≡ 3 mod 11, klíˇc 14 bude vložen do prázdného slotu 9, po prozkoumání obsazených slotu˚ 1 a 5.
h1 (k ) = k mod m h2 (k ) = 1 + (k mod m ) ˇ menší než m (napˇr. m − 1, m − 2). kde m je o neco Dvojité hashování pˇredstavuje zlepšení, protože je schopno generovat Θ(n2 ) posloupností pokusu˚ místo Θ(m). Je to dáno tím, že hodnoty h1 (k ) a h2 (k ) z nichž se tvoˇrí výsledná hodnota ˇ nezávisle na sobe. ˇ hashovací funkce se mohou menit
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
23/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
24/31
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Analýza otevˇreného adresování
Analýza otevˇreného adresování
Pˇri analýze se budeme snažit vyjádˇrit poˇcet pokusu˚ pˇri ˇ ˇ ˇ neúspešném a úspešném hledání jako funkci faktoru naplnení α, s tím že hodnoty n a m jdou k nekoneˇcnu. Pˇri použití otevˇreného adresování muže ˚ v každém slotu být nejvýše jeden prvek, proto n ≤ m a z toho plyne že α ≤ 1.
ˇ tvrdí, že neúspešné ˇ Jestliže je α konstantní, veta hledání lze provést v cˇ ase O(1). Napˇríklad, jestliže hashovací tabulka je ˇ zaplnena z poloviny (α = 0, 5), oˇcekávaný poˇcet pokusu˚ pˇri ˇ neúspešném hledání bude nejvýše 1/(1 − 0, 5) = 2. ˇ Veta Vložení prvku do hashovací tabulky s otevˇrenou adresací pˇri ˇ α prum ˇ eˇ vyžaduje nejvýše 1/(1 − α) faktoru naplnení ˚ ern pokusu˚ za pˇredpokladu uniformního hashování.
ˇ Veta ˇ Mejme dánu hashovací tabulku s otevˇrenou adresací ˇ α = n/m < 1. Oˇcekávaný poˇcet pokusu˚ pˇri s faktorem naplnení ˇ neúspešném hledání je nejvýše 1/(1 − α) za pˇredpokladu uniformního hashování.
c 2005
Michal Krátký, Jiˇrí Dvorský
11. pˇrednáška Hashování
Úvod do programování
25/31
c 2005
11. pˇrednáška Hashování
11. pˇrednáška Hashování
27/31
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
1 pro j = 0, 1, . . . , m − 1 m
Michal Krátký, Jiˇrí Dvorský
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
11. pˇrednáška Hashování
Úvod do programování
28/31
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Hashovací funkce Rozsah hodnot hashovací funkce musí být pˇrirozené cˇ íslo v rozsahu 0, . . . , m − 1, kde m je velikost hashovací tabulky. Z toho plyne, že nejobvyklejší tvar hashovací funkce je
ˇ V praxi se hashovací funkcehashovací funkce vetšinou navrhují heuristickým zpusobem. ˚ Využívá se pˇritom cˇ ásteˇcná pˇredstava o funkci P. Pˇredstavme si napˇríklad, že vyvíjíme tabulku ˇ symbolu˚ pro kompilátor. Klíˇce v tomto pˇrípadeˇ budou ˇretezce znaku˚ reprezentující identifikátory v programu.
h(k ) = f (k ) mod m, kde funkce f (k ) vypoˇcítá z klíˇce k cˇ íselnou hodnotu.
Lze pˇredpokládat, že identifikátory nebudou vybírány ˇ eˇ z množiny všech možných identifikátoru˚ (tj. rovnomern ˇ u), z množiny všech n-znakových ˇretezc ˚ ale budou se ˇ pravdepodobn eˇ shlukovat, jako tˇreba identifikátory Item ˇ tyto dva a Items. Dobˇre navržená hashovací funkce by mela pˇrípady rozlišit.
Michal Krátký, Jiˇrí Dvorský
P(k ) =
k :h(k )=j
Hashovací funkce
c 2005
26/31
ˇ ˇ Dobˇre navržená hashovací funkce splnuje (pˇribližne) pˇredpoklad uniformního hashování tj. každý klíˇc se hashuje se ˇ ˇ stejnou pravdepodobností do libovolného z m slotu. ˚ Formálne, ˇ pˇredpokládejme, že klíˇce jsou vybírány z nejakého univerza U ˇ podle pravdepodobností distribuˇcní funkce P. Potom P(k ) ˇ ˇ klíˇce k . Pˇredpoklad uniformního znaˇcí pravdepodobnost výberu hashování lze zapsat jako
Jestliže je tedy napˇríklad hashovací tabulka z poloviny plná, oˇcekávaný poˇcet pokusu˚ je menší než 3, 387.
Úvod do programování
Úvod do programování
Hashovací funkce
ˇ Veta ˇ α < 1, oˇcekávaný V hashovací tabulce s faktorem naplnení ˇ poˇcet pokusu˚ pˇri úspešném hledání je nejvýše 1 1 1 ln + α 1−α α za pˇredpokladu uniformního hashování a za pˇredpokladu, že ˇ každý klíˇc se bude vyhledávat se stejnou pravdepodobností.
Michal Krátký, Jiˇrí Dvorský
Michal Krátký, Jiˇrí Dvorský
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Analýza otevˇreného adresování
c 2005
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Úvod do programování
Volba hodnoty m záleží na poˇctu hodnot, které chceme v tabulce ukládat. Dále záleží na technice ˇrešení kolizí, ˇ α, pˇri abychom dosáhli optimální hodnoty faktoru naplnení které je potˇreba minimální poˇcet pokusu. ˚ Tím je urˇcena pˇribližná hodnota m. 29/31
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
30/31
11. pˇrednáška Hashování
Úvod Pˇrímo adresovatelné tabulky Hashovací tabulky Hashovací funkce
Hashovací funkce
Volba m = 2p nám sice umožní velice jednoduše vypoˇcítat ˇ zbytek po delení, ale tato volba není pˇríliš vhodné, nebot’ v tomto pˇrípadeˇ bereme v úvahu jen nejnižších p bitu˚ cˇ ísla f (k ). ˇ Je vhodnejší, aby hodnota hashovací funkce závisela na všech ˇ se obecneˇ jeví volit m jako bitech cˇ ísla f (k ). Nejvhodnejší prvoˇcíslo. Pˇredpokládáme, že klíˇc k je tvoˇren posloupností bytu˚ ˚ zvolit jako souˇcet nebo k = k1 k2 . . . kr ). Funkce f (k ) mužeme souˇcin všech bytu˚ v klíˇci. f (k ) = ri=1 ki nebo f (k ) = Πri=1 ki .
c 2005
Michal Krátký, Jiˇrí Dvorský
Úvod do programování
31/31