Úvod. Úvod do programování. Úvod. Hashovací tabulky

Podobné dokumenty
Základy algoritmizace. Hašování

Datové struktury 2: Rozptylovací tabulky

Hašování. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

ALS1 Přednáška 1. Pravěpodobnost, náhodná proměnná, očekávaná hodnota náhodné proměnné, harmonická čísla

Návrh designu: Radek Mařík

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

HASHING GENERAL Hashovací (=rozptylovací) funkce

TÉMATICKÝ OKRUH TZD, DIS a TIS

Algoritmizace Hashing II. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

Binární vyhledávací stromy pokročilé partie

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmy II. Otázky k průběžnému testu znalostí

Binární vyhledávací stromy II

Jak funguje asymetrické šifrování?

Složitosti základních operací B + stromu

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

HASHING GENERAL Hashovací (=rozptylovací) funkce

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

Vyhledávání, zejména rozptylování

Algoritmy výpočetní geometrie

Spojová implementace lineárních datových struktur

Návrh Designu: Radek Mařík

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Pravděpodobnostní algoritmy

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

vyhledávací stromové struktury

Rozptylovací tabulky

Dynamické programování UIN009 Efektivní algoritmy 1

Testování prvočíselnosti

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D.

5. Náhodná veličina. 2. Házíme hrací kostkou dokud nepadne šestka. Náhodná veličina nabývá hodnot z posloupnosti {1, 2, 3,...}.

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

Generování pseudonáhodných. Ing. Michal Dorda, Ph.D.

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Náhodný pokus Náhodným pokusem (stručněji pokusem) rozumíme každé uskutečnění určitého systému podmínek resp. pravidel.

Katedra aplikované matematiky FEI VŠB Technická univerzita Ostrava luk76/la1

Úvod do zpracování signálů

Základní datové struktury III: Stromy, haldy

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

1. Databázové systémy (MP leden 2010)

vyhledávací stromové struktury

Časová a prostorová složitost algoritmů

Základy algoritmizace. Pattern matching

Modely Herbrandovské interpretace

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Složitost Filip Hlásek

Stromy, haldy, prioritní fronty

Základy algoritmizace a programování

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Proudové šifry a posuvné registry s lineární zpětnou vazbou

Dynamické datové struktury III.

[1] samoopravné kódy: terminologie, princip

Prohledávání do šířky = algoritmus vlny

Intervalová data a výpočet některých statistik

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

Úvod do informatiky. Miroslav Kolařík

Statistická teorie učení

Hashovací funkce. Andrew Kozlík KA MFF UK

Numerická stabilita algoritmů

Determinanty. Obsah. Aplikovaná matematika I. Pierre Simon de Laplace. Definice determinantu. Laplaceův rozvoj Vlastnosti determinantu.

Téma 22. Ondřej Nývlt

Bayesovské metody. Mnohorozměrná analýza dat

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Pokročilé neparametrické metody. Klára Kubošová

Výroková a predikátová logika - III

Rozhodnutí / Skutečnost platí neplatí Nezamítáme správně chyba 2. druhu Zamítáme chyba 1. druhu správně

Dynamické programování

KTE/TEVS - Rychlá Fourierova transformace. Pavel Karban. Katedra teoretické elektrotechniky Fakulta elektrotechnická Západočeská univerzita v Plzni

a) b) c) Radek Mařík

Soustavy lineárních rovnic a determinanty

POZOR klíč NENÍ index (adresa), ale podle klíče se hodnoty ukládají na indexy (adresy).

Základní datové struktury

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

Diskrétní matematika. DiM /01, zimní semestr 2016/2017

IB112 Základy matematiky

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

4. Trojúhelníkový rozklad p. 1/20

populace soubor jednotek, o jejichž vlastnostech bychom chtěli vypovídat letní semestr Definice subjektech.

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

1 Linearní prostory nad komplexními čísly

Pravděpodobnost a její vlastnosti

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr


Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

V kompletním grafu nenastává problém. Každý uzel je soused se zbytkem vrcholů a může s nimi kdykoliv komunikovat.

Transkript:

