2011-01-07 4 views
3

Ich versuche, einigen Rang Baum mit besonderen Anforderungen auf Basis von AVL-Baum zu erstellen, annehmen kann, dass ich mit Knoten AVL-Baum habe, hat jeder Knoten zwei Felder:Algorithmus für den speziellen Fall von Rang Baum

id, priority 

meine AVL-Baum von ID sortiert, auch habe ich eine Funktion:

foo(currentId, delta) 

, die die Priorität der alle IDs senkt, die durch delta diese Funktion mit Komplexität O (log arbeiten muss currentId weniger oder gleich n), so meine qu Estion ist welche zusätzliche Information muss ich speichern, um den Knoten mit highest priority in jeder Phase with complexity O(1) (nach der Verwendung von foo auch!) Pop.

P.S. Ich habe versucht, Informationen über maximale Priorität im rechten Teilbaum, maximale Priorität im linken Teilbaum zu speichern, aber es braucht viele Änderungen nach . Es wird mehr als nur O (log n) benötigen. Vielen Dank im Voraus für gute Ideen oder gute Bücher über Bäume.

+0

Gründe für die Verwendung von AVL-Bäumen? Es sieht so aus, als wären verschiedene Warteschlangen-Implementierungen mit höherer Priorität hier möglicherweise besser. – templatetypedef

+0

@templatetypedef: Kannst du mir bitte Link mit nützlichen Infos geben? Weiß nicht, worüber sprichst du? – rookie

+0

Rufst du 'foo()' nach jedem Pop? Welche Werte von Delta verwenden Sie relativ zu den IDs? Ein durchgeführtes Beispiel dessen, was Sie erreichen wollen, hilft uns zu verstehen, was Sie hier erreichen wollen. – marcog

Antwort

1

Anstatt speichern die maximalen Priorität, die in jedem Unterbaum erscheint, für jeden Knoten c mit Mutter p, store in c die Differenz zwischen der maximalen Priorität im Teilbaum der c und die maximalen Priorität in Teilstruktur der p. Auf diese Weise können Sie einen Bereich von Prioritäten in der Zeit O (log n) aktualisieren und immer noch das Element mit der höchsten Priorität in der Zeit O (log n) finden.

+0

danke für die Antwort, aber ich brauche O (1) – rookie

+0

Warum ist es so wichtig, O (1) anstelle von O (log n) zu haben, da Sie bereits so viel während der anderen Operationen auf dem Baum bezahlen? Wenn Sie möchten, können Sie wahrscheinlich die Kosten für das Entfernen der Knoten mit hoher Priorität auf O (1) amortisieren, wenn Sie für die Einfügungsereignisse und Aufrufe von foo doppelt zahlen. Dies ist jedoch nur Rechnungswesen. – jonderry

+0

danke für die idee, aber es wird mir nicht helfen ... – rookie