Gibt es eine W-Bit-Wort-RAM-Datenstruktur mit O (1) Zeit pro Operation für das folgende Problem?: Behalten Sie einen Satz nicht negativer W-Bit-Ganzzahlen bei, die die Operationen unterstützen
- add (x): füge x zur Menge hinzu
- remove (x): entferne x aus dem Set
- fingerprint (): Gibt einen Fingerabdruck des Sets zurück. Dieser W-Bit-Fingerabdruck hat die Eigenschaft, dass zwei identische Sätze denselben Fingerabdruck haben, während zwei unterschiedliche Sätze wahrscheinlich unterschiedliche Fingerabdrücke haben
Alle Operationen sollten in konstanter Zeit ausgeführt werden.
Das Rabin-Karp-Fingerabdruckschema, bei dem wobei p eine zufällige w-Bit-Primzahl ist, funktioniert fast. Das Problem liegt in der Aktualisierungszeit, da die Berechnung von 2 ^ x \ bmod p mehr als konstante Zeit in Anspruch nimmt. Durch wiederholtes Quadrieren kann dies in O (log w) -Zeit erfolgen. Der schnellste modulare Exponentiationsalgorithmus, den ich finden konnte, führt so etwas wie (log w) / (loglog w) arithmetische Operationen aus.
ds.data-structures
Pat Morin
quelle
quelle
Antworten:
Diese Antwort ist ein bisschen handgewellt.
Wählen Sie eine Funktion gleichmäßig zufällig aus der Menge aller Funktionen von W-Bit-Wörtern bis W-Bit-Wörtern. Pflegen Sie für jeden Satz einen W-Bit-Fingerabdruck wie folgt:h
Sei zwei Sätze von w-Bit-Ganzzahlen. Wenn ihre Fingerabdrücke gleich sind, ist der Fingerabdruck von , die symmetrische Differenz von und , 0, was mit einer Wahrscheinlichkeit von geschieht .S≠T S△T S T 2−w
quelle