Gibt es eine Datenstruktur, die die folgenden Vorgänge effizient unterstützt?
- Set hinzufügen
- Fragen Sie ab, ob eine Teilmenge einer Menge hinzugefügt wurde.
Dies könnte mit linearem Overhead implementiert werden, indem jeder hinzugefügte Satz während jeder Abfrage getestet wird. Kann es effizienter umgesetzt werden? Kleine Wahrscheinlichkeiten für falsch positive / negative Ergebnisse sind akzeptabel (z. B. Bloom-Filter-Stil).
data-structures
Elliot Gorokhovsky
quelle
quelle
Antworten:
Angenommen, alle Ihre Mengen sind endliche Teilmengen vonN . LassenS⊆P(N) bezeichnen Ihre Menge von Mengen.
Sie möchten zwei Operationen:
Hier sind einige Ideen, um die Dinge zu beschleunigen:
Sie werden testen, ob eine Menge eine Teilmenge einer anderen ist, also sollten Sie wahrscheinlich die Größe beibehalten|s| von jedem Satz s verfügbar in O(1) so dass, wenn Sie testen müssen, ob s⊆s′ Sie überprüfen zunächst, ob |s|≤|s′| und wenn nicht, können Sie sofort false zurückgeben. Und das hast du tatsächlich|s|≤|s′| Dann führen Sie einfach den normalen langsamen Test aus.
Beachten Sie, dass, wenn Sie habens1∈S und s2∈S , damit s1⊆s2 , dann wenn s2⊆s′ , Sie haben auch s1⊆s′ . Sie müssen also nicht behaltens2 im S zum O2 . So können Sie darstellenS durch eine Reihe von Mengen, so dass s∈S und s⊊s′ bedeutet . Mit anderen Worten, Sie müssen nur die Mengen in verfolgen , die für die Aufnahme minimal sind. Dies kann ziemlich effizient implementiert werden: Beim Hinzufügen einer Menge für alle Mengen so dass(geordnet nach zunehmendem Kardinal), wenn , dann füge nicht hinzu da es nicht minimal ist (oder bereits in ). Andernfalls addiere und dann zwischen den Mengen so dassEntfernen Sie diese so, dass (weil sie nicht mehr minimal sind).s′∉S S s′ s∈S |s|≤|s′| s⊆s′ s′ S s′ s∈S |s′|<|s| s′⊆s
Behalten Sie eine Menge , die der Vereinigung aller Mengen in . Dann wird anstelle der laufenden , können Sie laufen statt (weil , wenn für einige , , dann da , und, wenn , dann ).t S O2(S,s′) O2(S,s′∩t) s∈S s⊆s′ s⊆t s⊆s′∩t s⊆s′∩t s⊆s′∩t⊆s′
Unter Berücksichtigung dieser Ideen würde ich durch ein Wörterbuch darstellen (implementiert als doppelt verknüpfte Liste von Paaren mit den Schlüsseln in aufsteigender Reihenfolge) so dass eine doppelt verknüpfte Liste ist, die genau das enthält minimale (zur Aufnahme) Mengen in von Kardinal .S (key,value) d d(k) S k
(Beachten Sie, dass Sie, obwohl ich es im Code von nicht explizit
O1
getan habe, eine einzelne Durchquerung der doppelt verknüpften Liste durchführen können, die darstelltd
)Ich denke nicht, dass sich dies im schlimmsten Fall zu sehr verbessert, aber im Durchschnitt sollte es so sein.
quelle