Vytvoření dokonalé hash (všechny po sobě jdoucí vědra plná) gperf nebo alternativy?

hlasů
3

Řekněme, že chcete vytvořit dokonalé hash tabulky pro vyhledávání pole, kde předdefinované klíče je 12 měsíců, což bych chtěl

hash(January)==0
hash(December)==11

Vedu své názvy měsíců prostřednictvím gperf a dostal pěkný hash funkce, ale zdá se, že rozdat 16 kbelíků (nebo spíše rozsah je 16)!

#define MIN_HASH_VALUE 3
#define MAX_HASH_VALUE 18
/* maximum key range = 16, duplicates = 0 */

Při pohledu na generovaný gperf kódu, jeho hash kód funkce dělá jednoduchý návrat vyhledávání len a char hodnoty od 256 velikost stolu. Nějak v hlavě jsem si představoval chuť vypadající funkci ... :)

Co když chci přesně 12 věder (tj nechci přeskočit nevyužité kbelíky)? U malých sériích, protože to, je to opravdu nezáleží na tom, ale když mám 1000 předdefinované klíče a chcete přesně se 1000 kbelících v řadě?

Dá se najít deterministický způsob, jak to udělat?

Položena 20/11/2009 v 15:02
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
4

Zajímal jsem se o odpovědi na tuto otázku a přišel k němu prostřednictvím hledání gperf. Zkoušel jsem gperf, ale to bylo velmi pomalé na velké vstupní soubor, a proto nezdálo vhodné. Zkoušel jsem cmph ale nebyl jsem s ní spokojeni. To vyžaduje budování soubor, který je pak vložen do programu v běhu C. Dále program je tak křehký (zhroucení s „poruchy segmentace“ na jakékoliv mylné vstupu), které jsem to věřit. Další vyhledávání Google mě vedlo k této stránce , a dále do mph . Stáhnul jsem si mph a zjistil, že je to velmi příjemné. To má volitelný program pro generování souboru C, s názvem „emitc“, a používat to jako

 mph < systemdictionaryfile | emitc > output.c

pracoval téměř okamžitě (několik sekund se slovníkem asi 200.000 slov) a vytvořili soubor pracovní C, který sestavuje bez problémů. Mé testy také ukazují, že to funguje. I nebyly testovány na výkon algoritmu hash ještě ačkoli.

Odpovězeno 04/12/2009 v 14:25
zdroj uživatelem

hlasů
4

Jedinou alternativou k gperf vím, že je cmph: http://cmph.sourceforge.net/ ale jak řekl Jerome v komentáři, který má 16 kbelíky vám poskytuje určitý rychlostní výhodu.

Když jsem se poprvé podíval na minimální dokonalé hasihing jsem našel velmi zajímavé čtení o CiteseerX ale odolal pokušení vyzkoušet kódování jedno z těchto řešení sám. Vím, že bych skončit s horší řešení, pokud jde o gperf nebo cmph, nebo dokonce za předpokladu, že roztok byl srovnatelný, tak bych musel strávit spoustu času na to.

Odpovězeno 20/11/2009 v 15:31
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more