Besser spät als nie.

Ich wollte zwar "morgen" (also vor knapp drei Wochen) antworten, vergaß es dann aber.^^
Marco13 hat gesagt.:
Grob-Intuitiv heißt das ja (wenn ich mich an's 3. Semester noch richtig erinnere) in erster Linie, dass keine zwei Keys den gleichen Hashwert bekommen.
Jap, genau das macht perektes Hashing.
Bevor ich die nächsten Antworten geben kann, benötigen wir einige Definitionen. Ich habe diese bereits genannt, aber egal...
Sei U={0,...,N-1} das Universum, also die Menge aller Schlüssel, die rein theoretisch vorkommen könnten. Es gilt |U|=N, N endlich.
Sei S Teilmenge von U mit |S|=n die Schlüsselmenge, d.h. S ist die Menge aller Schlüssel, die tatsächlich vorhanden ist. Diese ist vor Beginn der Konstruktion der Hashfunktion bekannt.
Marco13 hat gesagt.:
Darüber, dass die Hashtable (bzw. der Array) weniger als Integer.MAX_VALUE Einträge haben sollte, wird dabei ja nichts gesagt :wink:
Nein, aber es gibt perfekte Hashfunktionen, die es ermöglichen, eine Hashtabelle zu verwenden, die lediglich O(n) Platz benötigt, statt exakt N.
Marco13 hat gesagt.:
Aber irgendwie kapier' ich das Problem glaubich immernoch nicht[. Denn wenn] du schon eine Menge von (eindeutigen) Zahlen/IDs hast, dann SIND das ja schon Hashwerte... Die könnten mit
index = ID % tableSize auf den Index gemappt werden, den sie in der HashTable (bzw. dem dahinterliegenden Array) haben, aber das wäre nicht eindeutig...
GENAU DAS ist der Punkt!! Diese Werte wären nicht eindeutig! Und damit wäre diese intuitive Hashfunktion nicht perfekt. Und damit wäre kein O(1)-Zugriff mehr möglich.
Marco13 hat gesagt.:
Hm... Ich weiß nicht, ob das jetzt ein rein akademisches Problem ist, wenn es genau DARUM geht: Ein Mathematik-Fachidiot würde jetzt vielleicht sagen, dass man so eine Hashfuktion "perfekt" machen kann, indem man eine Hashtabelle verwendet, die die schon vorhandene, eindeutige ID auf einen simplen Index mappt.... ( )
Naja, falls du eine Java-HashTable verwendest, löst du das Problem ja nicht. Schließlich verwendet eine HashTable eine Hashfunktion um das Mapping zwischen Bild und Urbild vorzunehmen. Und diese Funktion ist im Allg. nicht perfekt. Also haben wir noch immer keine perfekte Hashfunktion.
Die intuitivste Variante wäre, ein Array anzulegen mit N Einträgen. Jeder Eintrag x aus diesen Array ist genau dann 1, falls x aus S und 0 sonst. Damit hätte man eine perfekte Hashfunktion. Diese Vorgehensweise hat aber einen Speicherbedarf von exkat N. Wie oben bereits gesagt ist es möglich eine Hashfunktion zu konstruieren, die mit O(n) Speicherbedarf auskommt. Und dies kann szenarioabhängig eine gigantische Einsparung sein.
Wie bereits gesagt bin ich nicht mehr auf perfektes Hashing angewiesen, dennoch lasse ich diesen Thread als ungelöst stehen, da nach wie vor keine freie Implementierung von perfekten Hashfunktionen genannt wurde.