2008-11-13 7 views

Antwort

9

Es hängt von dem Ladefaktor ab (der "Prozentsatz voll" Punkt, wo die Tabelle seine Größe vergrößert und seine Elemente neu verteilt). Wenn Sie wissen, dass Sie genau 1000 Einträge haben und diese Zahl sich nie ändern wird, können Sie den Ladefaktor auf 1.0 und die Anfangsgröße auf 1000 für maximale Effizienz einstellen. Wenn Sie sich nicht sicher über die genaue Größe wären, könnten Sie den Ladefaktor auf den Standardwert von 0,75 belassen und Ihre ursprüngliche Größe auf 1334 (erwartete Größe/LF) für wirklich gute Leistung, zu einem Preis von zusätzlichem Speicher setzen.

können Sie den folgenden Konstruktor verwenden, um die Auslastung zu setzen:

Hashtable(int initialCapacity, float loadFactor) 
+0

Angenommen, die Hash-Funktion verhält sich gut über die Menge der erwarteten Schlüssel. Eine selbstgebraute Hash-Funktion kann sich in einer minimal großen Tabelle nicht gut verhalten. Für eine selbst gebraute Funktion müssten Sie Experimente durchführen. –

+0

Wenn die Hash-Funktion nicht korrekt ist, werden kollidierende Elemente im gleichen Bucket (in einer LinkedList) gespeichert. Die Tabelle mit der minimalen Größe hat keinerlei Auswirkungen auf die Leistung. –

1

Es gibt einige Diskussion dieser Faktoren in der Dokumentation zu Hashtable

+0

Dies ist mehr ein Kommentar als eine Antwort. – tomasyany

3

Sie müssen auch in der Hash-Funktion berücksichtigen.

eine Faustregel schlägt vor, die Tabellengröße ungefähr doppelt zu machen, so dass es Raum zum Erweitern gibt und hoffentlich die Anzahl der Kollisionen klein bleibt. Eine andere Faustregel besagt, dass Sie eine Art von Modulo-bezogenem Hashing durchführen, dann runden Sie Ihre Tabellengröße bis zur nächstgrößeren Primzahl ab und verwenden Sie diese Primzahl als Modulo-Wert.

Welche Art von Dingen hashst du? Mehr Details sollten besseren Rat generieren.

0

Zweimal gut ist.

Sie haben kein großes Tastenset. Machen Sie sich keine Gedanken über schwierige Diskussionen über Ihre HashTable-Implementierung und gehen Sie für das Jahr 2000.

+0

2000 macht keine gute Größe, weil es nicht prim ist. 2001 wäre gut, es ist nicht Prime, aber zumindest nicht einmal. Wird die Schlüssel in der Tabelle viel besser verteilen. Eine gute Hashtable wird sich um eine gute Hash-Funktion kümmern, aber die meiste Zeit wird die Größe verwendet. – ReneS

+0

Dies ist eine interessante Frage. Ihre Aussage ist richtig, wenn Sie einen Hash-Schlüssel vom Typ verwenden: H (s) = s [0] + b * s [1] + b^2s [2] + ... [N] Ich denke, der heutige Industriestandard ist um 2^k als Größe und bessere Hash-Funktionen wie Jenkins zu verwenden. Als ich das letzte Mal nachgesehen habe, arbeitete die Std mit Prime. – fulmicoton

+0

Prime und ungerade Zahlen sind cooler;) – ReneS

1

Lassen Sie es wachsen. Bei dieser Größe ist die automatische Handhabung in Ordnung. Ansonsten ist 2 x Größe + 1 eine einfache Formel. Prime-Nummern sind auch gut, aber sobald Ihr Datensatz eine bestimmte Größe erreicht, kann die Hash-Implementierung entscheiden, die Tabelle neu zu erstellen und zu vergrößern.

Ihre Schlüssel treiben die Effektivität und sind hoffentlich deutlich genug.

Fazit: Stellen Sie die Größenfrage, wenn Sie Probleme wie Größe oder langsame Leistung haben, anders als das: Mach dir keine Sorgen!

+0

Mach dir Sorgen, wenn Performance * in diesem Bereich * zum Problem wird. Wenn Sie versuchen, damit umzugehen, werden Sie eher einen Fehler einfügen oder einfach unnötig komplexen Code haben, der ein Wartungsproblem verursachen kann. –

+0

Ich stimme zu. Haben Sie das Problem zuerst und suchen Sie danach eine Lösung. – ReneS

0

Ich möchte wiederholen, was oben https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany sagte. 1000 scheint mir kein sehr großer Hasch zu sein. Ich habe eine Menge Hashtables über diese Größe in Java verwendet, ohne viel Leistungsprobleme zu sehen. Und ich mache mich kaum mit der Größe oder dem Ladefaktor herum.

Wenn Sie einen Profiler auf Ihrem Code ausgeführt haben und festgestellt haben, dass die Hashtabelle Ihr Problem ist, dann fangen Sie unbedingt an, zu optimieren. Sonst würde ich nicht davon ausgehen, dass du ein Problem hast, bis du dir sicher bist.

Nach allem, in den meisten Code, ist das Leistungsproblem nicht, wo Sie denken, dass es ist. Ich versuche nicht zu antizipieren.

Verwandte Themen