Priority Queues and Heapsort

Ähnliche Dokumente
Programmiertechnik II

Suchen und Sortieren (Die klassischen Algorithmen)

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Suchen und Sortieren Sortieren. Heaps

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Programmiertechnik II

Vorlesung Datenstrukturen

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

Geordnete Binärbäume

HEUTE. Datenstrukturen im Computer. Datenstrukturen. Rekursion. Feedback Evaluation. abstrakte Datenstrukturen

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Datenstrukturen & Algorithmen

14. Rot-Schwarz-Bäume

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Informatik II, SS 2014

2 Java: Bäume. 2.1 Implementierung von Bäumen. 2.2 Implementierung eines binären Suchbaums. 2.3 Traversierung von Bäumen

Programmieren I. Kapitel 7. Sortieren und Suchen

Vorrangswarteschlangen

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Binärbäume. Prof. Dr. E. Ehses,

Erinnerung VL

Suchen und Sortieren

Teil II: Prioritätslisten (Priority Queues)

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Algorithmen und Datenstrukturen

Kapitel 9 Suchalgorithmen

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Bäume, Suchbäume und Hash-Tabellen

Abstrakte Datentypen.

DATENSTRUKTUREN UND ZAHLENSYSTEME

Algorithmen und Datenstrukturen Suchbaum

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Algorithmen und Datenstrukturen 1

27. August 2013 Einleitung. Algorithmen und Datenstrukturen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Java Einführung Collections

10. Kapitel (Teil1) BÄUME GRUNDLAGEN. Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm

Informatik II Musterlösung

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Grundlagen der Informatik Generische Klassen

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Schnittstellen implementieren am Beispiel Suchbaum

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Algorithmen & Datenstrukturen 1. Klausur

Objektorientierte Programmierung

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

JAVA KURS COLLECTION

Überblick. Lineares Suchen

Grundlegende Sortieralgorithmen

EndTermTest PROGALGO WS1516 A

Advanced Programming in C

Tutoraufgabe 1 (2 3 4 Bäume):

Software Engineering Klassendiagramme Assoziationen

8 Baum in perfekter Komposition

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Sortierverfahren für Felder (Listen)

Übung 13: Priority Queues (Vorrangwarteschlangen 1 )

Einführung in die Informatik I Kapitel II.3: Sortieren

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Problemlösen, ein Einstieg nicht nur für die Informatik

Objektorientierte Programmierung

Programmieren in Java

Datenstrukturen und Algorithmen

Client-Server-Beziehungen

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

6 Speicherorganisation

Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Tutorium Algorithmen & Datenstrukturen

Rekurrenzen T(n) = T(n 1) + N beschreibt Laufzeitverhalten eines rekursiven Algorithmus

Teil V. Generics und Kollektionen in Java

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Grundlagen: Algorithmen und Datenstrukturen

Algorithms & Datastructures Midterm Test 1

Einführung in die Informatik 2

Kap. 4.2: Binäre Suchbäume

Grundlagen der Programmierung

Welche Informatik-Kenntnisse bringen Sie mit?

Transkript:

19. ovember 2012 Prioritätswarteschlangen und Priority Queues and Ferd van denhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software ngineering 19. ovember 2012 D/FHTBM Priority Queues and 19. ovember 2012 1/34 Prioritätswarteschlangen und Prioritätswarteschlangen und Was ist eine Prioritätswarteschlange? s ist eine Warteschlange (queue) s gibt eine Prioritätsregel, die zu jedem Zeitpunkt auf ein lement mit höchster Priorität verweist. Wird ein neues lement in die Warteschlange geschrieben, kann das ein neues dringendstes lement bedeuten. ft ist der größte Schlüssel der mit der höchsten Priorität; die Bedeutung des Schlüssels bezieht sich dann auf die betreffende nwendung. ine Prioritätswarteschlange ist eine Datenstruktur von lementen mit Schlüsseln, die zwei grundlegende perationen unterstützt: ein neues lement einfügen und das lement mit dem größten Schlüssel löschen. D/FHTBM Priority Queues and 19. ovember 2012 2/34 Prioritätswarteschlangen und Prioritätswarteschlangen (2) Prioritätswarteschlangen werden für viele lgorithmen genutzt. Sehen wir uns zunächst ein Sortier-lgorithmus an. Wir wollen eine Datenstruktur erzeugen und pflegen, die Datensätze mit numerischen Schlüsseln (priorities) enthält. Die Basisoperationene sind: ine Prioritätswarteschlange aus gegebenen lementen erzeugen. in neues lement einfügen. Das Maximum lement löschen. Sonstige perationen sind: Die Priorität eines willkürlich festgelegten lements ändern. in willkürlich festgelegtes lement löschen. Zwei Prioritätswarteschlangen zu einer großen verbinden. D/FHTBM Priority Queues and 19. ovember 2012 3/34 1

