Perfektní hashovací funkce - Perfect hash function

Image
Perfektní hashovací funkce pro čtyři zobrazená jména
Image
Minimální dokonalá hashovací funkce pro čtyři zobrazená jména

Ve vědě o počítačích , je ideální hash funkce h po nastavenou S je hash funkce , která mapuje různé prvky S do množiny m čísel, s žádnými srážkami . Z matematického hlediska se jedná o injektivní funkci .

K implementaci vyhledávací tabulky s konstantní dobou přístupu v nejhorším případě lze použít perfektní hashovací funkce . Perfektní hashovací funkci lze, stejně jako jakoukoli hashovací funkci , použít k implementaci hashovacích tabulek , s výhodou, že nemusí být implementováno žádné řešení kolizí . Kromě toho, pokud klíče nejsou data a pokud je známo, že dotazované klíče budou platné, pak klíče nemusí být uloženy ve vyhledávací tabulce, což šetří místo.

Nevýhody perfektních hashovacích funkcí spočívají v tom, že S musí být známý pro konstrukci dokonalé hashovací funkce. Pokud se změní S, je třeba znovu vytvořit nedynamické dokonalé hašovací funkce . Pro často se měnící dynamické S dynamické lze použít hashovací funkce za cenu dalšího místa. Požadavek na prostor pro uložení dokonalé hashovací funkce je v O ( n ) .

Důležitými výkonnostními parametry pro dokonalé hashovací funkce jsou čas vyhodnocení, který by měl být konstantní, doba výstavby a velikost reprezentace.

aplikace

Dokonalou hashovací funkci s hodnotami v omezeném rozsahu lze použít pro efektivní operace vyhledávání umístěním klíčů od S (nebo jiných přidružených hodnot) do vyhledávací tabulky indexované výstupem funkce. Poté můžete vyzkoušet, zda je klíč přítomen v S , nebo vyhledat hodnotu spojenou s tímto klíčem, a to tak, že ho vyhledáte v buňce tabulky. Každé takové vyhledávání vyžaduje v nejhorším případě konstantní čas . Díky dokonalému hašování lze související data číst nebo zapisovat jediným přístupem k tabulce.

Výkon dokonalých hashovacích funkcí

Důležitými výkonnostními parametry pro dokonalé hašování jsou velikost reprezentace, doba vyhodnocení, doba konstrukce a navíc požadavek na rozsah . Čas vyhodnocení může být stejně rychlý jako O ( 1 ) , což je optimální. Čas výstavby musí být alespoň O ( n ) , protože je třeba vzít v úvahu každý prvek v S a S obsahuje n prvků. Této spodní hranice lze dosáhnout v praxi.

Dolní hranice velikosti reprezentace závisí na m a n . Nechť m = (1+ε) n a h perfektní hashovací funkce. Dobrá aproximace spodní hranice je Bity na prvek. Pro minimální dokonalé hašování, ε = 0 , je dolní mez log e ≈ 1,44 bitů na prvek.

Konstrukce

Perfektní hashovací funkce pro konkrétní sadu S, kterou lze vyhodnotit v konstantním čase as hodnotami v malém rozsahu, lze nalézt pomocí randomizovaného algoritmu v řadě operací, které jsou úměrné velikosti S. Původní konstrukce Fredman, Komlós & Szemerédi (1984) používá schéma dvouúrovňové mapovat nastavenou s z n prvků rozmezí o ( n ), indexy, a pak mapovat každý index v rozmezí hash hodnoty. První úroveň jejich konstrukce volí velkou prvočíslo p (větší než velikost vesmíru, ze kterého je čerpáno S ), a parametr k a mapuje každý prvek x ze S na index

Pokud je k vybráno náhodně, bude mít tento krok pravděpodobně kolize, ale počet prvků n i, které jsou současně mapovány na stejný index i, bude pravděpodobně malý. Druhá úroveň jejich konstrukce přiřazuje každému indexu i nesouvislé rozsahy celých čísel O ( n i 2 ) . Používá druhou sadu lineárních modulárních funkcí, jeden pro každý index i , mapovat každý člen x z S do rozmezí, které odpovídá g ( x ) .