do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava do programování, 2004/2005 Mnohé aplikace nepotřebují ke svému provozu celou škálu operací podporovaných v dynamických strukturách (např. stromech), ale vystačí jen s operacemi Insert, Search, Delete. Například kompilátory programovacích jazyků potřebují spravovat tabulky identifikátorů vpřekládaném programu a dá se předpokládat, že kompilátor nebude potřebovat operace výběru nejmenšího identifikátoru a podobné. Dalším příkladem může být disková cache (např. perzistentní datové struktury). c 2005 Michal Krátký, Jiří Dvorský do programování 1/31 c 2005 Michal Krátký, Jiří Dvorský do programování 2/31 nabízí nástroje jak vytvářet velice efektivní tabulky, kde složitost vyhledávání je, za několika rozumných předpokladů, rovna O(1). I když nejhorší případ je stále Θ(n). a hashovací tabulky jsou rozšířením standardních polí. používají přímo klíče jako indexy v poli, hashovací tabulky transformují prostor klíčů o velmi velké mohutnosti pomocí hashovací funkce do relativně malého prostoru indexů pole. Přímé adresování je jednoduchá technika, která dobře funguje, pokud univerzum klíčů U má malou mohutnost. Předpokládejme, že aplikace potřebuje ke své činnosti dynamicky se měnící množinu a klíče prvků množiny náleží do univerza U = {0, 1,...,m 1}, kde m není velké. Dále předpokládejme, že žádné dva prvky nemají shodné klíče. Pro reprezentaci takové množiny použijeme pole nebo přímo adresovatelnou tabulku T [0...m 1]. Každá pozice (slot) koresponduje s nějakým klíčem univerza U. c 2005 Michal Krátký, Jiří Dvorský do programování 3/31 c 2005 Michal Krátký, Jiří Dvorský do programování 4/31 Slot k ukazuje na prvek s klíčem k. Jestliže množina neobsahuje prvek s klíčem k, pak tento slot má hodnotu NULL. Všechny tyto operace jsou velice rychlé pracují v čase O(1). c 2005 Michal Krátký, Jiří Dvorský do programování 5/31 Hlavní problém s přímým adresováním je zřejmý: jestliže univerzum U je velké, udržování tabulky T velikosti U je nemožné ( U = 2 32 ). Množina všech aktuálně uložených klíčů K (K U) může být ovšem relativně malá vzhledem k množině U. Jestliže K U, hashovací tabulka spotřebuje mnohem méně místa než přímo adresovatelná tabulka. Pamět ové nároky mohou být redukovány na Θ( K ), při zachování původní složitosti vyhledání prvku, totiž O(1). c 2005 Michal Krátký, Jiří Dvorský do programování 6/31

- kolize V přímo adresovatelné tabulce je prvek s klíčem k uložen ve slotu k. V hashovací tabulce je uložen ve slotu h(k), kde h je hashovací funkce. h zobrazuje univerzum klíčů U na sloty hashovací tabulky T [0...m 1]: Dva klíče se mohou hashovací funkcí zobrazit na tentýž slot dojde ke kolizi. Existují účinné techniky jak kolize prvků řešit. h : U {0, 1,...,m 1} Říkáme, že prvek s klíčem k je hashován do slotu h(k), říkáme také, že h(k) je hashovací hodnota klíče k. Hlavním účelem hashovací funkce je transformace klíčů z univerza U do jednotlivých slotů. Místo původních U klíčů stačí udržovat jen m hodnot. c 2005 Michal Krátký, Jiří Dvorský do programování 7/31 c 2005 Michal Krátký, Jiří Dvorský do programování 8/31 Separátní řetězení Nejvýhodnější hashovací funkce úplně zabraňuje nebo alespoň minimalizuje počet kolizí. Můžeme použít funkce s náhodným chováním. Funkce h musí být deterministická pro každý klíč musí vždy spočítat stejnou hodnotu h(k). Jelikož U > m musí nevyhnutelně existovat dva kolidující klíče a úplné odstranění kolizí není možné. Kvalitním návrhem hashovací tabulky a hashovací funkce lze výrazně zmenšit počet kolizí. Řešení kolizí : separátní řetězení a otevřené adresování. V hashovací tabulce je v každém slotu ukazatel na seznam a prvky se stejnou hodnotou hashovací funkce se vkládají do příslušného seznamu. c 2005 Michal Krátký, Jiří Dvorský do programování 9/31 c 2005 Michal Krátký, Jiří Dvorský do programování 10/31 Časová složitost vkládání je v nejhorším případě O(1) za předpokladu, že vkládaný prvek není dosud v hashovací tabulce. Časová složitost vyhledávání a rušení prvku je úměrná délce seznamu ve slotu. Necht je dána hashovací tabulka T s m sloty ve které je uloženo n prvků. Číslo α = n m se nazývá faktor naplnění hashovací tabulky. Je zřejmé, že toto číslo udává zároveň iprůměrnou délku seznamu ve slotu. Při dalších úvahách budeme α považovat za konstantní a hodnoty m a n necháme růst k nekonečnu. V nejhorším případě se všech n klíčů se hashuje do jednoho slotu a vytváří tak seznam délky n. Složitost pro nejhorší případ je tedy Θ(n) plus čas nutný pro výpočet hashovací funkce. Situace je stejná jako bychom použili jednoduchý seznam. Složitost průměrného případu závisí na tom, jak hashovací funkce rozptýlí jednotlivé klíče do prostoru slotů. Předpokládejme, že libovolný klíč je hashován do všech slotů stejně pravděpodobně, nezávisle na tom kam se hashovaly ostatní klíče. Takové hashování nazýváme jednoduché uniformní hashování. c 2005 Michal Krátký, Jiří Dvorský do programování 11/31 c 2005 Michal Krátký, Jiří Dvorský do programování 12/31

