Prioritätswarteschlangen SS12
Inhaltsverzeichnis |
Einführung: binäre Heaps
Da bei Prioritätswarteschlangen die Datenstruktur des Heaps verwendet wird ist es zunächst notwendig diese zu einzuführen. Zum besseren Verständis beim Umgang mit Heaps wird der Heapsort Algorithmus erläutert. Ein binärer Heap kann als ein fast vollständiger binärer Baum angesehen werden. Jeder Knoten entspricht dabei einem Element des Feldes. Die niedrigste Ebene des Baumes ist von links her bis zu einem bestimmten Punkt, der Rest vollständig gefüllt. Ist A ein Feld, dass einen Heap repräsentiert, dann hat es zwei Eigenschaften: länge[A], die Anzahl der Elemente des Feldes, und heap-größe[A], die Anzahl der Elemente im Heap. Es ist also kein Element hinter A[heap-größe(A)] mit heap-größe[A] \leq länge[A] ein Element des Heaps. Die Wurzel des Baumes ist A[1]. Bei gegebenem Index i lassen sich die Indizes des Vaters Vater(i) und die des rechten und linken Kindes Right(i), bzw. Left(i) berechnen.
Vater(i) \lfloor return' i/2 \rfloor
Right(i)
return 2iLeft(i)
return 2i+1Die Höhe eines Knoten ist als die Anzahl der Kanten des längsten einfachen absteigenden Pfades zu einem Blatt definiert. Die Höhe des Heaps ist die Höhe seiner Wurzel. Ein Heap mit n Elementen hat die Höhe \theta(lg n), da er auf einem vollständigen binären Baum basiert.
Arten binärer Heaps
Es gibt zwei Arten binärer Heaps: Max-Heaps und Min-Heaps. Beide erfüllen eine spezifische Heap-Eigenschaft. Die Max-Heap-Eigenschaft besteht darin, dass für jeden Knoten i außer der Wurzel gilt: A[Vater(i)] \geq A[i], d.h. der Wert eines Knotens ist stets höchstens so groß, wie der seines Vaters. In einem Max-Heap liegt das größte Element also in der Wurzel.
Ein Min-Heap ist entgegengesetzt aufgabaut. Hier gilt: A[Vater(i)] \leq A[i]. Hier liegt in der Wurzel das kleinste Element. Für Heapsort werden Max-Heaps verwendet, für Prioritätswarteschlangen Min-Heaps.
Grundlegende Operationen
Max-Heapify
Sorgt für die Aufrechterhaltung der Heap-Eigenschaft. Erhält ein Feld A und einen Index i. Es wird angenommen, dass die Bäume, die von Left(i) und Right(i) ausgehen die Max-Heap-Eigenschaft erfüllen, A[i] dagegen kann kleiner als seine Kinder sein, was die Heap-Eigenschaft verletzen würde. Max-Heapify lässt den Wert von A[i] im Heap nach unten sinken, sodass der von i ausgehende Teilbaum zu einem Max-Heap wird.
Max-Heapify(A,i) l\leftarrowLeft(i) r\leftarrowRight(i) if l \leq heap-größe[A] und A[l] > A[i] then maximum \leftarrow l else maximum \leftarrow i if r \leq heap-größe[A] und A[r] > A[maximum] then maximum \leftarrowr if maximum \neq i then vertausche A[i] \leftrightarrow A[maximum] Max-Heapify(A,maximum)
Klassen-Definitionen
Prioritätswarteschlangen
Wie in der letzten Präsentation deutlich wurde ist Heapsort ein guter Algorithmus, wird aber von Quicksort geschlagen. Dennoch ist die Datenstruktur des Heaps sehr nützlich. Unter anderem bei Prioritätswarteschlangen. Wie bei Heaps gibt es auch hier zwei Varianten Max-Prioritätswarteschlangen und Min-Prioritätswarteschlangen. Im folgenden werden Min-Prioritätswarteschlangen verwendet.
- Prioritätswarteschlange
- Eine Prioritätswarteschlange ist eine Datenstruktur für die Speicherung einer Menge S, deren Elementen jeweils ein Wert zugeordnet ist, den man als Schlüssel bezeichnet.
Eine Min-Prioritätswarteschlange unterstützt folgende Grundoperationen:
Insert(S,x) fügt das Element x in die Menge S ein. Operation kann als S \leftarrow S \bigcup {x} geschrieben werden.
Minimum(S) gibt das Element mit dem kleinsten Schlüssel zurück
Extract-min entfernt das kleinste Element und gibt es zurück
build
Addressierbare Prioritätswarteschlangen unterstützen zusätzlich:
insert
remove(h) element mit handle h enfernen
decrease-key(S,x,k) verringert den Wert des Schlüssels von Element x auf den neuen Wert k, von dem angenommen wird, dass er genauso groß ist, wie der aktuelle wert.
Merge(M,Q) M:=M \bigcup Q; Q:=leere Menge
anwendungsbeispiel
\TBD
binary heaps können adressierbar sein aber dafür gibts bessere heaps
theorem 6.1 (S6) \TBD
Nicht Adressierbare Prioritätswarteschlangen
siehe prio-queues was hir rein soll
Binary Heaps
was ist das, wie funktioniert das?
Adressierbare Prioritätswarteschlangen
siehe prio-queues
Binominal Bäume
nochmal, aber spezieller
Pairing-heaps
wer wie was *clap* *clap*
Fibonacci-heaps
wieso wesshalb warum,