Jak ukazují Fredman, Komlós & Szemerédi (1984) , existuje volba parametru k tak, že součet délek rozsahů pro n různých hodnot g ( x ) je O ( n ) . Navíc pro každou hodnotu g ( x ) existuje lineární modulární funkce, která mapuje odpovídající podmnožinu S do rozsahu spojeného s touto hodnotou. Oba k a funkce druhého stupně pro každou hodnotu g ( x ) , lze nalézt v polynomiálním čase volbou hodnot náhodně až do nalezení ten, který funguje.

Samotná hashovací funkce vyžaduje úložný prostor O ( n ) pro uložení k , p a všech lineárních modulárních funkcí druhé úrovně. Výpočet hodnoty hash daného klíče x lze provádět v konstantním čase výpočtem g ( x ) , vyhledáním funkce druhé úrovně spojené s g ( x ) a aplikací této funkce na x . Upravenou verzi tohoto dvouúrovňového schématu s větším počtem hodnot na nejvyšší úrovni lze použít ke konstrukci dokonalé hashovací funkce, která mapuje S do menšího rozsahu délky n + o ( n ) .


Novější metodu pro konstrukci dokonalé hashovací funkce popisují Belazzougui, Botelho & Dietzfelbinger (2009) jako „hash, displace, and compress“. Zde se také používá hashovací funkce g první úrovně k mapování prvků na rozsah r celých čísel. Prvek xS je uložen v Bucket B g (x) .

Poté, v sestupném pořadí podle velikosti, jsou prvky každého segmentu hašovány hašovací funkcí posloupnosti nezávislých plně náhodných hašovacích funkcí 1 , Φ 2 , Φ 3 , ...) , počínaje Φ 1 . Pokud hashovací funkce nevytváří žádné kolize pro segment a výsledné hodnoty ještě nejsou obsazeny jinými prvky z jiných segmentů, je pro tento segment vybrána funkce. Pokud ne, testuje se další hashovací funkce v pořadí.

K vyhodnocení dokonalé hashovací funkce h ( x ) stačí uložit mapování σ indexu lopaty g ( x ) na správnou hashovací funkci v pořadí, což má za následek h (x) = Φ σ (g (x)) .

Nakonec, aby se zmenšila velikost reprezentace, jsou (σ (i)) 0≤i <r komprimovány do formy, která stále umožňuje vyhodnocení v O ( 1 ) .

Tento přístup vyžaduje pro konstrukci lineární čas v n a konstantní čas vyhodnocení. Velikost zobrazení je v O ( n ) a závisí na dosaženém rozsahu. Například s m = 1,23 n Belazzougui, Botelho & Dietzfelbinger (2009) dosáhli velikosti reprezentace mezi 3,03 bity/klíč a 1,40 bity/klíč pro danou sadu příkladů 10 milionů záznamů, přičemž nižší hodnoty vyžadovaly delší dobu výpočtu. Spodní mezera v tomto scénáři je 0,88 bitů/klíč.

Pseudo kód

algorithm hash, displace, and compress is
(1) Split S into buckets Bi:=g-1({i})∩S,0≤i<r
(2) Sort buckets Bi in falling order according to size |Bi|
(3) Initialize array T[0...m-1] with 0's
(4) for all i∈[r], in the order from (2), do
(5)     for l1,2,...
(6)         repeat forming Ki{Φl(x)|xBi}
(6)         until |Ki|=|Bi| and Ki∩{j|T[j]=1}=∅
(7)     let σ(i):= the successful l
(8)     for all jKi let T[j]:=1
(9) Transform (σi)0≤i<r into compressed form, retaining O(1) access.

Prostor spodní hranice

Využití O ( n ) slov informací k uložení funkce Fredmana, Komlóse a Szemerédiho (1984) je téměř optimální: každá dokonalá hashovací funkce, kterou lze vypočítat v konstantním čase, vyžaduje alespoň určitý počet bitů, který je úměrný velikost S .

Pro minimální dokonalé hašovací funkce je dolní hranice teoretického prostoru informací

bitů/klíč.

Pro dokonalé hashovací funkce se nejprve předpokládá, že rozsah h je ohraničen n jako m = (1+ε) n . Podle vzorce Belazzougui, Botelho & Dietzfelbinger (2009) a pro vesmír, jehož velikost | U | = u směřuje k nekonečnu, spodní hranice prostoru je

bity/klíč, minus log ( n ) bitů celkově.

Rozšíření

Dynamické dokonalé hašování

