Kukaččí hašování
Kukaččí hašování (en: Cuckoo hashing) je schéma v programování pro řešení kolizí hodnot hašovací funkce v hašovací tabulce. Kukaččí hašování bylo poprvé popsáno Rasmusem Paghem a Flemmingem Friche Rodlerem v 2001.[1] Jméno metody je odvozeno od chování některých druhů kukaček, u kterých mládě po vylíhnutí vyhodí původní vajíčka nebo mláďata z hnízda.
Teorie
Základní myšlenka je použít dvě hašovací funkce místo jedné. To poskytne dvě možné umístění v hašovací tabulce pro každý klíč. V jedné obecně užívané variantě algoritmu je hašovací tabulka rozdělena na dvě menší stejně veliké tabulky a každá hašovací funkce indexuje do jedné z nich.
Když je vkládán nový klíč, použije se hladový algoritmus: nový klíč se vloží na jedno ze svých dvou možných umístění, přičemž "vykopne", tj. nahradí jiný klíč, který tam je případně umístěn. Tento nahrazovaný klíč je pak umístěn na svoje alternativní umístění, kde případně opět vykopne prvek tam sídlící. Přemísťování pokračuje, dokud se nenajde volná pozice anebo se metoda zacyklí. V tom případě je hašovací tabulka přehašována na místě[2] za použití nových hašovacích funkcí
Vyhledání potřebuje zkontrolovat pouze dvě pozice v hašovací tabulce, což zabere konstantní čas v nejhorším případě (viz Asymptotická složitost). Tím se liší od mnoha jiných hašovacích metod, které nemají konstantní omezení časové složitosti pro nejhorší případ vyhledávání.
Dá se ukázat, že vkládání do hašovací tabulky uspěje v konstantním očekávaném čase[1], i když zahrneme potřebu přebudování tabulky, pokud je počet klíčů menší než polovina kapacity tabulky, tj. faktor naplnění je pod 50%. [3]
Zobecnění a aplikace
Zobecnění kukaččího hašování, které používá víc než 2 hašovací funkce, bude efektivně využívat větší část kapacity tabulek, ale za cenu menší rychlosti vkládání a vyhledávání. Použití již tří hašovacích funkcí zvyšuje naplnění na 91%. Jiná generalizace kukaččího hašování používá víc než 1 klíč na pozici. Už použití dvou klíčů na pozici dovoluje faktor naplnění přes 80%.
Jiné algoritmy, které používají víc hašovacích funkcí, zahrnují Bloomův filtr. Kukaččí hašování lze použít na implementaci datové struktury ekvivalentní Bloomovu filtru. Zjednodušená generalizace kukaččího hašování (viz CPU cache, CPU cache#Asociativita, en: skewed-associative cache) se používá v některých CPU cache.[zdroj?]
Článek od Zukowski et al.[4] ukázal, že kukaččí hašování je mnohem rychlejší než zřetězené hašování pro malé hašovací tabulky umístěné v cache na moderních procesorech. Kenneth Ross[5] ukázal, že více položková verze kukaččího hašování (varianty, které používají pozice s více než jednou položkou) je rychlejší než konvenční metody taky pro velké hašovací tabulky, pokud je zaplnění vysoké. Výkonnost více položkové kukaččí hašovací tabulky byla zkoumána dále Askitisem,[6], kde její chování porovnával vůči alternativním hašovacím schématům.
Přehled od Mitzenmachera[7] uvádí otevřené problémy v souvislosti s kukaččím hašováním v roce 2009.
Související články
- Perfektní hašování
- Lineární zkoušení
- Kvadratické zkoušení
- Dvojité hašování
- Hašovací kolize
- Hašovací funkce
Reference
- PAGH, Rasmus, Rodler, Flemming Friche. Cuckoo Hashing. [s.l.]: [s.n.], 2001. Dostupné online. DOI 10.1.1.25.4189. (anglicky)
- Pagh and Rodler: "There is no need to allocate new tables for the rehashing: We may simply run through the tables to delete and perform the usual insertion procedure on all keys found not to be at their intended position in the table."
- KUTZELNIGG, Reinhard. Fourth Colloquium on Mathematics and Computer Science. [s.l.]: [s.n.], 2006. (Discrete Mathematics and Theoretical Computer Science; sv. AG). [http://www.dmtcs.org/dmtcs-ojs/index.php/proceedings/art icle/viewFile/590/1710 Dostupné online]. Kapitola Bipartite random graphs and cuckoo hashing, s. 403–406. (anglicky)[nedostupný zdroj].
- ZUKOWSKI, Marcin, Heman, Sandor; Boncz, Peter. Architecture-Conscious Hashing. www.cs.cmu.edu. Proceedings of the International Workshop on Data Management on New Hardware (DaMoN), 2006-06. Dostupné online [cit. 2008-10-16]. (anglicky)
- ROSS, Kenneth. Efficient Hash Probes on Modern Processors. domino.research.ibm.com. IBM Research Report RC24100, 2006-11-08. [http://domino.research.ibm.com/library/cyberdig.nsf/papers/DF54E3545C82E8A585257222006FD9A2/$File/rc24 100.pdf Dostupné online] [cit. 2008-10-16]. RC24100. (anglicky)
- ASKITIS, Nikolas. Fast and Compact Hash Tables for Integer Keys. [s.l.]: [s.n.], 2009. Dostupné v archivu pořízeném dne 2011-02-16. ISBN 978-1-920682-72-9. S. 113–122. (anglicky) Archivovaná kopie. crpit.com [online]. [cit. 2011-06-26]. Dostupné v archivu pořízeném z originálu.
- MITZENMACHER, Michael. Some Open Questions Related to Cuckoo Hashing. www.eecs.harvard.edu. 2009-09-09. Dostupné online [cit. 2010-11-10]. (anglicky)
- A cool and practical alternative to traditional hash tables, U. Erlingsson, M. Manasse, F. Mcsherry, 2006.
- Cuckoo Hashing for Undergraduates, 2006, R. Pagh, 2006.
- Cuckoo Hashing, Theory and Practice (Part 1, Part 2 and Part 3), Michael Mitzenmacher, 2007.
- Naor, Moni; Segev, Gil; Wieder, Udi (2008). "History-Independent Cuckoo Hashing". International Colloquium on Automata, Languages and Programming (ICALP). Retrieved on 2008-07-21.
Externí odkazy
- Cuckoo hash map written in C++
- Static cuckoo hashtable generator for C/C++
- Cuckoo hashtable written in Java
- Generic Cuckoo hashmap in Java[nedostupný zdroj]
V tomto článku byl použit překlad textu z článku Cuckoo hashing na anglické Wikipedii.