Předpokládejme, že výpočet hodnoty hashovací funkce h pro klíč k jsme schopni provést v čase O(1) a čas nutný pro prohledání seznamu ve slotu T [h(k)] tabulky T je lineárně závislý na délce tohoto seznamu. Zbývá zjistit jaký je průměrný počet klíčů, které musíme porovnat s klíčem k abychom zjistili, jestli se klíč k v tabulce vyskytuje. Mohou nastat dva případy: bud budeme při hledání úspěšní nebo neúspěšní. Průměrná časová složitost neúspěšného vyhledání v hashovací tabulce se separátním zřetězením je Θ(1 + α), za předpokladu jednoduchého uniformního hashování. Průměrná časová složitost úspěšného vyhledání v hashovací tabulce se separátním zřetězením je Θ(1 + α), zapředpokladu jednoduchého uniformního hashování. Jinými slovy nám tento výpočet říká následující: jestliže velikost hashovací tabulky je úměrná počtu prvků v tabulce tj. n = O(m), potom α = n/m = O(m)/m = O(1). Proto vprůměru lze vyhledávání realizovat v konstantním čase. Při použití obousměrného seznamu lze v průměrném případě rušit prvky se složitostí O(1). c 2005 Michal Krátký, Jiří Dvorský do programování 13/31 c 2005 Michal Krátký, Jiří Dvorský do programování 14/31 Otevřené adresování Otevřené adresování Při použití otevřeného adresování jsou všechny prvky uloženy přímo v hashovací tabulce. Každý slot tabulky obsahuje bud nějaký prvek nebo je prázdný. Při hledání prvku v tabulce systematicky prohledáváme sloty tabulky dokud nenajdeme hledaný prvek nebo najdeme prázdný slot. α 1. Hlavní výhodou otevřeného adresování je úspora místa, poněvadž místo ukazatelů tato metoda vypočítává posloupnost slotů, které je nutno prozkoumat. Pamět nutnou k uložení ukazatelů v seznamech prvků můžeme věnovat na zvýšení počtu slotů hashovací tabulky, čímž dosáhneme zmenšení počtu kolizí a vyššího výkonu. Při 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 slotů, které budeme prozkoumávat. Místo fixní posloupnosti 0, 1,...,m 1, což by vedlo na složitost hledání Θ(n), vybereme takovou posloupnost slotů, která závisí na vkládaném klíči. Pro určení posloupnosti rozšíříme definici hashovací funkce tak, aby zahrnovala i pořadí pokusu: h : U {0, 1,...,m 1} {0, 1,...,m 1} c 2005 Michal Krátký, Jiří Dvorský do programování 15/31 c 2005 Michal Krátký, Jiří Dvorský do programování 16/31 Otevřené adresování Posloupnost pokusů Otevřené adresování Rušení prvků Pro každý klíč k obdržíme posloupnost pokusů (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álně použit pro uložení prvku s klíčem k. Algoritmus vyhledávání klíče k prochází stejnou posloupnost slotů jako algoritmus pro vložení klíče k. Vyhledávání skončí bud úspěšně klíč k je nalezen v některém z testovaných slotů. A naopak vyhledávání končí neúspěšně, pokud jsme narazili na prázdný slot. Smazání prvku je velice obtížné. Když smažeme prvek ze slotu i, nelze tento slot jednoduše označit za prázdný. Tímto bychom mohli narušit posloupnost pokusů pro jiný klíč, který testoval slot i azpůsobil v něm kolizi a tudíž musel pokračovat v pokusech až do nějakého jiného slotu j. Jednou možností jak řešit tento problém je označit slot speciálním pří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 jen na faktoru naplnění tabulky α. Proto, když se požaduje mazání prvků z hashovací tabulky, volí se obvykle metoda separátního řetězení. c 2005 Michal Krátký, Jiří Dvorský do programování 17/31 c 2005 Michal Krátký, Jiří Dvorský do programování 18/31

Otevřené adresování Otevřené adresování Lineární pokusy V dalších analýzách činnosti hashovacích tabulek předpokládáme tzv. uniformní hashování, které tvrdí, že pro každý klíč jsou všechny permutace {0, 1,...,m 1} posloupnosti pokusů stejně pravděpodobné. Zobecnění jednoduchého uniformního hashování generující se stejnou pravděpodobností jedno číslo. Tři nejpoužívanější techniky pro generování posloupnosti pokusů: metodu lineárních pokusů (linear probing), metodu kvadratických pokusů (quadratic probing) a dvojité hashování (double hashing). Žádná z těchto metod nesplňuje přesně požadavky kladené na uniformní hashování (generují méně než m 2 posloupností pokusů, místo m! různých posloupností). Dvojité hashování je schopno vygenerovat nejvíce různých posloupností. c 2005 Michal Krátký, Jiří Dvorský do programování 19/31 Mějme dánu jednoduchou hashovací funkci h : U {0, 1,...,m 1}. Metoda lineárních pokusů používá rozšířenou hashovací funkci: h(k, i) =(h (k)+i) mod m pro i = 0, 1,...,m 1. Pro klíč 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řetočí a pokračujeme sloty T [0], T [1] až nakonec prozkoumáme slot T [h (k) 1]. Můžeme vygenerovat jen m pokusných sekvencí. Metoda lineárních pokusů je snadno implementovatelná, ale vyvolává problém s tzv. primárním shlukováním prvků, které mají tendenci se shlukovat v řetězcích. c 2005 Michal Krátký, Jiří Dvorský do programování 20/31 Otevřené adresování Metoda kvadratických pokusů Metoda kvadratických pokusů používá hashovací funkci tvaru h(k, i) =(h (k)+c 1 i + c2 2 i) mod m kde h je pomocná Metoda kvadratických pokusů, c 1 0 a c 2 0 jsou pomocné konstanty a i = 0, 1,...,m 1. Prvně je otestován slot T [h (k)]; další sloty jsou testovány v pořadí určeném funkcí h. Vzhledem k jejímu kvadratickému charakteru nenastává zde tak silné shlukování jako v případě lineárních pokusů, ale jen tzv. sekundární shlukování (secondary clustering), které se podstatně méně projevuje na počtu potřebných pokusů k nalezení hledaného prvku. Otevřené adresování Dvojité hashování Dvojité hashování je patrně nejlepší metodou pro určení sekvence pokusů při otevřeném adresování, protože permutace slotů poskytované touto metodou mají nejblíže k náhodně voleným permutacím. Dvojité hashování používá hashovací funkci tvaru: h(k, i) =(h 1 (k)+ih 2 (k)) mod m kde h 1 a h 2 jsou pomocné hashovací funkce. Na počátku je testován slot T [h 1 (k)]; následující pokusy jsou určeny posunem o h 2 (k) pozic modulo m. Je jasné, že dvojité hashování umožňuje větší rozptyl pro výběr sekvencí pokusů, protože na klíči k závisí nejen počáteční pozice, ale i velikost kroku o který se v tabulce posunujeme. c 2005 Michal Krátký, Jiří Dvorský do programování 21/31 c 2005 Michal Krátký, Jiří Dvorský do programování 22/31 Otevřené adresování Dvojité hashování Otevřené adresování Dvojité hashování Je dána hashovací tabulka velikosti 13, hashovací funkce h 1 (k) = k mod 13 a h 2 (k) = 1 + (k mod 11). Protože 14 1 mod 13 a 14 3 mod 11, klíč 14 bude vložen do prázdného slotu 9, po prozkoumání obsazených slotů 1 a 5. Velikost tabulky m se většinou volí prvočíselná a funkce h 2 se navrhuje tak, aby vždy vracela kladné číslo menší než m. Například se dají použít tyto funkce: h 1 (k) =k mod m h 2 (k) =1 +(k mod m ) kde m je oněco menší než m (např. m 1, m 2). Dvojité hashování představuje zlepšení, protože je schopno generovat Θ(n 2 ) posloupností pokusů místo Θ(m). Je to dáno tím, že hodnoty h 1 (k) a h 2 (k) z nichž se tvoří výsledná hodnota hashovací funkce se mohou měnit nezávisle na sobě. c 2005 Michal Krátký, Jiří Dvorský do programování 23/31 c 2005 Michal Krátký, Jiří Dvorský do programování 24/31

Analýza otevřeného adresování Analýza otevřeného adresování Při analýze se budeme snažit vyjádřit počet pokusů při neúspěšném a úspěšném hledání jako funkci faktoru naplnění α, s tím že hodnoty n a m jdou k nekonečnu. Při použití otevřeného adresování může v každém slotu být nejvýše jeden prvek, proto n m a z toho plyne že α 1. Mějme dánu hashovací tabulku s otevřenou adresací s faktorem naplnění α = n/m < 1. Očekávaný počet pokusů při neúspěšném hledání je nejvýše 1/(1 α) za předpokladu uniformního hashování. Jestliže je α konstantní, věta tvrdí, že neúspěšné hledání lze provést v čase O(1). Například, jestliže hashovací tabulka je zaplněna z poloviny (α = 0, 5), očekávaný počet pokusů při neúspěšném hledání bude nejvýše 1/(1 0, 5) =2. Vložení prvku do hashovací tabulky s otevřenou adresací při faktoru naplnění α průměrně vyžaduje nejvýše 1/(1 α) pokusů zapředpokladu uniformního hashování. c 2005 Michal Krátký, Jiří Dvorský do programování 25/31 c 2005 Michal Krátký, Jiří Dvorský do programování 26/31 Analýza otevřeného adresování V hashovací tabulce s faktorem naplnění α<1, očekávaný počet pokusů při úspěšném hledání je nejvýše 1 α ln 1 1 α + 1 α za předpokladu uniformního hashování azapředpokladu, že každý klíč se bude vyhledávat se stejnou pravděpodobností. Jestliže je tedy například hashovací tabulka z poloviny plná, očekávaný počet pokusů je menší než 3, 387. Dobře navržená hashovací funkce splňuje (přibližně) předpoklad uniformního hashování tj. každý klíč se hashuje se stejnou pravděpodobností do libovolného z m slotů. Formálně, předpokládejme, že klíče jsou vybírány z nějakého univerza U podle pravděpodobností distribuční funkce P. Potom P(k) značí pravděpodobnost výběru klíče k. Předpoklad uniformního hashování lze zapsat jako P(k) = 1 pro j = 0, 1,...,m 1 m k:h(k)=j c 2005 Michal Krátký, Jiří Dvorský do programování 27/31 c 2005 Michal Krátký, Jiří Dvorský do programování 28/31 V praxi se hashovací funkcehashovací funkce většinou navrhují heuristickým způsobem. Využívá se přitom částečná představa o funkci P. Představme si například, že vyvíjíme tabulku symbolů pro kompilátor. Klíče v tomto případě budou řetězce znaků reprezentující identifikátory v programu. Lze předpokládat, že identifikátory nebudou vybírány rovnoměrně z množiny všech možných identifikátorů (tj. z množiny všech n-znakových řetězců), ale budou se pravděpodobně shlukovat, jako třeba identifikátory Item a Items. Dobře navržená hashovací funkce by měla tyto dva případy rozlišit. Rozsah hodnot hashovací funkce musí být přirozené číslo v rozsahu 0,...,m 1, kde m je velikost hashovací tabulky. Z toho plyne, že nejobvyklejší tvar hashovací funkce je h(k) =f (k) mod m, kde funkce f (k) vypočítá z klíče k číselnou hodnotu. Volba hodnoty m záleží na počtu hodnot, které chceme v tabulce ukládat. Dále záleží na technice řešení kolizí, abychom dosáhli optimální hodnoty faktoru naplnění α, při které je potřeba minimální počet pokusů. Tím je určena přibližná hodnota m. c 2005 Michal Krátký, Jiří Dvorský do programování 29/31 c 2005 Michal Krátký, Jiří Dvorský do programování 30/31

Volba m = 2 p nám sice umožní velice jednoduše vypočítat zbytek po dělení, ale tato volba není příliš vhodné, nebot v tomto případě bereme v úvahu jen nejnižších p bitů čísla f (k). Je vhodnější, aby hodnota hashovací funkce závisela na všech bitech čísla f (k). Nejvhodnější se obecně jeví volit m jako prvočíslo. Předpokládáme, že klíč k je tvořen posloupností bytů k = k 1 k 2...k r ). Funkce f (k) můžeme zvolit jako součet nebo součin všech bytů v klíči. f (k) = r i=1 k i nebo f (k) =Π r i=1 k i. c 2005 Michal Krátký, Jiří Dvorský do programování 31/31