Lektion
Die Theorie — Binärer Heap: Eine Prioritätswarteschlange im Array
Ein binärer Min-Heap ist ein Array, in dem der Schlüssel an jeder Position i höchstens so groß ist wie die Schlüssel an den Positionen 2i + 1 und 2i + 2, seinen Kindknoten. Der Elternknoten der Position i steht an Position ⌊(i − 1) / 2⌋. So gelesen bildet das Array einen vollständigen Binärbaum. Der kleinste Schlüssel steht immer an Position 0, der Wurzel. Zum Einfügen legst du den Schlüssel ans Ende und lässt ihn aufsteigen: Tausche ihn mit seinem Elternknoten, solange er kleiner ist als dieser. Um den kleinsten Schlüssel zu entnehmen, setzt du den letzten an die Wurzel und lässt ihn absinken: Tausche ihn mit seinem kleineren Kindknoten, solange dieser kleiner ist als er. Ein so verwendeter Heap ist eine Prioritätswarteschlange.
Was die einzelnen Symbole bedeuten
n- Anzahl der Schlüssel im Heap
i- Position im Array, ab 0 gezählt
h- Höhe einer Position: Anzahl der Ebenen unter ihr, ⌊log₂(n / (i + 1))⌋
- Setzt voraus
- Bei einem Vergleich werden zwei Schlüssel miteinander verglichen; bei einem Tausch wechseln sie ihre Positionen. Das Versetzen des letzten Schlüssels an die Wurzel bei einer Entnahme zählt als keines von beidem. Ist ein Schlüssel gleich seinem Elternknoten oder seinem kleineren Kindknoten, bleibt er stehen. Bei zwei gleichen Kindknoten wird der linke gewählt. Dieser Heap hält den kleinsten Schlüssel an der Wurzel. Bei einem Max-Heap sind alle Vergleichsrichtungen umgekehrt. Du kannst bis zu fünfzehn Schlüssel von 0 bis 99 verwenden, damit der gesamte Baum auch auf ein Smartphone passt. Die letzte Tabellenzeile zählt Anordnungen verschiedener Schlüssel.
Aufgabe vollständig gelöst
-
Wie viele Vergleiche brauchen die beiden Aufbauverfahren bei rund tausend Schlüsseln? 4 Schritte
Klick auf Absteigend, einzeln und danach auf Absteigend, von unten. Erkläre, wie die 34 und die 22 zustande kommen. Betrachte dann 1.023 Schlüssel in absteigender Eingabereihenfolge. Wie viele Vergleiche braucht jedes Verfahren?
-
Position i liegt in Tiefe ⌊log₂(i + 1)⌋: 1 Position in Tiefe 0, 2 in Tiefe 1, 4 in Tiefe 2 und 8 in Tiefe 3. Bei absteigender Eingabereihenfolge ist jeder neue Schlüssel der bisher kleinste. Er steigt bis zur Wurzel auf, mit einem Vergleich und einem Tausch pro Ebene: 0 + 2 · 1 + 4 · 2 + 8 · 3 = 34.
-
Beim Aufbau ab dem letzten Elternknoten zählt die Höhe: 3 für die Wurzel, 2 für die Positionen 1 und 2, 1 für die 4 Positionen in Tiefe 2 und 0 für die 8 Blätter. Die Summe ist 11. Bei absteigender Eingabereihenfolge sinkt jeder Schlüssel so weit wie möglich. Mit fünfzehn Schlüsseln hat jeder Elternknoten zwei Kindknoten, sodass jede durchlaufene Ebene 2 Vergleiche kostet: 22 Vergleiche und 11 Tauschvorgänge.
-
1.023 = 2¹⁰ − 1 ergibt einen vollständig besetzten Baum mit 10 Ebenen und 2ᵈ Positionen in Tiefe d. Beim einzelnen Einfügen entspricht die Vergleichszahl der Summe der Tiefen: 1 · 2 + 2 · 4 + 3 · 8 + ⋯ + 9 · 512 = 8.194 Vergleiche und ebenso viele Tauschvorgänge.
-
Beim Aufbau ab dem letzten Elternknoten ist die Vergleichszahl doppelt so groß wie die Summe der Höhen. Es gibt 2⁹ Positionen der Höhe 0, 2⁸ der Höhe 1 und so weiter bis zur Wurzel mit Höhe 9: 1 · 256 + 2 · 128 + ⋯ + 9 · 1 = 1.013. Das ist 1.023 minus die 10 Ziffern 1 in seiner Binärdarstellung. Die doppelte Summe ergibt 2.026 Vergleiche, dazu kommen 1.013 Tauschvorgänge.
Antwort
8.194 Vergleiche beim einzelnen Einfügen, 2.026 beim Aufbau ab dem letzten Elternknoten, also etwa 8 gegenüber 2 pro Schlüssel. Die meisten Positionen eines Heaps haben eine große Tiefe und eine geringe Höhe. Beim Einfügen bestimmt die Tiefe den Aufwand, beim Aufbau ab dem letzten Elternknoten die Höhe. Das Werkzeug erlaubt höchstens fünfzehn Schlüssel. Dort liefert dieselbe Rechnung die angezeigten 34 und 22.
-
Lernpfad
Was eine Datenstruktur mit wenig Aufwand leistet
Quellen (2)
- Heapsort as first published: J. W. J. Williams, "Algorithm 232: Heapsort," Communications of the ACM 7(6), 347–348, June 1964.
- The heap-based sort published six months later, close to the version used today: Robert W. Floyd, "Algorithm 245: Treesort 3," Communications of the ACM 7(12), 701, December 1964.