Použití dokonalé hashovací funkce je nejlepší v situacích, kdy existuje často dotazovaná velká sada S , která se aktualizuje jen zřídka. Důvodem je, že jakákoli úprava sady S může způsobit, že hashovací funkce již nebude pro upravenou sadu perfektní. Řešení, která aktualizují funkci hash při každé úpravě sady, se nazývají dynamické dokonalé hašování , ale tyto metody se implementují poměrně komplikovaně.

Minimální dokonalá hashovací funkce

Minimální dokonalá hashovací funkce je perfektní hashovací funkce, která mapuje n klíčů na n po sobě jdoucích celých čísel - obvykle čísla od 0 do n - 1 nebo od 1 do n . Více formální způsob, jak vyjádřit to: Nechť j a k být prvky nějaké konečné množiny S . Pak h je minimální dokonalá hashovací funkce právě tehdy, když h ( j ) = h ( k ) implikuje j = k ( injektivita ) a existuje celé číslo a takové, že rozsah h je a .. a + | S | - 1 . Bylo prokázáno, že obecné schéma minimálního dokonalého hashování vyžaduje alespoň 1,44 bitů/klíč. Nejznámější v současnosti známá minimální dokonalá schémata hašování mohou být reprezentována pomocí méně než 1,56 bitů/klíč, pokud je k dispozici dostatek času.

k-dokonalé hašování

Funkce hash je k -perfektní, pokud je na stejnou hodnotu v rozsahu namapováno maximálně k prvků ze S. Algoritmus "hash, displace, and compress" lze použít ke konstrukci k -perfektních hashovacích funkcí povolením až k kolizím. Změny nezbytné k dosažení tohoto cíle jsou minimální a jsou podtrženy v upraveném pseudokódu níže:

(4) for all i∈[r], in the order from (2), do
(5)     for l1,2,...
(6)         repeat forming Ki{Φl(x)|xBi}
(6)         until |Ki|=|Bi| and Ki∩{j|T[j]=k}=∅
(7)     let σ(i):= the successful l
(8)     for all jKi set T[j]←T[j]+1

Zachování objednávky

Minimální dokonalá hashovací funkce F je zachování pořadí, pokud jsou klíče uvedeny v nějakém pořadí a 1 , a 2 , ..., a n a pro jakékoli klávesy a j a a k , j < k znamená F ( a j ) <F ( a k ) . V tomto případě je hodnota funkce pouze pozicí každého klíče v seřazeném pořadí všech klíčů. Jednoduchou implementací minimálních perfektních hashovacích funkcí zachovávajících řád s konstantní dobou přístupu je použití (obyčejné) dokonalé hashovací funkce nebo kukačkového hašování k uložení vyhledávací tabulky pozic každé klávesy. Pokud jsou klíče, které mají být hašovány, uloženy v tříděném poli, je možné uložit malý počet dalších bitů na klíč v datové struktuře, kterou lze použít k rychlému výpočtu hodnot hash. Minimální dokonalé hashovací funkce zachovávající pořadí vyžadují nutně Ω ( n log n ) bitů, které mají být reprezentovány.

Související konstrukce

Jednoduchou alternativou dokonalého hašování, která také umožňuje dynamické aktualizace, je hashování kukačky . Toto schéma mapuje klíče na dvě nebo více míst v rámci rozsahu (na rozdíl od dokonalého hašování, které mapuje každý klíč na jedno místo), ale dělá to takovým způsobem, že klíčům lze přiřadit individuální přístup k místům, do kterých byly zmapováno. Vyhledávání s tímto schématem je pomalejší, protože je třeba zkontrolovat více umístění, ale přesto trvat konstantní čas nejhoršího případu.

Reference

Další čtení

externí odkazy

  • gperf je open source generátor hash C a C ++ (velmi rychlý, ale funguje pouze pro malé sady)
  • Minimal Perfect Hashing (bob algoritmus) od Boba Jenkinse
  • cmph : C Minimal Perfect Hashing Library, implementace open source pro mnoho (minimálních) dokonalých hashů (funguje pro velké sady)
  • Sux4J : monotónní open source minimální dokonalé hašování v Javě
  • MPHSharp : dokonalé metody hašování v C#
  • BBHash : minimální dokonalá hashovací funkce v C ++ pouze pro záhlaví
  • Perfect :: Hash , perfektní hash generátor v Perlu, který dělá C kód. Má sekci "předchozí umění", kterou stojí za to si prohlédnout.