Was ist die optimale Datenstruktur für einen Kartenbaum?

9

Ich suche nach einer Datenstruktur, die im Grunde genommen ein Baum von Karten ist, in der die Karte an jedem Knoten einige neue Elemente sowie die Elemente in der Karte des übergeordneten Knotens enthält. Mit map meine ich hier eine Programmierkarte mit Schlüsseln und Werten, wie map in der STL oder dict in Python.

Beispielsweise könnte es einen Wurzelknoten geben:

root = {'car':1, 'boat':2}

und 2 untergeordnete Elemente, die jeweils ein Element zur übergeordneten Zuordnung hinzufügen

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

Ich möchte, dass dies so platzsparend wie möglich ist, dh ich möchte nicht an jedem Knoten eine vollständige Kopie der resultierenden Karte speichern, aber im Idealfall wäre die Suche immer noch O (log N), wobei N die Gesamtzahl von ist Elemente am Knoten, nicht der gesamte Baum.

Ich dachte, vielleicht gibt es eine intelligente Hash-Funktion, die ich dafür verwenden könnte, konnte mir aber nichts einfallen lassen.

Der naive Ansatz würde darin bestehen, die neu hinzugefügten Einträge in einer Karte an jedem Knoten zu speichern und dann den Baum nach oben zu verschieben, wenn nichts gefunden wird. Ich mag das nicht, weil es von der Baumtiefe abhängt.

Phreeza
quelle
Jeder Knoten stellt also eine Karte dar, die die im übergeordneten Knoten gespeicherte Karte verfeinert.
Suresh Venkat
Meinst du auch Karte im mathematischen oder kartografischen Sinne?
Suresh Venkat
Ich meine eine Karte im mathematischen / CS-Sinne. Wie Karte in der STL zum Beispiel.
Phreeza
@ Suresh: Es scheint, dass es keine Verfeinerung ist. Wenn ich die Frage richtig gestellt habe, fügt ein untergeordneter Knoten der Karte seines übergeordneten Knotens neue Elemente hinzu .
Jukka Suomela
und um die erste Frage zu beantworten, verfeinert jeder Knoten die Karte in dem Sinne, dass mehr Schlüssel / Wert-Paare hinzugefügt werden.
Phreeza

Antworten:

10

2mn

Jelani Nelson
quelle
5
Dieses Beispiel zeigt jedoch nicht, dass Sie redundante Informationen speichern müssen (dh, dass Sie die Einträge des Stammknotens auch bei jedem untergeordneten Knoten duplizieren müssen)!
Jukka Suomela
1nmÖ(m)
15

Ö(LogN.)

Θ(Ö(lglgN.)Θ(lgn)

xxxvv

Beachten Sie für eine Untergrenze, dass selbst eine stechende Frage so schwer ist wie die des Vorgängers (siehe die Reduzierungen der farbigen Vorgängersuche). Da die obigen Papierreferenzen ein optimales Direktsummenverhalten für die Vorgängersuche zeigen, bedeutet dies, dass der oben beschriebene Algorithmus für jedes Verhältnis zwischen der Anzahl der Knoten und der Gesamtzahl der Schlüssel optimal ist.

Mihai
quelle