Rehasing: Was ist, wenn es den Hash auch schon gibt?
Also wenn bei der normalen Hashfunktion eine Kollision auftritt nehmen wir ja die Rehashfunktion und springen entsprechend ein paar Felder weiter. Was ist, wenn dieses Feld auch belegt ist? Nochmal genau so weit springen oder was anders?
Und wenn ich zufällig unten ankomme obwohl oben noch Platz wäre, was dann?
3 Antworten
immer weiter hashen
Ich gehe davon aus, dass du von einer Art Hashmap redest?
Wenn ja, hast du da etwas missverstanden.
Man nutzt Rehashing NICHT wenn es zu Kollisionen kommt, sondern wenn ein sog. Loadfactor überschritten ist.
Für eine Hashmap mit nur 5 Buckets wäre das hier völlig OK und noch kein Grund zum rehashen:
0: foo, bar, baz
1:
2:
3: qux
4:
Wenn du von einer perfekten Hashmap ohne Kollisionen ausgehst, kannst du lange rehashen und dabei tonnenweise sinnlos Speicher verbraten.
Es gibt aber Werkzeuge, die dir für einen bestimmten Satz an Objekten einen perfekten Hashalgorithmus (bzw. IV) generieren, aber das dauert bei großen Datenmengen gerne mal mehrere Stunden und ist sowieso nur in Sonderfällen notwendig.
Beim Hashen musst du immer mit Kollisionen rechnen. Und diese können natürlich auch mehrfach bzw. wiederholt auftreten.
Ein Problem ist das i. d. R. aber nicht. :)
Solange rehashen, bis es keine Kollisionen mehr gibt.
Das führt aber potentiell zu Endlosschleifen, also sei in der Praxis bitte sehr vorsichtig, falls du so etwas implementieren solltest. :)
Alles klar, danke! Also würde ich hier immer 2er Schritte vorwärts machen und wenn ich unten bin wieder oben los legen. Hier würde ich dann bei der 0 landen?
Cuckoohashing?
Das wäre zumindest ad hoc das einzige, was mit mit Rehashing einfiele...
Ja ich meine eine Hashmap :)
Also wir haben eben 3 Möglichkeiten gelernt, Kollisionen zu handlen
Dein 0er Hash würde ja Chaining verwenden, aber angenommen ich muss in der Prüfung halt mit Rehashing arbeiten.
jetzt will ich baz einfügen: hash(baz) = 1, rehash(baz) = 2
Sowohl 1 als auch 3 sind belegt. Wie geht es nun weiter?