Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Heap und Prioritätswarteschlange

Nach dieser Lektion: Ich kann mit einem Heap den kleinsten Wert bereithalten.

Lektion, 55 Min.2 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Was ist ein Heap?

Ein Heap (auf Deutsch Halde) ist eine Datenstruktur, die den kleinsten Wert immer ganz oben bereithält. Er ist die Grundlage der Prioritätswarteschlange, mit der ein Rechner das Dringendste zuerst erledigt.

Ein Rechner der Hochschule bekommt Aufträge mit einer Priorität. Der Auftrag mit der kleinsten Zahl ist am dringendsten und läuft zuerst.

Am Ende dieser Lektion

Notiz

Ich kann mit einem Heap den kleinsten Wert bereithalten.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Heapein Baum, in dem jeder Knoten höchstens so groß ist wie seine Kinder
Prioritäteine Zahl, die sagt, wie dringend etwas ist1
Prioritätswarteschlangeeine Warteschlange, die das Dringendste zuerst herausgibt
Aufsteigeneinen Wert nach oben tauschen, bis die Regel stimmt
Versickerneinen Wert nach unten tauschen, bis die Regel stimmt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Im Heap steht das Kleinste oben

Ein Heap ist ein Baum, bei dem jeder Knoten höchstens so groß ist wie seine Kinder. Damit steht das Kleinste immer an der Spitze. Die Kinder untereinander sind nicht sortiert. Gespeichert wird er in einer einfachen Liste. Die Tabelle zeigt, welche Plätze die Kinder eines Platzes haben.

Die Plätze von Eltern und Kindern

PlatzErstes KindZweites Kind
012
134
256
378

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Einen Heap mit heapq bauen

Das Modul heapq gehört zu Python. heapify macht aus einer Liste einen Heap. heappop nimmt die Spitze heraus. Der erste Befehl gibt die Spitze aus. Der zweite nimmt dreimal nacheinander die Spitze heraus.

Die Spitze eines Heaps ausgeben

Befehl
python3 -c "import heapq; h = [9, 5, 8, 2, 6, 3]; heapq.heapify(h); print(h[0])"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dreimal die Spitze herausnehmen

Befehl
python3 -c "import heapq; h = [9, 5, 8, 2, 6, 3]; heapq.heapify(h); print(heapq.heappop(h), heapq.heappop(h), heapq.heappop(h))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Push hängt hinten an und lässt aufsteigen

Beim push hängen Sie den Wert hinten an. Dann tauschen Sie ihn mit seinem Elternplatz, solange er kleiner ist. Das ist das Aufsteigen. Beim pop nehmen Sie die Spitze heraus. Der letzte Wert kommt nach oben und sickert nach unten: Sie tauschen ihn mit dem kleineren Kind, solange er größer ist. Beide Wege sind höchstens so lang wie die Höhe des Baums.

Beispiel: die 1 einfügen

SchrittListeWas passiert
Anhängen2 5 3 9 6 8 1Die 1 steht auf Platz 6
12 5 1 9 6 8 3Eltern ist Platz 2 (3), die 1 ist kleiner: Tausch
21 5 2 9 6 8 3Eltern ist Platz 0 (2), die 1 ist kleiner: Tausch
Ende1 5 2 9 6 8 3Platz 0 hat keine Eltern: fertig

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Einen Wert aufsteigen lassen

Code: python
# Eine 1 in einen Heap einfuegen und aufsteigen lassen.
halde = [2, 5, 3, 9, 6, 8]
halde.append(1)
platz = len(halde) - 1
while platz > 0 and halde[platz] < halde[(platz - 1) // 2]:
    eltern = (platz - 1) // 2
    merk = halde[platz]
    halde[platz] = halde[eltern]
    halde[eltern] = merk
    platz = eltern
print(halde)
# Fuegen Sie statt der 1 die 7 ein: sie bleibt ganz hinten.

Beispiel: die Spitze herausnehmen

SchrittListeWas passiert
Start1 5 2 9 6 8 3Die 1 ist die Spitze
Letzten nach oben3 5 2 9 6 8Die 3 steht an der Spitze
Tausch2 5 3 9 6 8Kinder 5 und 2: die 2 ist kleiner
Ende2 5 3 9 6 8Das Kind der 3 ist die 8, also fertig

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Prioritätswarteschlange liefert das Dringendste

Ein Heap von Aufträgen ergibt eine Prioritätswarteschlange. Jeder Auftrag ist ein Paar aus Priorität und Name. Die kleinste Priorität ist die dringendste. Mit push kommt ein Auftrag hinzu, mit pop kommt der dringendste heraus. Bei gleicher Priorität entscheidet der Name nach dem Alphabet.

Aufträge nach Priorität herausnehmen

Code: python
# Eine Prioritaetswarteschlange mit dem Modul heapq.
import heapq

auftraege = []
heapq.heappush(auftraege, [3, "Backup"])
heapq.heappush(auftraege, [1, "Sicherheitsupdate"])
heapq.heappush(auftraege, [2, "Mail-Versand"])
while len(auftraege) > 0:
    print(heapq.heappop(auftraege))
# Fuegen Sie [1, "Abrechnung"] hinzu: wer kommt zuerst?

Ein häufiger Fehler

Warnung

Viele denken, ein Heap sei sortiert, wenn man die Liste von vorn liest. Die Liste 1 5 2 9 6 8 3 ist ein gültiger Heap, aber nicht sortiert. Nur die Spitze ist sicher die kleinste. Für eine sortierte Ausgabe nehmen Sie so oft pop, bis der Heap leer ist.

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.