Stellen Sie die Datenstruktur für effiziente wiederholte Einfügungen ein

11

Ich suche nach einer platzsparenden Datenstruktur, die Mengen (keine Wiederholung) von Elementen mit Wortgröße enthält und das schnelle Einfügen unterstützt (amortisiertes O (1)). Mit "platzsparend" meine ich im Idealfall Wörter zum Speichern von Elementen.nn+o(n)n

Eine Menge zu sein ist ein wichtiger Teil der Frage: Wenn jedes Element mal hinzugefügt wird, kann der verwendete Speicherplatz nicht .n log nlognnlogn

Die Struktur sollte auch die Auflistung ihrer Elemente unterstützen (angemessen effizient). Jede vernünftige Struktur sollte hier keine Probleme haben. (Schnelle Mitgliedschaftsanfragen sind von Vorteil.)

Charles
quelle
2
Gibt es einen Grund, warum eine Hash-Tabelle den Trick nicht machen würde?
Dave
@ Dave: Ich denke nicht, dass dies den Platzbedarf erfüllt, aber ich nehme an, dass ein ausreichend strenger dynamischer Zeitplan für die Größenänderung funktionieren könnte. Aber im Allgemeinen würde ich gerne sehen, was da draußen ist, bevor ich tatsächlich Code schreibe.
Charles
1
Um mit dynamischer Größenänderung amortisieren zu können , müssen Sie die Größe um einen konstanten Bruchteil erhöhen, was meiner Meinung nach den Platzbedarf nicht erfüllt, wenn Sie n + o ( n ) strikt einhalten möchten . O(1)n+o(n)
Dave
OK, das ist ein bisschen albern - aber da Ihr Universum eine konstante Größe hat (wortgroße Elemente), hätte sogar ein Vollbitvektor eine Größe von O(1)
Magnus Lie Hetland
@Magnus: Ich denke, es ist gemeint, dass die tatsächlichen Funktionen hinter den O- und O-Notationen in der Frage nicht von der Wortgröße abhängen.
Tsuyoshi Ito

Antworten:

10

Ich denke, Ramans und Raos "Prägnante dynamische Wörterbücher und Bäume" erfüllen die von Ihnen festgelegten Grenzen. Aus der Zusammenfassung:

Wir geben zunächst eine Darstellung einer Menge , das Mitgliedschaftsabfragen in O ( 1 ) Worst-Case-Zeit und Einfügungen in / Löschungen aus S in O ( 1 ) erwartete Amortisationszeit unterstützt. Die Darstellung verwendet B + o ( B ) , wobeiSU={0,,m1},|S|=nO(1)SO(1)B+o(B)S.B=lg(mn)ist der informationstheoretische kleinste Raum darzustellen .S

jbapple
quelle
Das sieht fantastisch aus. (Sie werden verstehen, wenn ich die Zeitung lese, bevor ich akzeptiere, richtig?)
Charles
1

Wenn Ihre Anwendung einige Fehlalarme tolerieren kann, sollten Sie einen Bloom-Filter verwenden .

Paraphrase von Wikipedia: Ein Bloom-Filter ist eine platzsparende probabilistische Datenstruktur, mit der getestet wird, ob ein Element Mitglied einer Menge ist. Falsch positive Ergebnisse sind möglich, falsch negative jedoch nicht. Elemente können dem Set hinzugefügt, aber nicht entfernt werden. Je mehr Elemente zur Menge hinzugefügt werden, desto größer ist die Wahrscheinlichkeit von Fehlalarmen.

Tyson Williams
quelle
Meins kann nicht, aber +1 für eine großartige Datenstruktur.
Charles