19. ovember 2012 Prioritätswarteschlangen und Basis-DT Prioritätswarteschlange adt { MaxPQ MaxPQ () void insert (it: Item ) Item getmax () // optional MaxPQ ( maxsize : int ) Item delmax () boolean ismpty () int size () Die meiste perationen von Prioritätswarteschlangen sind im diesem DT Interface. D/FHTBM Priority Queues and 19. ovember 2012 4/34 Prioritätswarteschlangen und Stacks und Warteschlangen: es gibt perationen mit konstanter Zeit perationen zum infügen UD Löschen des Maximums in konstanter Zeit sind schwieriger Sequenz geordnet halten: Maximum in konstanter Zeit löschen und finden; nicht für infügen Sequenz nicht geordnet halten: in konstanter Zeit einfügen; nicht für Maximum löschen und finden ifrig oder faul (eager/lazy): eine faule Implementierung wartet, bis die rbeit notwendig wird Trade-off bei doppelt verketteten Listen: Löschen in konstanter Zeit versus mehr Platz für die Links D/FHTBM Priority Queues and 19. ovember 2012 5/34 Prioritätswarteschlangen und rray Implementierung einer Prioritätswarteschlange (lgorithm 2.6) public class MaxPQ <Key extends Comparable <Key >> { private Key [] pq; private int = 0; public MaxPQ ( int max ) { pq = ( Key []) new Comparable [ max + 1]; public void insert ( Key x) { pq [++ ] = x; swim (); public Key delmax () { Key max = pq [1]; exch (1, - -); pq[ +1] = null ; sink (1); return max ; D/FHTBM Priority Queues and 19. ovember 2012 6/34 2

19. ovember 2012 Prioritätswarteschlangen und Worst case Kosten von Prioritätswarteschlange-perationen Basis-Methoden: unsortierte rrays und Listen Fortschrittlichere Methoden: Heap und Warteschlange. insert remove max find max ordered array: 1 1 ordered list: 1 1 unordered array: 1 unordered list: 1 heap: lg() lg() 1 best in theory: 1 lg() 1 D/FHTBM Priority Queues and 19. ovember 2012 7/34 Prioritätswarteschlangen und Heap-geordneter Baum und Heap lgorithmen für (heap ordered) in Baum ist als Heap geordnet, wenn der Schlüssel jedes Knotens größer oder gleich den Schlüsseln seiner Kind-Knoten ist (wenn es Kind-Knoten gibt). (proposition.) Der größten Schlüsselwert in einen Heap-geordneter Binärbaum findet man im Root. Der Heap-geordnete Baum sollte vollständig sein: alle Levels befüllt, ausnahme das untere. Siehe nächste Folie. (proposition P.) Die Höhe einer vollständigen Binärbaum mit Knoten ist lg(). D/FHTBM Priority Queues and 19. ovember 2012 8/34 Prioritätswarteschlangen und lgorithmen für eines Heap-geordneten Baums. X T G S M R I rray Implementeierung (Level-rdnung, Start ab rray-index 1) 1 2 3 4 5 6 7 8 9 10 11 12 X T G S M R I D/FHTBM Priority Queues and 19. ovember 2012 9/34 3

19. ovember 2012 Prioritätswarteschlangen und Heap-geordneter Baum und Heap lgorithmen für Wenn der Binärbaum vollständig ist, hat der Knoten an Position i (level-order) als lternknoten den Knoten an [i/2]. Umgekehrt hat ein Knoten an Position i seine Kindknoten (wenn es welche gibt) an den Positionen 2 i und 2 i + 1. s ist eine Darstellung als rray möglich, bei der es zwischen einem Knoten und seinem ltern- und den Kindknoten keine Links geben muss, wie wir sie in einer verketteten Darstellung brauchen. Denken Sie daran, dass es auf allen Pfaden in einem vollständigen Baum von Knoten ungefähr lg() Knoten gibt ( < 1 + 2 + 4 +... + /8 + /4 + /2) umber of levels = lg(). D/FHTBM Priority Queues and 19. ovember 2012 10/34 Heapifying Prioritätswarteschlangen und lgorithmen für Die Heap-Bedingung erfüllen: Heapifying oder den Heap reparieren. Die Heap-Bedingung ist ein sogenannter Invariant (etwas das sich nicht ändern darf), jede peration auf einen Heap muss diesen Invariant erfüllen. Wird der Schlüssel eines Knotens größer als der Schlüssel seines lternknotens, vertauschen Sie einfach den Knoten und seinen lternknoten. Falls nötig, wiederholen Sie das. Wird der Schlüssel eines Knotens kleiner als der Schlüssel eines oder beider Kindknoten, vertauschen Sie einfach den Knoten und den Kindknoten mit dem größten Schlüssel. Falls nötig, wiederholen Sie das. Swim and sink Methoden (siehe nächste Folie) bieten die Hilfsmittel zum Reparieren des, nachdem ein lement eingefügt oder seine Priorität geändert wurde. D/FHTBM Priority Queues and 19. ovember 2012 11/34 Prioritätswarteschlangen und lgorithmen für Bottum-up and bottum-down heapify help methods private void swim ( int k) { while (k > 1 && less (k/2, k)) { exch (k, k /2); k = k /2; private void sink ( int k, int ) { while (2* k <= ) { int j =2* k; if (j< && less (j, j +1)) j ++; if (! less (k, j)) break ; exch (k, j); k = j; D/FHTBM Priority Queues and 19. ovember 2012 12/34 4

19. ovember 2012 Heapify (swim) Prioritätswarteschlangen und lgorithmen für X S G R T I M Kind T von lter S... die Heapkondition. D/FHTBM Priority Queues and 19. ovember 2012 13/34 Heapify (swim) Prioritätswarteschlangen und lgorithmen für X T P G S R I M Knoten T hat sich zweimal durch umtauschen mit seinem lternknoten hoch bewegt damit die Heap-Bedingung wieder erfüllt ist. D/FHTBM Priority Queues and 19. ovember 2012 14/34 Heapify (sink) Prioritätswarteschlangen und lgorithmen für T X G S P R I M lterknoten, in diesem Fall der Rootknoten, übertretet der Heap-Bedingung. D/FHTBM Priority Queues and 19. ovember 2012 15/34 5

19. ovember 2012 Heapify (sink) Prioritätswarteschlangen und lgorithmen für X T P G S R I M Knoten ist getauscht worden mit der größten Kindknoten X, und danach nochmal mit seinem größten Kindknoten P. D/FHTBM Priority Queues and 19. ovember 2012 16/34 Prioritätswarteschlangen und lgorithmen für Heap-basierte Prioritätswarteschlange public class Heap <Key > implements Iterable <Key > { private Key [] pq; private int ; private Comparator <Key > comparator ; public Heap ( Key [] keys ) { = keys. length ; pq = ( Key []) new bject [ keys. length + 1]; for ( int i = 0; i < ; i ++) pq[i +1] = keys [i]; heapify (); private void heapify () { for ( int k = /2; k >= 1; k - -) sink (k); D/FHTBM Priority Queues and 19. ovember 2012 17/34 Prioritätswarteschlangen und lgorithmen für Komplexität der lgorithmen für (Proposition Q.) 1 Die peration insert für den abstrakten Datentyp Prioritätswarteschlange lasst sich mit Heap-geordneten Bäumen so implementieren, dass insert nicht mehr als 1 + lg() Vergleiche braucht. 2 Die peration remove max für den abstrakten Datentyp Prioritätswarteschlange lässt sich so mit Heap-geordneten Bäumen implementieren dass nicht mehr als 2lg() Vergleiche nötig sind. D/FHTBM Priority Queues and 19. ovember 2012 18/34 6

19. ovember 2012 Prioritätswarteschlangen und Sortieren mit Hilfe einer Prioritätswarteschlange in rray von lementen kann man sortieren mit Hilfe einer Prioritätswarteschlange und die remove maximum Methode. Wenn die Prioritätswarteschlange ungeordnet ist, ähnelt das Programm einem Selection Sort. Wenn die Prioritätswarteschlange geordnet ist, ähnelt das Programm einem Insertion Sort. Die Implementierung im Code auf der nächste Folie ist nicht optimal: s entstehen überflüssige Kopien von lementen. infügungen in Folge zum rstellen des ist keine effiziente Methode. D/FHTBM Priority Queues and 19. ovember 2012 19/34 Prioritätswarteschlangen und rstes Sortier-Programm mit Prioritätswarteschlange class HeapSort1 { void sort ( Item [] a, int l, int r) { pqsort (a, l, r); void pqsort ( Item [] a, int l, int r) { int k; MaxPQ pq = new MaxPQ (r- l +1); for ( k = 1; k <= r; k ++) pq. insert (a[k ]); for (k = r; k >= l; k - -) a[k] = pq. getmax (); D/FHTBM Priority Queues and 19. ovember 2012 20/34 Prioritätswarteschlangen und Das Programm HeapSort1 funktioniert wie ein Selection Sort. ffizienter gehen wir durch den Heap, indem wir kleine Subheaps von unten nach oben erstellen. Jeder Knoten wird als die Wurzel eines Subheaps betrachtet, und sink funktioniert auch für solche gut. in Knoten mit zwei Subheaps als seinen Kindern wird ein Heap, indem man sink für diesen Knoten aufruft. Indem wir rückwärts für jeden Knoten sink aufrufen, stellen wir induktiv die Heap-Bedingung her. D/FHTBM Priority Queues and 19. ovember 2012 21/34 7

19. ovember 2012 Prioritätswarteschlangen und lgorithme 2.7 public void sort ( Comparable [] a) { for ( int k = /2; k >= 1; k - -) { sink (a, k, ); while ( > 1) { exch (a, 1, - -); sink (a, 1, ); (Proposition R.) Sink-basierten Heap-Konstruktion benötigt weniger als 2 Vergleiche und weniger als Vertauschungen zum erstellen einer Heap aus lementen. D/FHTBM Priority Queues and 19. ovember 2012 22/34 Prioritätswarteschlangen und rray-indexen in heap Baum 1 2 3 4 5 /2 7 8 9 10 11-1 ist ungerade: letzte Knoten mit Kindknoten hat 2 KindKnoten. Knoten bei Index /2 ist der letzte Knoten mit Kindknoten; auch wenn gerade ist. D/FHTBM Priority Queues and 19. ovember 2012 23/34 Prioritätswarteschlangen und rray-indexen in heap Baum (2) 1 2 3 4 5 /2 7 8 9 10-1 ist gerade: letzte Knoten mit Kindknoten hat 1 KindKnoten. Knoten bei Index /2 ist der letzte Knoten mit Kindknoten; auch wenn ungerade ist. D/FHTBM Priority Queues and 19. ovember 2012 24/34 8

19. ovember 2012 Prioritätswarteschlangen und Sink-Methode mehr detailliert private void sink ( int k, int ) { while (2* k <= ) { // 1 int j =2* k; // 2 if (j< && less (j, j +1)) j ++; // 3 if (! less (k, j)) break ; // 4 exch (k, j); k = j; // 5 1 Knoten auf k hat links Kind auf 2 k, stop wenn 2 k >. 2 Start bei linker Knoten mit j. ls j == dann j gerade: kein rechter Knoten. Genaue Behandlung von der letzte Knoten! D/FHTBM Priority Queues and 19. ovember 2012 25/34 Prioritätswarteschlangen und Sink-Methode mehr detailliert (2) private void sink ( int k, int ) { while (2* k <= ) { // 1 int j =2* k; // 2 if (j< && less (j, j +1)) j ++; // 3 if (! less (k, j)) break ; // 4 exch (k, j); k = j; // 5 3 Wenn j < dann existiert rechter Knoten; Wenn j == gibt es kein rechter Kindknoten. Größtes Kind gefunden auf j. 4 Wenn Knoten auf k nicht kleiner als Knoten auf j: nichts zu tun, break. 5 Wenn Knoten auf j größer als Knoten auf k: austauschen. D/FHTBM Priority Queues and 19. ovember 2012 26/34 Prioritätswarteschlangen und rste Teil der heapsort code for ( int k = /2; k >= 1; k - -) { sink (a, k, ); Knoten mit Index k = /2 ist letzte Knoten mit Kinder (der letzte lterknoten - parent). Von hier geht s Levelorder aufwerts im Baum und heapify mittels sink. D/FHTBM Priority Queues and 19. ovember 2012 27/34 9

19. ovember 2012 Prioritätswarteschlangen und Zweiten Teil of heapsort code while ( > 1) { exch (a, 1, - -); sink (a, 1, ); In-place sortierung: vertausche max Item (Index 1) mit letzte Knoten von unsortierten Teil des Baums (Index ). Funkioniert wie selection sort llererst mit 1 reduzieren und dann heapify durch nruf von sink für neue Wurzel. D/FHTBM Priority Queues and 19. ovember 2012 28/34 Prioritätswarteschlangen und (1) Zuerst bauen wir einen Heap von unten auf, in-place. for( int k=/2; k>=1; k--) sink(k, ); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 S R T I G X M P L S R T I G X M P L S R T P G X M I L S R X P G T M I L S R X P G T M I L S P R X G T M I L X P R T G S M I L X T P R S G M I L D/FHTBM Priority Queues and 19. ovember 2012 29/34 Prioritätswarteschlangen und (2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 S R T I G X M P L S R T I G X M P L S R T P G X M I L S R X P G T M I L S R X P G T M I L S P R X G T M I L S P R X G T M I L X P R S G T M I L X P R T G S M I L X P R T G S M I L X T P R G S M I L X T P R S G M I L D/FHTBM Priority Queues and 19. ovember 2012 30/34 10

19. ovember 2012 Heapified Prioritätswarteschlangen und a[-, X, T, P, R, S,,, G,,,, M, I, L, ] X T P R S G M I L ist ungerade: letzte Knoten mit Kindknoten hat 2 KindKnoten. Knoten bei Index /2 ist der letzte Knoten mit Kindknoten; auch wenn gerade ist. D/FHTBM Priority Queues and 19. ovember 2012 31/34 Prioritätswarteschlangen und (3) Dann lösschen wir jedesmal das größte element vor der Heap. Die fette Buchstaben stimmen überein mit dem schon sortierten Teil des rrays. while(>1) {exch(1,); sink(1, --); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 T S P R G M I L X S R P L G M I T X R L P I G M S T X P L I M G R S T X L I M G P R S T X L M I G P R S T X M L I G P R S T X D/FHTBM Priority Queues and 19. ovember 2012 32/34 Prioritätswarteschlangen und (4) while(>1) {exch(1,); sink(1, --); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 X T P R S G M I L T P R S G M I L X T P R S G M I L X T S P R G M I L X T S P R G M I L X D/FHTBM Priority Queues and 19. ovember 2012 33/34 11

19. ovember 2012 Prioritätswarteschlangen und igenschaften (Proposition S.) bracht weniger als 2 lg() Vergleichungen (und halb soviel Vertauschungen zum sortiern von lemente. igenschaft S und die In-place igenschaft sind aus praktischen Gründen wichtig: garantiert das In-place-Sortieren von lementen in proportionaler Zeit zu lg(). s gibt keine worst case ingabe, die signifikant verlangsamt (anders als Quicksort). braucht nicht mehr Speicherplatz (anders als Mergesort) D/FHTBM Priority Queues and 19. ovember 2012 34/34 12