Frage

Wenn ich einen Schlüsselsatz von 1000 haben, was eine geeignete Größe für meine Hash-Tabelle, und wie ist das ermittelte?

War es hilfreich?

Lösung

Es hängt von dem Ladefaktor (der „Prozent voll“ Punkt, an dem der Tisch seine Größe erhöhen und wieder verteilt ihre Elemente). Wenn Sie wissen, Sie haben genau 1000 Einträge, und diese Zahl wird sich nie ändern, können Sie den Lastfaktor auf 1,0 und die Anfangsgröße bis 1000 für maximale Effizienz eingestellt gerade. Wenn Sie die genauen Größe nicht sicher sind, könnten Sie den Ladefaktor auf dem Standard von 0,75 verlassen und stellen Sie Ihre Anfangsgröße 1334 (erwartete Größe / LF) für wirklich gute Leistung, zu einem Preis zusätzlicher Speicher.

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

Hashtable(int initialCapacity, float loadFactor) 

Andere Tipps

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

eine Daumenregel schlägt die Tischgröße etwa doppelt machen, so dass es Raum zu erweitern, und hält hoffentlich die Zahl der Kollisionen klein.

Eine weitere Faustregel gilt, anzunehmen, dass Sie irgendeine Art von Modulo Zusammenhang Hashing tun, dann um den Tisch Größe auf die nächstgrößere Primzahl, und verwenden Sie diese Primzahl als Modulo-Wert.

Welche Dinge sind Hashing Sie? Weitere Einzelheiten sollten besser beraten erzeugen.

Es gibt einige Diskussion dieser Faktoren in der Dokumentation zu Hashtable

Lassen Sie es wachsen. Mit dieser Größe ist die automatische Handhabung in Ordnung. Anders als die 2 x Größe + 1 ist eine einfache Formel. Primzahlen sind auch irgendwie gut, aber sobald Ihr Datensatz eine bestimmte Größe erreicht, kann die Hash-Implementierung entscheiden, wieder aufwärmen und die Tabelle wachsen.

Ihre Schlüssel sind die treibende Kraft, die Wirksamkeit und sind hoffentlich deutlich genug.

Fazit: die Größe Frage, wenn Sie Probleme wie Größe oder geringe Leistung haben, anders als das: Keine Sorge

Zweimal ist gut.

Sie haben keine großen Keyset. Kümmern Sie sich nicht über schwierige Diskussionen über Ihre HashTable Implementierung und gehen für das Jahr 2000.

Ich möchte wiederholen, was https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany oben gesagt. 1000 scheint nicht wie eine sehr große Hash zu mir. Ich habe über diese Größe in Java viel Hashtables benutze, ohne viel in der Art von Performance-Problemen zu sehen. Und ich Dreck kaum je mit der Größe oder Ladefaktor um.

Wenn Sie einen Profiler auf Ihrem Code ausgeführt haben und festgestellt, dass die Hash-Tabelle Ihr Problem ist, dann mit allen Mitteln Zwicken starten. Ansonsten würde ich nicht annehmen, dass Sie ein Problem haben, bis Sie sicher sind.

Denn in den meisten Code ist das Performance-Problem nicht, wo Sie denken, es ist. Ich versuche, nicht zu antizipieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top