Was bisher geschah ADT Menge Operationen: I Suche nach einem Element I Einfügen eines Elementes I Löschen eines Elementes Datenstrukturen für ADT Menge I lineare Datenstrukturen: Array, Liste, Hashtabelle I hierarchische Datenstrukturen: Suchbäume, balancierte Suchbäume 144 Priority-Queues (Vorrang-Warteschlange) Idee: I Modellierung von Prioritäten, z.B. Dringlichkeit I Datenstruktur zur Verwaltung von Paaren (Schlüssel, Wert) I Schlüssel repräsentieren Priorität I kleiner Schlüssel = hohe Priorität I Zugriff nur auf ein Element maximaler Priorität (kleinster Schlüssel) 145 ADT Priority-Queue I Sorten: Bool, Element, PQ I Signatur: leer : PQ → leerepq : insert : PQ × Element → deletemin : PQ → I Bool PQ PQ PQ × Element Axiome: (M(p) bezeichnet die Menge aller in p enthaltenen Elemente, min(p) das Element mit geringster Priorität in q) M(leerepq) = ∅ M(insert(p, e)) = M(p) ∪ {e} M(deletemin(p)) = (M(p) \ {min(p)}, min(p)) 146 Sortieren mit Priority-Queue Wiederholung: Spezifikation des Sortier-Problemes: Vorbedingung: Eingabe (x1 , x2 , . . . , xn ) mit ∀i ∈ {1, . . . , n} : xi ∈ natürlicher Zahlen N Nachbedingung: Ausgabe (y1 , y2 , . . . , yn ) ist 1. y1 ≤ y2 ≤ · · · ≤ yn+1 (aufsteigend geordnet) und 2. eine Permutation (Umordnung) der Eingabe (x1 , x2 , . . . , xn ) Algorithmus zum Sortieren mit Priority-Queue: 1. alle Eingabeelemente x1 , x2 , . . . , xn nacheinander in eine leere PQ einfügen (insert) 2. alle Elemente nacheinander entfernen und ausgeben (deletemin) Laufzeit implementierungsabhängig 147 PQ-Implementierung als Liste unsortierte Liste: I insert: zu Beginn der Liste in O(1) I deletemin: Minimum-Suche in O(n) sortierte Liste: I insert: sortiertes Einfügen in O(n) I deletemin: O(1) 148 PQ-Implementierung als Baum Binäre Suchbäume: Laufzeiten: Tiefe des Baumes I insert: sortiertes Einfügen in O(n) I deletemin: O(n) AVL-Bäume: Laufzeiten: Tiefe des Baumes I insert: sortiertes Einfügen in O(log n) I deletemin: O(log n) 149 Heaps Ein Baum t erfüllt die Heap-Eigenschaft: I t ist ein vollständig balancierter Binärbaum d.h. in jedem Knoten Node(x, l, r ) in t gilt: |size(l) − size(r )| ≤ 1 I t ist heap-geordnet: in jedem Knoten Node(x, Node(y , l, r ), Node(z, s, t)) in t gilt: x ≤ y und x ≤ z Beispiele (Tafel) Auf jedem Pfad eines Heaps sind die Schlüssel sortiert (aufsteigend von Wurzel zu Blatt) 150 Einfügen eines Schlüssels Einfügen eines Schlüssels v : 1. Neuen Knoten mit Schlüssel v auf der ersten freien Position im Heap (Blattebene) einfügen (ggf. neue Blattebene beginnen) Heap-Eigenschaft evtl. verletzt 2. benachbarte Knotenwerte entlang des Pfades vom neu eingefügten Knoten zur Wurzel austauschen, bis Schlüssel auf dem Pfad sortierte Folge bilden Warum erhält diese Operation die Heap-Eigenschaft? Laufzeit: O(log n) (Tiefe des Baumes) 151 Entfernen des Wurzelknotens Ausgabe und Löschen des Wurzelelementes des Heap: 1. Ausgabe des Wertes in der Wurzel 2. Kopie des Wertes des letzen Blattes in Wurzel, Löschen des letzten Blattes Heap-Eigenschaft evtl. verletzt 3. Austausch der Knotenwerte von Vater und dem Sohn mit kleinstem Knotenwert, beginnend in der Wurzel Warum erhält diese Operation die Heap-Eigenschaft? Laufzeit: O(log n) (Tiefe des Baumes) 152 PQ-Implementierung als Heap Operationen: I insert: Einfügen in Heap O(log n) I deletemin: Entfernen der Wurzel in O(log n) 153 Heap-Sort Vorbedingung: Eingabe (x1 , x2 , . . . , xn ) mit ∀i ∈ {1, . . . , n} : xi ∈ natürlicher Zahlen N Nachbedingung: Ausgabe (y1 , y2 , . . . , yn ) ist 1. y1 ≤ y2 ≤ · · · ≤ yn+1 (aufsteigend geordnet) und 2. eine Permutation (Umordnung) der Eingabe (x1 , x2 , . . . , xn ) Heap-Sort-Algorithmus zum Sortieren: 1. alle Eingabeelemente x1 , x2 , . . . , xn nacheinander in einen leeren Heap einfügen (insert) Laufzeit für jedes Element O(log n), gesamt O(n log n) 2. alle Elemente nacheinander entfernen und ausgeben (deletemin) Laufzeit für jedes Element O(log n), gesamt O(n log n) Laufzeit O(n log n) 154