Warum ist die Größe 127 (prime) besser als die 128 für eine hash-Tabelle?
Angenommen, dass simple uniform hashing, das Wesen, jedem gegebenen Wert ist ebenso wie hash in die slots der hash. Warum ist es besser, eine Tabelle mit der Größe 127 und nicht 128? Ich verstehe wirklich nicht, was ist das problem mit der Potenz von 2 zahlen. Oder, wie es eigentlich überhaupt einen Unterschied macht.
Beim Einsatz der division-Methode,
wir in der Regel zu vermeiden, bestimmte Werte
von m (Tabellengröße). Zum Beispiel, m
sollte es nicht eine Potenz von 2 ist, denn wenn m
= 2^p , dann ist h(k) ist genau die p niedrigsten bits von k.
Nehmen wir an, die Elemente, die sind nur zwischen 1 und 10000 und ich nahm die Größe der Tabelle als 128. Wie kann 127, besser zu sein?
Also 128 ist 2^6 (1000000) und 127 ist 0111111. Welchen Unterschied macht dies? Alle zahlen (als Hash) sind immer noch die niedrigsten p-bits von k 127 zu. Habe ich etwas falsch gemacht?
Ich bin auf der Suche nach einige Beispiele, wie ich kann wirklich nicht verstehen, warum das schlecht ist. Vielen Dank im Voraus!
PS: ich bin mir bewusst:
Hash-Tabelle: warum sollte die Größe Primzahl?
> PS: I am aware of: Hash table: why size should be prime?
- dann Lesen Sie es erneut, oder der link durch diese one- Der thread verlinkt wurde, macht eine Vermutung, dass die Elemente innerhalb einer Beziehung ("Dann, wenn eine Reihe von Zeichenfolgen alle mit dem gleichen ersten char zugeführt, dann werden die Ergebnisse alle gleich modulo k")
- Sorry, aber wenn Sie darauf bestehen, dass es nicht notwendig ist zu optimieren, die gegen Kollisionen für Ihre spezifischen hash-Werte, die Sie verwirren könnten Indizierung mit hashing. Eine perfekte hash-kann verwendet werden als index, aber alle möglichen Werte müssen bekannt sein, bis vor. Mit einer solchen Konfiguration ist es egal, auch wenn die Anzahl der buckets, ist tatsächlich ein Fakt (
n!
). Das ist aber nicht die generische Wissenschaft hinter hashing. - OT:
Clash
ist ein sehr schönes screen-Namen verwenden, wenn im Gespräch über hash-Kollisionen 🙂 - Ich bin nicht darauf bestehen, dass ich keine Kollisionen. Ich versuche nur zu verstehen, warum eine Primzahl ist, obwohl kleiner als eine Potenz von 2 ist, ist besser als eine Potenz von zwei. Den link den du mir gegeben hast, bezieht sich auf eine situation, wo eine bestimmte Gruppe von Elementen ist wahrscheinlicher zu geschehen. Vielen Dank für Ihre Antworten!
- möglich, Duplikat der Warum Einstellung Hashtabelle der Länge eine Primzahl ist eine gute Praxis ?
- Da Reale Daten fast nie gleichverteilt. Wenn Sie hash-strings mit 128, erhalten Sie 26 Eimer ungleichmäßig gefüllt und der rest leer. Wenn Sie 127 Sie werden wahrscheinlich bekommen Sie alle gefüllt gleichmäßiger.
- Nur die Korrektur eines Tippfehler: 128 2^7, 2^6.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Falsch ist (oder ich falsch verstanden..).
k % 127
hängt von allen bits von k.k % 128
hängt nur von der 7 niedrigsten bits.EDIT:
Haben Sie eine perfekte Verteilung zwischen 1 und 10.000.
10,000 % 127
und10,000 % 128
beide schalten Sie dies in eine ausgezeichnete kleineren Vertrieb. Alle Eimer enthalten 10,000 /128 = 78 (oder 79) Elemente.Wenn Sie eine Verteilung zwischen 1 und 10.000, die parteiisch ist, denn {x, 2x, 3x, ..} häufiger auftreten. Dann ein prime Größe geben wird, eine viel, viel bessere Verteilung wie in diesem Antwort. (Es sei denn x ist genau das, was prime Größe.)
So, das abschneiden der high-bits (mit einer Größe von 128) ist überhaupt kein problem wenn die Verteilung in den unteren bits ist gut genug. Aber, mit realen Daten und realen schlecht entwickelt, hash-Funktionen, müssen Sie diese high-bits.
Division-Methode
Zu verstehen, warum
m = 2p
verwendet nur diep
niedrigsten bits vonk
, müssen Sie zuerst verstehen, die modulo-Hashfunktionh(k) = k % m
.Den Schlüssel geschrieben werden kann in Bezug auf ein quotient
q
, und den Restr
.Wahl der quotient zu
q = m
erlaubt uns zu schreibenk % m
einfach wie der Rest in der obigen Gleichung ist:Daher
k % m
entspricht kontinuierlich Subtraktionm
insgesamtn
mal (bisr < m
):Können versuchen hashing-Schlüssel
k = 91
mitm = 24 = 16
.So
91 % 24 = 11
ist nur die binäre form91
nur mit derp=4
niedrigsten bits übrig.Wichtige Unterscheidung:
Dies bezieht sich speziell auf die division-Methode der Vermischung. In der Tat, das Gegenteil ist wahr für die Multiplikation-Methode wie bereits in CLRS:
Nick ist richtig, dass im Allgemeinen die hash-Tabelle Größe spielt keine Rolle. Aber in dem speziellen Fall, wo offene Adressierung mit Doppel-hashing verwendet wird (in dem das Intervall zwischen den Sonden wird berechnet, indem eine weitere hash-Funktion), dann ist eine Primzahl-Größe hash-Tabelle ist am besten, um sicherzustellen, dass alle hash-Tabelle Einträge vorhanden sind, die für ein neues element (als Corkscreewe erwähnt.)
First off, ist es nicht über die Kommissionierung eine Primzahl. Für Ihr Beispiel, wenn Sie wissen, dass Ihre Daten eingestellt werden im Bereich von 1 zu 10.000, Kommissionierung 127 oder 128 wird keinen Unterschied machen, bc, es ist ein schlechtes design Wahl.
Eher, es ist besser, wählen Sie eine WIRKLICH große prime wie 3967 für dein Beispiel, so dass jeder die Daten eigene Schlüssel/Wert-paar. Sie wollen einfach nur, um auch Kollisionen minimieren. Kommissionierung 127 oder 128 für dein Beispiel macht keinen Unterschied bc 127/128 Eimer wird gleichmäßig gefüllt (das ist schlecht und verschlechtert das Einfüge-und lookup-Laufzeit O(1) O(n)) im Gegensatz zu 3967 (der die Aufrechterhaltung der O(1) mal)
EDIT #4
Wenn Sie eine perfekte hash-Funktion, die eine gleichmäßige Verteilung, dann ist es egal.
Wikipedia hat tatsächlich eine gute Zusammenfassung dazu:
http://en.wikipedia.org/wiki/Hash_table
Weisen Sie darauf hin, dass einige hash-Funktionen sind speziell für den Betrieb NUR mit Primzahlen. Dieser Artikel erklärt, warum Potenzen von zwei sind schlecht:
http://www.concentric.net/~Ttwang/tech/primehash.htm
Ich nicht beweisen kann Sie es nicht mehr, obwohl ich erinnere mich, dass dies in einer Prüfung an der Universität vor einer million Jahren, aber eine optimale hash-Größen sind nicht nur prime. Sie wollen wählen eine Primzahl N, so dass
N = 4*M − 1
(wo M ist ebenfalls eine ganze Zahl).Macht 31 eine bessere Anzahl der buckets als 29. M ist 8, wenn N ist 31, aber es gibt keine Integrale M wenn N 29.
Wie gesagt, ich weiß es nicht mehr, die Mathematik, die dies beweisen. Es war in einen Theorie-Kurs gelehrt von Rachel Manber gemacht, Udi Frau, die vor rund 25 Jahren oder so.
hier ist ein Weg zu verstehen, " k % 127 hängt von allen bits von k. k % 128 hängt nur von der 7 niedrigsten bits." .
k % 128 ist gleich mit k & (2^7-1) .zum Beispiel: 129 % 128 = 1 , Binär: 1000 0001 & 0111 1111 =0000 0001,jede hight bit (2^7-1) ist 0 ,was bedeutet, dass es Dosis keine Rolle, was die hohe position ist. aber das übersetzen ist ungültig für zahlen, die nicht gleich 2^n.
jetzt lassen Sie uns nehmen einen Blick an, wie wir tun, division Dezimal 129 % 127 ,der erste Blick auf die höchste position 1,die weniger als 127 ist,dann bekommen wir den nächsten Punkt 2 kombinieren, die mit der Faust bekommen wir 12 , 12 ist kleiner als " 127 " ist,dann kombinieren Sie mit 9, was bedeutet, 129 ,geteilt durch 127 der Rest 2 ist,könnten wir schreiben dies in der Mathematik:129 = 1 * 127 +2 so haben wir 2 [all dies wird als Long_division] ,und es ist das gleiche in der Binären division,jetzt wissen wir k % 127 hängt von allen bits von k
Von Warum hash-Tabellen sollten eine Primzahl-Größe.