2009-05-13 9 views
2

Ich las über das Interview dieser Person "bei einer bekannten Suchfirma".Muss eine Ausgabe der Hash-Funktion kleiner als die Anzahl der Buckets sein?

http://asserttrue.blogspot.com/2009/05/one-of-toughest-job-interview-questions.html

Er wurde eine Frage gestellt, die ihn dazu brachte, eine Hash-Tabelle implementiert. Er sagte, die folgenden:

HASH = INITIAL_VALUE; 
FOR EACH (CHAR IN WORD) { 
HASH *= MAGIC_NUMBER 
HASH ^= CHAR 
HASH %= BOUNDS 
} 
RETURN HASH 

I erklärt, dass die Hash-Tabellenarray Länge prime sein sollte, und die Grenzen Zahl kleiner als die Tischlänge, aber coprime auf die Tischlänge.

Warum sollte die BOUNDS-Nummer kleiner als die Anzahl der Buckets sein? Was bewirkt die Koprime gegenüber der Tischlänge? Sollte es nicht ein Nebeneinander der BOUNDS sein?

Antwort

4

Ich würde riskieren, dass er völlig falsch ist. BOUNDS sollte die Anzahl der Buckets sein oder die letzten paar Buckets werden zu wenig genutzt.

Weiterhin sollte die Begrenzung der Ausgabe auf die Anzahl der Buckets außerhalb der Hash-Funktion sein. Dies ist ein Implementierungsdetail dieser bestimmten Hash-Tabelle. Sie haben möglicherweise eine sehr große Tabelle mit vielen Eimern und eine andere mit wenigen. Beide sollten die gleiche Zeichenfolge teilen -> Hash-Funktion

Weiter, wenn Sie die Seite lesen, die Sie mit ihm verknüpft ist ziemlich interessant. Ich hätte seine Hash-Tabelle als etwas wie 10.000 Eimer umgesetzt - Für diejenigen, die es nicht gelesen haben, schlägt der Artikel ~ 4.000.000.000 Eimer vor, um 1.000.000 oder so mögliche Wörter zu speichern. Bei Kollisionen hat jeder Bucket einen Vektor von Wortstrukturen, von denen jede eine Zählung, eine Klartextzeichenfolge und einen Hash (einzigartig innerhalb des Buckets) enthält. Dies würde viel weniger Speicher benötigen und besser mit modernen Caches arbeiten, da Ihr Arbeitssatz viel kleiner wäre.

Um die Speicherauslastung weiter zu reduzieren, könnten Sie mit dem Aussortieren von Wörtern aus dem Hash während der Eingabephase experimentieren, die auf der Grundlage der aktuellen Anzahl unterhalb der oberen 100.000 liegen.

+0

Danke für die Eingabe Tom. Ich hatte das Gefühl, dass er falsch lag, aber ich musste StackOverflow fragen, ob es nicht ich selbst war, dem es an Wissen fehlte. – Unknown

+0

"BOUNDS sollte die Anzahl der Buckets sein oder die letzten paar Buckets werden zu wenig genutzt", denken Sie, dass dies vielleicht eine Art spezieller Trick ist, wenn die Hashtabelle in der Größe verändert werden muss? – Unknown

+0

Ich stimme völlig zu, dass% BOUNDS völlig fehl am Platz ist. Der Hash einer gegebenen Eingabe sollte * unabhängig * davon sein, für was dieser Hash verwendet wird. Du kannst es als Schlüssel in einer Tabelle verwenden, du kannst es in einem Bogen binden, du kannst es zu \ dev \ null leiten. Die Hash-Funktion sollte glücklicherweise unwissend sein. – leoger

0

Ich habe einmal für einen Job bei einer bekannten Suchfirma interviewt. Ich habe genau die gleiche Frage. Ich habe versucht, es anzugehen, indem ich Hashtabelle verwendete.

Eine Sache, die ich aus diesem Interview gelernt habe, war, dass Sie bei einer bekannten Suchfirma keine Hashes als Lösungen vorschlagen. Sie verwenden eine beliebige baumähnliche Struktur, aber Sie verwenden immer eine geordnete Struktur, keine Hash-Tabelle.

+0

Können Sie mehr erklären? – Unknown

0

Ein einfacher expliziter Suffixbaum würde nur den Worst Case verwenden, vielleicht 500k Speicher (mit einer moderat effizienten Implementierung, 4 Byte Zeichencodierungen und relativ langen englischen Wörtern, die minimale Überlappung haben), um das Gleiche zu tun.

Ich denke, der Typ in dem Artikel überlistete sich.