Ich bin neugierig, ob es eine Möglichkeit gibt, einen Hash aus mehreren Ganzzahlen zu speichern, der im Idealfall die folgenden Eigenschaften aufweist:
- Es verwendet O (1) Raum
- Es kann aktualisiert werden, um das Einfügen oder Löschen in O (1) -Zeit wiederzugeben
- Zwei identische Sammlungen (dh Sammlungen, die die gleichen Elemente mit den gleichen Multiplizitäten aufweisen) sollten immer auf den gleichen Wert gehasht werden, und zwei unterschiedliche Sammlungen sollten mit hoher Wahrscheinlichkeit auf verschiedene Werte gehasht werden (dh die Funktion ist unabhängig oder paarweise unabhängig).
Ein erster Versuch dabei wäre, das Produkt modulo in einer zufälligen Primzahl der Hashes der einzelnen Elemente zu speichern. Dies erfüllt 1 und 2, aber es ist nicht klar, ob es oder eine enge Variation 3 erfüllen würde.
Ich habe das ursprünglich auf StackOverflow gepostet .
* Die Eigenschaften 1 und 2 könnten ein wenig gelockert werden, beispielsweise auf O (log n) oder ein kleines sublineares Polynom. Der Punkt ist zu sehen, ob wir Mehrfachmengen identifizieren und die Gleichheit zuverlässig testen können, ohne die Elemente selbst zu speichern.
Antworten:
Wenn Sie Sätze wie das Leben in Weltall denken , ist es ganz einfach , Ihr Problem mit lösen O ( lg u ) Aktualisierungszeit. Alles, was Sie brauchen, ist eine schnelle Hash-Funktion für einen Vektor von u- Zahlen mit schnellen "lokalen Aktualisierungen".[u] O(lgu) u
Wikipedia / Universal Hashing schlägt vor, dass , wobei p eine ausreichend große Primzahl ist und a gleichmäßig aus [ p ] gezogen wird . Wenn Sie das Element i hinzufügen oder entfernen , müssen Sie ein i zum Hash-Code hinzufügen / davon subtrahieren , was O ( lg i ) Zeit mit dividieren und erobern für die Exponentiation benötigt. Da ein Polynom vom Grad uh(x⃗ )=(∑ui=1xiai)modp p a [p] i ai O(lgi) u Kann nur Wurzeln haben, ist die Kollisionswahrscheinlichkeit für zwei verschiedene Mengen O ( u / p ) . Dies kann sehr klein gemacht werden, indem p als groß genug angenommen wird (zum Beispiel p = u 2 und Sie arbeiten mit "doppelter Genauigkeit"). Wenn die Mengen viel kleiner als [ u ] sind , können Sie das Universum natürlich zunächst in ein kleineres Universum zerlegen.u O(u/p) p p=u2 [u]
Kennt jemand eine Lösung mit -Kollisionswahrscheinlichkeit, wenn das Hashing auf [ p ] liegt ? Das sollte möglich sein.O(1/p) [p]
quelle
Carter und Wegman behandeln dies in New-Hash-Funktionen und deren Verwendung bei der Authentifizierung und bei der Einstellung der Gleichheit . es ist dem, was du beschreibst, sehr ähnlich. Grundsätzlich kann eine kommutative Hash-Funktion für Einfügungen und Löschungen und Übereinstimmungen mit hoher Wahrscheinlichkeit in O (1) jeweils für ein Element aktualisiert werden.
quelle
Die Qualität einer Hash-Funktion hängt immer von den Eigenschaften der zu hashenden Elemente ab. Können Sie dazu etwas sagen? Zum Beispiel ist Ihr Produktvorschlag wahrscheinlich eine schlechte Hash-Funktion, wenn die Elemente x_i Ihres Multisets typischerweise viele kleine Primfaktoren haben. Aber Sie können es in diesem Fall einfach verbessern, indem Sie das Produkt von allen x_i + p mod q für einige Primzahlen p und q nehmen.
quelle
Mit der Summe können wir mehrere Vorkommen desselben Werts haben. Mit
xor können wir die Summe auf den gleichen Betrag setzen
quelle