Hopscotch hash - Hopscotch hashing
Hopscotch hash je schéma v programování k vyřešení hashovací kolize hodnot hashovací funkce v stůl použitím otevřené adresování. Je také vhodný pro implementaci a souběžná hash tabulka. Hopscotch hash byl zaveden uživatelem Maurice Herlihy, Nir Shavit a Moran Tzafrir v roce 2008.[1] Název je odvozen od posloupnosti chmele, které charakterizují algoritmus vkládání tabulky.
Algoritmus používá jediné pole n kbelíky. Pro každý kbelík jeho sousedství je malá sbírka H po sobě jdoucí segmenty (tj. segmenty s indexy blízkými původnímu hašovanému segmentu). Požadovanou vlastností sousedství je to, že náklady na nalezení položky v kbelících sousedství se blíží nákladům na nalezení v samotném kbelíku (například tím, že kbelíky v sousedství spadají do stejné řádek mezipaměti ). Velikost sousedství musí být v nejhorším případě dostatečná, aby pojala logaritmický počet položek (tj. Musí pojmout log (n) položky), ale v průměru jen konstantní počet. Pokud je vyplněno okolí nějakého kbelíku, změní se velikost tabulky.
V hopscotch hash, jako v kukačka hash a na rozdíl od v lineární sondování, bude daná položka vždy vložena do a nalezena v sousedství jejího hashovaného kbelíku. Jinými slovy, bude vždy nalezen buď v původní položce hashovaného pole, nebo v jedné z následujících H-1 sousední položky. H může být například 32, běžná velikost strojového slova. Sousedství je tedy „virtuální“ segment, který má pevnou velikost a překrývá následující H-1 kbelíky. Pro urychlení hledání obsahuje každý segment (položka pole) slovo „hop-information“, an H-bitová bitmapa, která označuje, která z následujících H-1 položky obsahují položky, které jsou hašovány do virtuálního bloku aktuální položky. Tímto způsobem lze položku rychle vyhledat tak, že se podíváte na slovo, abyste zjistili, které položky patří do kbelíku, a poté skenujte přes konstantní počet položek (většina moderních procesorů podporuje speciální operace manipulace s bitem, díky nimž je vyhledávání v -informační "bitmapa velmi rychlá).
Zde je způsob přidání položky X který byl hašován do kbelíku i:
- Pokud je hop-informační slovo pro kbelík i ukazuje, že již existují H položky v tomto kbelíku, tabulka je plná; rozbalte hashovací tabulku a zkuste to znovu.
- Počínaje vstupem i, použijte lineární sondu k vyhledání prázdné položky v indexu j. (Pokud neexistuje žádný prázdný slot, tabulka je plná.)
- Zatímco (j−i) mod n ≥ H, posuňte prázdný slot směrem k i jak následuje:
- Prohledat H-1 předchozí sloty j pro položku y jehož hash hodnota k je uvnitř H-1 z j, tj. (j−k) mod n < H. (To lze provést pomocí informačních slov hop.)
- Pokud taková položka neexistuje y existuje v rozsahu, tabulka je plná.
- Hýbat se y na j, čímž se vytvoří nový prázdný slot blíže k i.
- Soubor j do prázdné pozice uvolněné uživatelem y a opakovat.
- Obchod X ve slotu j a zpět.
Myšlenka je, že hašování pekla „přesune prázdný slot směrem k požadovanému kbelíku“. Tím se odlišuje od lineární sondování který ponechává prázdný slot, kde byl nalezen, pravděpodobně daleko od původního kbelíku nebo od kukačka hash který za účelem vytvoření volného segmentu přesune položku z jednoho z požadovaných segmentů v cílových polích a až poté se pokusí najít přemístěnou položku na nové místo.
Chcete-li odebrat položku z tabulky, jednoduše ji odeberete ze záznamu v tabulce. Pokud jsou sousední segmenty zarovnány do mezipaměti, je možné použít operaci reorganizace, ve které jsou položky přesunuty do nyní prázdného místa, aby se zlepšilo zarovnání.
Jednou z výhod hashcotch hash je, že poskytuje dobrý výkon při velmi vysokých faktorech zatížení tabulky, dokonce i těch, které přesahují 0,9. Část této účinnosti je způsobena používáním lineární sondy pouze k vyhledání prázdného slotu během vkládání, nikoli pro každé vyhledávání jako v originálu lineární sondování algoritmus hash tabulky. Další výhodou je, že lze použít jakoukoli hashovací funkci, zejména jednoduchou, která je blízká univerzální.
Viz také
- Kukaččí hash
- Hash kolize
- Funkce hash
- Lineární snímání
- Otevřete adresování
- Perfektní hashování
- Kvadratické sondování
Reference
- ^ Herlihy, Maurice; Shavit, Nir; Tzafrir, Moran (2008). „Hopscotch hashing“ (PDF). DISC '08: Sborník z 22. mezinárodního sympozia o distribuovaných výpočtech. Arcachon, Francie: Springer-Verlag. 350–364.
externí odkazy
- libhhash - implementace hash C hopscotch
- hopscotch-map - implementace hash mapy v C ++ pomocí hopscotch hash
- Goossaert, Emmanuel (11. srpna 2013). "Hopscotch hash". Citováno 16. října 2019. Podrobný popis a příklad implementace.