Perfektní hashovací funkce - Perfect hash function
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 x ∈ S 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 l ← 1,2,... (6) repeat forming Ki ← {Φl(x)|x ∈ Bi} (6) until |Ki|=|Bi| and Ki∩{j|T[j]=1}= ∅ (7) let σ(i):= the successful l (8) for all j ∈ Ki 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 l ← 1,2,... (6) repeat forming Ki ← {Φl(x)|x ∈ Bi} (6) until |Ki|=|Bi| and Ki∩{j|T[j]=k}= ∅ (7) let σ(i):= the successful l (8) for all j ∈ Ki 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í
- Richard J. Cichelli. Jednoduché minimální funkce hash , komunikace ACM, sv. 23, číslo 1, leden 1980.
- Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest a Clifford Stein . Úvod do algoritmů , třetí vydání. MIT Press, 2009. ISBN 978-0262033848 . Oddíl 11.5: Dokonalé hašování, s. 267, 277–282.
- Fabiano C. Botelho, Rasmus Pagh a Nivio Ziviani. „Perfektní hašování pro aplikace pro správu dat“ .
- Fabiano C. Botelho a Nivio Ziviani . „Externí dokonalé hašování pro velmi velké sady klíčů“ . 16. konference ACM o řízení informací a znalostí (CIKM07), Lisabon, Portugalsko, listopad 2007.
- Djamal Belazzougui, Paolo Boldi, Rasmus Pagh a Sebastiano Vigna. „Monotónní minimální dokonalé hašování: Hledání seřazené tabulky s přístupy O (1)“ . In Proceedings of the 20th Annual ACM-SIAM Symposium On Discrete Mathematics (SODA), New York, 2009. ACM Press.
- Douglas C. Schmidt, GPERF: Generátor funkcí Perfect Hash , C ++ Report, SIGS, sv. 10, č. 10, listopad/prosinec 1998.
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.