Hier ist die Quelle meiner Frage.
Codieren Sie bei einem selbstausgleichenden Baum (AVL) eine Methode, die den Median zurückgibt.
(Median: Der numerische Wert, der die obere Hälfte einer Datenprobe von der unteren Hälfte trennt. Beispiel: Wenn die Reihe ist
2, 7, 4, 9, 1, 5, 8, 3, 6
dann ist der Median 5.)
Ich kann folgende Lösung anbieten:
- Durchlaufen Sie den angegebenen Baum und geben Sie die Anzahl der Elemente zurück.
- Durchqueren Sie den Baum
n / 2 + 1
(fallsn
ungerade) und führen Sie erneut einen Baumspaziergang in der richtigen Reihenfolge durch. Der Wert desn / 2 + 1
th-Elements ist der Median.
Aber ich kann es mit einem binären Suchbaum machen, oder? Gibt es einen besseren Algorithmus für eine AVL?
data-structures
search-trees
selection-problem
balanced-search-trees
Maksim Dmitriev
quelle
quelle
Antworten:
Wenn Sie den AVL-Baum ändern, indem Sie die Größe des Teilbaums an jedem Knoten und nicht nur seine Höhe speichern, können Sie den Median in der Zeit anhand der Tatsache ermitteln, dass der Baum ausgeglichen ist. Um dies zu erreichen, schreiben Sie eine allgemeinere Prozedur. Wählen Sie aus, die einen Knoten und eine Zahl akzeptiert und den -kleinsten Knoten im Teilbaum findet, der auf verwurzelt ist .v k k vO(logn) v k k v
Angenommen, der linke Teilbaum (falls vorhanden) hat Knoten. Wenn dann kehren wir zum linken Teilbaum zurück. Wenn ist, geben wir . Andernfalls kehren wir zum rechten Teilbaum zurück und reduzieren um .k ≤ L k = L + 1 v k L + 1L k≤L k=L+1 v k L+1
Die Laufzeit dieses Algorithmus ist linear in der Höhe des Baums, also .O(logn)
quelle
AVL ist ein binärer Suchbaum mit einer besonderen Eigenschaft: Es ist ein selbstausgleichender Baum. Die Höhe ist immer logarithmisch. Ein gewöhnlicher Binärbaum in einem schlimmsten Szenario kann eine verknüpfte Liste sein (wenn Sie sortierte Daten hinzufügen), sodass die Höhe n beträgt. Der AVL-Baum im schlimmsten Szenario ist der Fibonacci-Baum.
quelle