Sortierte Wörterbuchstruktur, die effiziente Zusammenführungen unterstützt?

8

Viele ausgeglichene Baumstrukturen (rot / schwarze Bäume, Spreizbäume usw.) und einige andere sortierte Wörterbuchstrukturen (Skiplisten) unterstützen eine Verknüpfungsoperation, die zwei Wörterbücher umfasst, in denen alle Schlüssel in der ersten Struktur kleiner sind als alle Schlüssel in der zweiten. kombiniert dann die beiden Wörterbücher zu einem einzigen sortierten Wörterbuch in der Zeit , wobei n die Gesamtzahl der Schlüssel ist. Dies funktioniert jedoch nur, wenn sich die in diesen Bäumen gespeicherten Schlüsselbereiche nicht überschneiden.O(logn)n

In ähnlicher Weise unterstützen viele Prioritätswarteschlangen (Binomial-Heaps, Fibonacci-Heaps usw.) -Zeit-Zusammenführungen. Diese Zusammenführungen funktionieren unabhängig davon, welche Schlüssel gespeichert sind. Da es sich bei den Datenstrukturen jedoch um Prioritätswarteschlangen handelt, können wir in der resultierenden Struktur keine Suche nach zufälligen Elementen durchführen.O(logn)

Gibt es eine sortierte Wörterbuchstruktur, die das Zusammenführen beliebiger Wörterbücher in der Zeit und gleichzeitig normale sortierte Wörterbuchoperationen (Einfügungen, Löschungen, Suchvorgänge, Nachfolger- / Vorgängerabfragen usw.) in der Zeit O ( log n ) oder unterstützt ? ein untergeordneter Beweis dafür, dass solche Strukturen nicht existieren können?O(logn)O(logn)

templatetypedef
quelle
2
Welche anderen Operationen muss das sortierte Wörterbuch haben und wie schnell sind sie? Ohne Anforderungen an die Sortierung von Einfügen und Nachschlagen reichen doppelt verknüpfte Listen aus, aber die Nicht-Zusammenführungsvorgänge benötigen eine lineare Zeit in der Länge der Liste, die in der Anzahl der unterschiedlichen Schlüssel superlinear sein kann.
jbapple
O(logn)
Ich schlage vor, Sie bearbeiten Ihre Frage, um diese Informationen in die Frage aufzunehmen ...
DW
O(logn)n

Antworten:

8

dO(logd)kO(klog(n/k))

Angenommen, Sie möchten Einfügungen, destruktive Zusammenführungen und Suchen unterstützen. Verwenden Sie für die Einfügungen und Suchen einfach die vorhandenen Suchbaumoperationen. Führen Sie für eine Zusammenführung immer den kleineren Baum mit dem größeren zusammen und verwenden Sie eine Inorder-Durchquerung des kleineren Baums, um seine sortierte Reihenfolge in linearer Zeit zu erhalten. Fügen Sie dann die Elemente des kleineren Baums einzeln in dieser sortierten Reihenfolge in den größeren Baum ein.

xn1,n2,xO(logn1)O(log(n2/n1))O(logn)xO(logn)O(1)

nO(logn)Die Zeit pro Vorgang sollte die Gesamtzahl der Elemente sein, die jemals eingefügt oder gelöscht wurden, und nicht die Anzahl der aktuell vorhandenen Elemente. Wenn diese beiden Zahlen jemals zu weit auseinander wachsen, können Sie eine Aktualisierung vornehmen, bei der alle Zählungen an ihre tatsächlichen Zahlen angepasst werden und die Datenstruktur auf einen Zustand ohne verzögert gelöschte Elemente zurückgesetzt wird. Die amortisierte Zeit für dieses Update kann mit den Löschvorgängen verrechnet werden, die Sie ausführen mussten, um die Zahlen so weit auseinander zu halten. Oder möglicherweise können Sie die Zusammenführungsamortisation direkt mit nicht faulen Löschungen ausführen, aber ich habe die Details dieses Teils nicht ausgearbeitet.

David Eppstein
quelle
1
logUU
Nein, protokollieren Sie einfach die maximale Anzahl von Elementen gleichzeitig in einem Baum.
David Eppstein