Zählen die Anzahl der Knoten in einem vollständigen binären Baum
Möchte ich die Anzahl der Knoten in einem Vollständigen Binären Baum aber alles was ich denken kann, ist das Durchlaufen der gesamten Baumstruktur. Das wird ein O(n) Algorithmus, wobei n die Anzahl der Knoten im Baum. was könnte die meisten effizienten Algorithmus, um dies zu erreichen?
- Was ist die Daten-Struktur, zum darstellen der Baum?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angenommen, wir starten mit dem Fuß auf den linken und rechten Stacheln des Baumes zu bestimmen, Ihre Höhen. Wir werden entweder feststellen, dass diese identisch sind, in welchem Fall die Letzte Zeile voll ist, oder wir finden, dass, Sie sich unterscheiden. Wenn die Höhen kommen wieder die gleichen (sagen die Höhe ist h), dann wissen wir, es sind 2h - 1 Knoten, und wir sind fertig.
Sonst, die Höhen werden müssen, h+1 und h, beziehungsweise. Wir wissen, dass es dann wenigstens 2h - 1 Knoten plus die Anzahl der Knoten in der untersten Ebene des Baumes. Die Frage ist, wie man das herausfinden. Ein Weg dies zu tun wäre, um zu finden, die am weitesten rechts liegenden Knoten in der letzten Ebene. Wenn Sie wissen, dass bei dem index, der Knoten ist, wissen Sie genau, wie viele Knoten in der letzten Ebene, so kann man hinzufügen, dass 2h - 1 und du bist fertig.
Wenn Sie einen vollständigen binären Baum mit der linken Höhe h+1, dann gibt es zwischen 1 und 2h - 1 Knoten möglich werden könnte, in die Letzte Schicht. Die Frage ist dann, wie um zu bestimmen, dies so effizient wie möglich.
Glücklicherweise, da wir wissen, dass der Knoten in der letzten Ebene erhalten Sie ausgefüllt von der linken auf die Rechte, die wir verwenden können, binäre Suche, um zu versuchen, um herauszufinden, wo die Letzte gefüllte Knoten in der letzten Ebene ist. Im wesentlichen, wir vermuten den index, wo es sein könnte, gehen von der Wurzel des Baumes nach unten, wo das Blatt sollte, und dann finden Sie entweder ein Knoten da ist (so wissen wir, dass der Rechte Knoten in der untersten Ebene ist entweder der Knoten oder der Rechte) oder wir tun es nicht (so wissen wir, dass der Rechte Knoten in der untersten Ebene müssen rein sein, um die rechts von der aktuellen Position). Wir gehen nach unten, wo die kth Knoten in der unteren Schicht sollte durch die Verwendung der bits in der Zahl k zu leiten Suche ab: wir beginnen an der Wurzel, dann gehen Sie nach Links, wenn das erste bit von k ist 0 und nach rechts, wenn das erste bit von k ist 1, dann die restlichen bits in einer entsprechenden Art und Weise zu Fuß auf den Baum. Die Gesamtzahl der Zeiten, die wir tun werden, dieser ist O(h) und jede Sonde benötigt Zeit O(h), so ist die gesamte Arbeit getan, hier ist O(h2). Da h die Höhe des Baumes wissen wir, dass h = O(log n), so dass dieser Algorithmus braucht die Zeit O(log2 n) Zeit in Anspruch.
Ich bin mir nicht sicher, ob es möglich ist, zu verbessern, die auf diesem Algorithmus. Ich kann das Ω(log n) untere Schranke für jede richtige Algorithmus, wenn. Ich werde argumentieren, dass jeder Algorithmus, der immer korrekt in allen Fällen müssen untersuchen den am weitesten rechts stehenden Blatt-Knoten in der letzten Zeile des Baumes. Um zu sehen, warum, angenommen es gibt einen Baum T, in denen der Algorithmus nicht tun. Nehmen wir an, dass die am weitesten rechts liegenden Knoten, die der Algorithmus prüft in der unteren Zeile x ist, ist, dass die tatsächlichen am weitesten rechts liegenden Knoten, in der unteren Reihe ist y, und dass die Links fehlen, Knoten in der unteren Reihe, die vom Algorithmus erkannt wird z. Wir wissen, dass x muss auf der linken Seite von y (weil der Algorithmus nicht untersuchen Sie die Knoten ganz Links in der unteren Zeile) und y muss sich Links von z (weil y existiert und z nicht, so z weiter rechts als y). Wenn Sie darüber nachdenken, was der Algorithmus "wissen" ist an dieser Stelle der Algorithmus, der keine Ahnung hat, ob oder nicht, es gibt keine Knoten rein, die rechts von x oder rein auf der linken z-Achse. Daher, wenn wir es geben, einen modifizierten Baum T', wo wir gelöscht y, der Algorithmus würde nicht bemerken, dass etwas geändert hatte, und hätte genau den gleichen Ausführungspfad auf T und T'. Jedoch, da T und T' haben eine unterschiedliche Anzahl von Knoten, die der Algorithmus hat falsch zu sein, zumindest einer von Ihnen. Die Inspektion dieser Knoten braucht Zeit, mindestens Ω(log n), weil die Zeit, die erforderlich ist, um zu Fuss den Baum hinunter.
Kurz gesagt, Sie können es besser als O(n) mit den oben genannten O(log2 - n)-Zeit-Algorithmus, und Sie könnten in der Lage sein zu tun, noch besser als das, aber ich bin nicht ganz sicher, wie oder ob das möglich ist. Ich vermute, es ist nicht, weil ich vermute, dass die binäre Suche ist der optimale Weg, um überprüfen Sie die untere Zeile und die Längen der Pfade auf, um Knoten, die Sie würde eine Sonde, selbst nach Berücksichtigung der Tatsache, dass Sie teilen die Knoten in common, ist Θ(log2 n), aber ich bin mir nicht sicher, wie es zu beweisen.
Hoffe, das hilft!
In jedem rekursiven Aufruf müssen wir durchqueren, entlang den linken und rechten Grenzen des vollständigen binären Baum zum berechnen der linken und rechten Höhe. Wenn Sie gleich sind, der Baum ist voll mit 2^h-1 Knoten.Sonst haben wir die Rekursion auf den linken Teilbaum und rechter Teilbaum. Der erste Anruf wird von der Wurzel (Ebene=0), die O(h) Zeit, um Links und rechts Höhe.Wir haben recurse, bis wir einen Teilbaum, welcher ist der vollständige binäre Baum.Im schlimmsten Fall kann es passieren, dass die wir gehen, bis das Blatt-Knoten. Also die Komplexität (h + (h-1) +(h-2) + ... + 0)= (h(h+1)/2)= O(h^2).Auch die räumliche Komplexität ist die Größe der call-stack,die O(h).
HINWEIS:Für die vollständige binäre Baum h=log(n).
Wenn der binäre Baum ist definitiv abgeschlossen (im Gegensatz zu 'fast vollständigen' oder 'fast komplett' im Sinne der Wikipedia-Artikel), sollten Sie einfach hinunter ein Zweig des Baumes nach unten auf das Blatt. Dies wird O(logn). Dann ist die Summe der Potenzen von zwei bis zu dieser Tiefe. So 2^0 + 2^1... + 2^d
C# - Beispiel-vielleicht hilft das auch anderen. Dies ist ähnlich wie die Zeit, die Komplexität gut erklärt oben templatetypedef