Gibt es eine binäre Baumstruktur mit schnellem Zugriff auf Elemente, auf die kürzlich zugegriffen wurde, und am schlimmsten


7

Die Idee von Spreizbäumen ist sehr schön, da sie häufig aufgerufene Elemente nach oben verschieben, was in vielen Anwendungen zu einer erheblichen Beschleunigung führen kann. Der Nachteil ist, dass eine Operation im schlimmsten Fall eine -Komplexität aufweisen kann. (Obwohl amortisierte Grenzen wenn wir mindestens durchführenÖ(n)Ö(nLogn) nOperationen .)

Gibt es eine sich selbst anpassende Suchbaumstruktur, die beides enthält? Bevorzugte Elemente, auf die kürzlich zugegriffen wurde, und das SchlimmsteÖ(Logn) Komplexität für eine einzelne Operation?

Antworten:


2

Es hört sich so an, als würden Sie nach einem binären Suchbaum mit der Working-Set-Eigenschaft suchen . Dies ist ein gutes Stück schwächer als die dynamische Optimalität . Tatsächlich sind laut Iaconos "In Verfolgung der Vermutung der dynamischen Optimalität" vom Juni 2013 keine binären Suchbäume mit dynamischer Optimalität bekannt .

Aber wenn Sie nach der einfacheren Working-Set-Eigenschaft suchen, haben Sie Glück! Die Working-Set-Eigenschaft ist die Zeit für den Zugriff auf ein Elementx ist proportional zum Protokoll der Anzahl der Elemente, auf die seitdem zugegriffen wurde x wurde zuletzt zugegriffen.

Es gibt eine Vielzahl von Strukturen mit der Working-Set-Eigenschaft. Es gibt sogar einen binären Baum, der sowohl die logarithmische Worst-Case-Bindung als auch die Working-Set-Eigenschaft im Worst-Case erfüllt, nicht nur den amortisierten Fall: Bose et al. "Layered Working-Set Trees" .


5

Die amortisierten Kosten für die Eingabe eines Elements in den Spreizbaum betragen Ö(Logn) also im schlimmsten Fall n Operationen würden reichen Ö(nLogn)Schritte. Es gibt eine Vermutung über den Spreizbaum, die besagt, dass er bis zu einem konstanten Faktor, der als dynamische Optimalitätsvermutung bezeichnet wird, genauso optimal ist wie ein binärer Suchbaum .

Tango Bäume sind online, selbst benachbarte Bäume dass achiveÖ(LogLogn) Wettbewerbsverhältnis im Vergleich zum offline optimalen binären Suchbaum, der am bekanntesten ist.


3

Ich bin mir nicht ganz sicher, was Sie mit Ihrer Datenstruktur erreichen wollen. In der Tat sind Splay-Bäume eine coole Datenstruktur. Es ist bekannt, dass sie die statische Optimalitätseigenschaft haben . Das heißt, wenn Sie die Verteilung Ihrer Suchanfragen im Voraus kennen und den optimalen binären Suchbaum für diese Verteilung erstellt haben, funktioniert ein Spreizbaum (ohne die Verteilung zu kennen) asymptotisch so gut wie der binäre Suchbaum. Natürlich können Sie sagen, dass dies ein Betrug ist, da der binäre Suchbaum nicht neu angepasst werden kann, aber es ist immer noch eine sehr beeindruckende Eigenschaft. Die Leute erwarten auch, dass Spreizbäume so gut sind wie jede sich selbst anpassende Datenstruktur (bekannt als dynamische, optimale Vermutung ) - aber dies ist eine der wichtigsten offenen Fragen im Bereich der Datenstrukturen.

Zurück zu Ihrer Frage: Da Spreizbäume statisch optimal sind, müssen Sie etwas opfern. Dies bedeutet, dass Sie beim Zugriff auf ein Element mit geringer Wahrscheinlichkeit möglicherweise eine umfangreichere Operation ausführen müssen. Dies ist jedoch gerechtfertigt, da das Element nur selten angefordert wird - und jede statisch optimale Datenstruktur dieses Verhalten zeigt. Natürlich können Sie uns immer einen ausgeglichenen binären Suchbaum geben, aber dann verlieren Sie die statische Optimalität.


0

Wie wäre es mit diesem Verfahren (funktioniert nur für statische BSTs).

Mit jedem Knoten pflegen Sie einen Zeiger auf einen anderen Knoten, der in dem auf diesem Knoten verwurzelten Unterbaum vorhanden ist. Zusammen mit dem Zeiger behalten Sie auch die Ebenennummer des Knotens bei, auf den gezeigt wird (zusammen mit Ihrer Ebenennummer). Die Wurzel befindet sich auf Stufe 0 und die Stufen steigen, wenn Sie den Baum hinuntergehen. Zunächst zeigt der Zeiger auf einen Knoten zurück auf den Knoten selbst. Die Invariante ist, dass Sie immer nur auf einen Knoten auf einer niedrigeren oder gleichen Ebene als der Ebenennummer des Knotens zeigen.

Wenn Sie im Baum nach einem Element suchen, wird Folgendes ausgeführt:

1. Be found at its location in the BST, or
2. Be found along a path to its location because some node along the node to root path has a pointer to this node, or
3. Not be found at all.

In beiden Fällen führen wir zuerst einen Vorwärtsdurchlauf durch, um den Knoten zu finden, und wenn er gefunden wird, sprudeln wir die spitzen Knoten entlang des Pfades von Wurzel zu Knoten für den gefundenen Knoten nach unten. Wenn der Knoten als Ergebnis von Fall 2 gefunden wurde, sprudeln wir nur bis zu dem Knoten, der auf den Zielknoten zeigte (dies ermöglicht es uns, für Knoten, auf die kürzlich zugegriffen wurde, schnell zu sein).

Wenn ein Knoten auf eine Ebene gesprudelt wird, die größer als der Knoten selbst ist, löschen wir den Knoten aus dem Zuordnungssatz.

Wenn auf einen Knoten ohne Zuordnung zugegriffen wird, erstellen wir eine neue Zuordnung für diesen Knoten und legen fest, dass sie die am Knoten vorhandene Zuordnung ersetzt, und sprudeln sie schrittweise auf.

Wenn auf einen Knoten zugegriffen wird, sprudelt er ganz nach oben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.