Hier ist eine Idee, um das Problem zu lösen, wenn 2 Sätze gegeben sind:
Sie können "Sets" an einem rot-schwarzen Baum halten. Zusätzlich ordnen wir für jeden Knoten im Baum ein Bit zu, um zu bestimmen, ob sein Teilbaum in beiden Mengen ein Element enthält. Zur Darstellung wird es als Einfügebit bezeichnet . Ich gehe davon aus, dass der rot-schwarze Baum die Elemente von links nach rechts sortiert.
Beim Einfügen eines Elements in den Baum prüft der Algorithmus, ob das Element im Baum vorhanden ist (dh in dem anderen die Menge). Wenn nicht, fügen wir das Element wie gewohnt ein. Wenn nicht, schaltet der Algorithmus das Einfügebit der entsprechenden Knoten ein, indem er von der Wurzel zu dem Blatt wandert, das das Element enthält. Im schlimmsten Fall dauert es .O(logn)
Beim Löschen eines Elements prüft der Algorithmus, ob das Element im Baum vorhanden ist und ob das Einfügebit aktiviert ist. Wenn das Element nicht im Baum vorhanden ist, geben wir einen Fehler zurück. Wenn das Element vorhanden ist und das Einfügebit deaktiviert ist, löschen wir das Element wie im Rot-Schwarz-Baum-Algorithmus. Andernfalls schaltet der Algorithmus das Einfügebit der entsprechenden Knoten aus, indem er von der Wurzel zu dem Blatt wandert, das das Element enthält. Das Löschen dauert .O(logn)
Schließlich beginnt der Algorithmus zum Finden eines minimalen Elements, das von beiden Sätzen gemeinsam genutzt wird, mit der Wurzel. Wenn das Einfügebit der Wurzel ausgeschaltet ist, werden die Mengen getrennt, und der Algorithmus gibt einen Fehler zurück. Andernfalls wandert der Algorithmus rekursiv zum linken Kind, wenn sein Einfügebit aktiviert ist, und andernfalls zum rechten Kind. Der Algorithmus stoppt beim Element mit dem Minimalwert. Der Algorithmus läuft bei .O(logn)
Ich versuche zu überlegen, wie man das für eine größere Anzahl von Sätzen verallgemeinert ...