Algorithmen und Datenstrukturen

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1

13. Binäre Suchbäume

Vorlesung Datenstrukturen

Algorithmen und Datenstrukturen Suchbaum

Datenstrukturen und Algorithmen

Binäre Bäume Darstellung und Traversierung

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

Informatik II, SS 2014

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Vorkurs Informatik WiSe 16/17

Datenstrukturen & Algorithmen

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

368 4 Algorithmen und Datenstrukturen

Kap. 4.2: Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume

Tutorium Algorithmen & Datenstrukturen

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

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Speicher und Adressraum

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

Suchbäume mit inneren Knoten verschiedener Knotengrade.

Übungen zu Programmierung I - Blatt 8

14. Rot-Schwarz-Bäume

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

Kapitel 9 Suchalgorithmen

Grundlagen der Programmierung

Übung zur Vorlesung Algorithmische Geometrie

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Grundlagen der Programmierung

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

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

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

II.3.1 Rekursive Algorithmen - 1 -

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

Nachtrag zu binären Suchbäumen

Bäume Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1

11.1 Grundlagen - Denitionen

Algorithmen und Datenstrukturen Balancierte Suchbäume

Bäume, Suchbäume und Hash-Tabellen

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

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

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Tutoren Jan Ebbe Pat Mächler Valentino Rugolo Sascha Scherrer. Grundlagen der Programmierung (CS101) - Blatt 8 Theorie [4 Punkte] - Praxis [12 Punkte]

Datenstrukturen und Algorithmen

Übersicht. Rot-schwarz Bäume. Rot-schwarz Bäume. Beispiel. Eigenschaften. Datenstrukturen & Algorithmen. Rot-schwarz Bäume Eigenschaften Einfügen

Datenstrukturen & Algorithmen

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

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

Zeichnen von Graphen. graph drawing

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

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

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

Übung Algorithmen I

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Algorithmen und Datenstrukturen SS09

Algorithmen & Programmierung. Rekursive Funktionen (1)

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

Einführung in die Programmierung

JAVA - Rekursion

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

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Nachtrag zu binären Suchbäumen (nicht (nur) AVL Bäumen: Löschen von Elementen in binären Suchbäumen. 1. Fall: zu löschendes Element ist Blatt: löschen

Suchen und Sortieren

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Geordnete Binärbäume

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:

Algorithmen und Datenstrukturen

Algorithmen zur Visualisierung von Graphen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

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

Tutoraufgabe 1 (2 3 4 Bäume):

Schulinterner Lehrplan für das Fach Informatik der Sekundarstufe II an der Bettine von Arnim Gesamtschule

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

Algorithmen und Datenstrukturen Kapitel 7 Dynamische Mengen, das Suchproblem &

Breiten- und Tiefensuche in Graphen

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Inhalte Informatik. I1 Grundprinzip des objektorientierten Modellierens I3 Modellieren von Netzwerkanwendungen

Rekursive Algorithmen

Teil 14: Rekursive Programmierung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Beispiel zu Datenstrukturen

6 Baumstrukturen. Formale Grundlagen der Informatik I Herbstsemester Robert Marti

Branch-and-Bound. Wir betrachten allgemein Probleme, deren Suchraum durch Bäume dargestellt werden kann. Innerhalb des Suchraums suchen wir

1 topologisches Sortieren

Transkript:

Algorithmen und Datenstrukturen Dipl. Inform. Andreas Wilkens aw@awilkens.com Elementare Datenstrukturen Array Linked List Stack Queue Tree (Feld) (Verkettete Liste) (Stapel) (Warteschlange) (Baum) Einschub: Rekursion 2 1

Rekursion Rekursion ist keine elementare Datenstruktur, sondern eine Programmiertechnik. 3 Rekursion ein rekursives Programm ruft sich selbst auf bzw. eine rekursive Funktion ruft sich selbst auf zu jeder Rekursion gehört eine Abbruchbedingung 4 2

Beispiele für Rekursionen Das Fernsehbild, das sich selbst enthält die Fakultätsfunktion n! aus der Mathematik 5 Fakultätsfunktion n! n! = n * (n-1)! für alle natürlichen Zahlen n größergleich 1 0! = 1 (wichtig: die Abbruchbedingung!) 6 3

Rekursion Iteration Rekursion ruft sich selbst auf enthält Abbruchbedingung Iteration wiederholtes Durchlaufen von Anweisungen Abbruch z.b. nach fest vorgegebener Durchlaufzahl oder durch erfüllte Abbruchbedingung Beispiel: Schleifen (for, while) 7 Terminierung Eine Rekursion muß genauso terminieren wie eine Iteration Bei Rekursion muß irgendwann ein Zustand erreicht werden, in dem kein weiterer rekursiver Aufruf erzeugt wird 8 4

direkt und indirekt direkte Rekursion Funktion ruft sich selbst auf indirekte Rekursion func_a() ruft func_b() auf, die wieder func_a() aufruft usw. 9 indirekte Rekursion void func_a(void) {.. func_b();.. } void func_b(void) {.. func_a();.. } void main(void) {.. func_a();.. } 10 5

Speicherarten im PC Codebereich enthält Programmcode Register dienen als Ablage zur Programmsteuerung Globaler Speicher nimmt globale Variablen auf Stack nimmt u.a. lokale Variablen auf Heap restlicher Speicher, der vom Programmierer mit new angefordert werden kann 11 Stackframe beim Aufruf einer Funktion wird ein Stackframe auf dem Laufzeitstack angelegt dieser enthält die lokalen Variablen die Parameter Rückkehrinformationen wird die Funktion beendet, wird der Stackframe wieder vom Laufzeitstack entfernt 12 6

Stackframes bei Rekursion Laufzeitstack mit 4 rekursiven Instanzen rekur(4) Top rekur(3) rekur(2) rekur(1) main Bottom 13 Teile und herrsche viele rekursive Programme wenden das sogenannte Teile-und-herrsche - Prinzip an engl.: divide and conquer dabei erzeugt die rekursive Funktion zwei rekursive Aufrufe von sich selbst, jeweils mit der Hälfte der Eingabewerte 14 7

Beispiel für Teile und herrsche gegeben sei ein Maßstab dieser soll liniert werden mit Teilstrichen (siehe Lineal) die Teilstriche sollen verschiedene Höhen haben 15 Funktion liniere // zeichnet Teilstriche an eine vorgegebene Strecke // innerhalb der angegebenen Grenzen l und r // Schema: Mittelstrich erhält die Höhe h, // die Mittelstriche der entfallenden linken und // rechten Hälfte erhalten die Höhe h-1 usw. void liniere(int l, int r, int h) { int m = (l+r)/2; markiere(m, h); if (h>1) { liniere(l, m, h-1); liniere(m, r, h-1); } } 16 8

Merkmale der Rekursion Rekursion ruft sich selbst auf enthält Abbruchbedingung void liniere(int l, int r, int h) { int m = (l+r)/2; markiere(m, h); if (h>1) { liniere(l, m, h-1); liniere(m, r, h-1); } } 17 Rekursionsbaum für einen Maßstab der Länge 8 18 9

Noch ein Rekursionsbeispiel Türme von Hanoi 19 Türme von Hanoi Scheiben unterschiedlicher Größen sollen von einem Lagerplatz zu einem anderen Transportiert werden Regeln: es darf nur eine Scheibe zur Zeit transportiert werden es darf nur eine kleinere auf eine größere Scheibe gelegt werden es steht ein zusätzlicher Hilfslagerplatz zur Verfügung 20 10

Beispiellösung Algorithmus zum Lösen des Problems Türme von Hanoi Siehe hanoi.cpp 21 Ablauf für 3 Scheiben: main: Anzahl der Scheiben: 3 towers( 3, A, B, C ); towers( 2, A, C, B ); towers( 1, A, B, C ); Ausgabe: Scheibe 1 von A nach C Ausgabe: Scheibe 2 von A nach B towers( 1, C, A, B ); Ausgabe: Scheibe 1 von C nach B Ausgabe: Scheibe 3 von A nach C towers( 2, B, A, C ); towers( 1, B, C, A ); Ausgabe: Scheibe 1 von B nach A Ausgabe: Scheibe 2 von B nach C towers( 1, A, B, C ); Ausgabe: Scheibe 1 von A nach C Fertig 22 11

Rekursionsbaum Wie sieht der Rekursionsbaum für den Aufruf towers(3, A, B, C) aus? 23 Türme von Hanoi die rekursive Funktion towers besteht nur aus sehr wenigen Zeilen trotzdem kann damit ein recht hoher Aufwand geleistet werden 24 12

Frage Wie kommt man vom Problem Türme von Hanoi zum Algorithmus? 25 Antwort durch nachdenken und vereinfachen 26 13

Einfachster Fall Türme von Hanoi mit nur einer Scheibe Transportiere die Scheibe vom Quellplatz zum Zielplatz Türme von Hanoi mit zwei Scheiben Transportiere die obere, kleinere Scheibe vom Quellplatz zum Hilfplatz Transportiere die untere, größere Scheibe vom Quellplatz zum Zielplatz Transportiere die kleinere Scheibe vom Hilfsplatz zum Zielplatz 27 Allgemeiner Fall (für die größte Scheibe) Um die unterste (größte) Scheibe vom Startplatz zum endgültigen Zielplatz transportieren zu können, muss man 1. Erst alle anderen Scheiben aus dem Weg räumen (zum Hilfsplatz bringen) 2. Jetzt die größte Scheibe zum Zielplatz bringen. 28 14

Allgemeiner Fall (für alle Scheiben) Um alle Scheiben vom Startplatz zum Zielplatz zu transportieren, muss man 1. Alle Scheiben (außer der größten) aus dem Weg räumen (zum Hilfsplatz bringen) 2. Jetzt die größte Scheibe zum Zielplatz bringen. 3. Dann alle anderen (vorher aus dem Weg geräumten Scheiben) wieder oben auf die größte Scheibe legen. (dies gilt immer, unabhängig von der Anzahl der Scheiben) 29 Funktion towers Machen Sie sich die Bedeutung der (nur) drei Zeilen der Funktion towers deutlich! Die drei genannten Punkte auf der vorangegangenen Folie entsprechen jeder genau einer Zeile der towers-funktion! 30 15

Durchlaufen von Binärbäumen Um z.b. alle Werte eines Binärbaumes auszugeben, muß dieser durchlaufen werden. Das Durchlaufen nennt man auch traversieren. 31 Durchlaufen von Binärbäumen Verschiedene Möglichkeiten: 1. WLR Wurzel-Links-Rechts 2. WRL Wurzel-Rechts-Links 3. LWR Links-Wurzel-Rechts 4. LRW Links-Rechts-Wurzel 5. RWL Rechts-Wurzel-Links 6. RLW Rechts-Links-Wurzel 32 16

Beispiel 20 14 33 8 17 26 39 3 11 30 33 Auf einen Blick derselbe Baum, verschiedene Durchlaufvarianten: WLR: 20, 14, 8, 3, 11, 17, 33, 26, 30, 39 LWR: 3, 8, 11, 14, 17, 20, 26, 30, 33, 39 LRW: 3, 11, 8, 17, 14, 30, 26, 39, 33, 20 RWL: 39, 33, 30, 26, 20, 17, 14, 11, 8, 3 34 17

Erkenntnis Durchläuft man einen Binärbaum nach LWR (Inorder), so erhält man eine aufsteigende Sortierung. Durchläuft man einen Binärbaum nach RWL, so erhält man eine absteigende Sortierung. 35 Programmieren Das Durchlaufen eines binären Suchbaums kann mittels Rekursion sehr einfach programmiert werden. Wiederholung Rekursion: eine rekursive Funktion ruft sich selbst auf zu jeder Rekursion gehört eine Abbruchbedingung 36 18

Datenstruktur eines Knotens struct node { ItemType wert; struct node left, right; }; 37 Preorder (WLR) programmiert void preorder(node *root) { /* Was muß hier stehen?*/ } 38 19

Preorder (WLR) programmiert void preorder(node *root) { if (root!=null) { print_value(root); preorder(root->left); preorder(root->right); } } 39 Inorder (LWR) programmiert void inorder(node *root) { if (root!=null) { inorder(root->left); print_value(root); inorder(root->right); } } 40 20

Postorder (LRW) programmiert void postorder(node *root) { if (root!=null) { postorder (root->left); postorder (root->right); print_value(root); } } 41 Löschen im binären Suchbaum Neben dem Einfügen von Knoten ist auch das Löschen von Knoten zu betrachten. Dabei sind verschiedene Fälle zu berücksichtigen. 42 21

Löschen im binären Suchbaum 20 14 33 8 17 26 39 3 11 30 Fall 1: Löschen eines Blattes, z.b. Knoten mit Wert 30. Trivial! 43 Löschen im binären Suchbaum 20 14 33 8 17 26 39 3 11 30 Fall 2: Löschen eines Knotens mit nur einem Nachfolger (Knoten mit Wert 26) 44 22

Löschen im binären Suchbaum Fall 2: Der Nachfolger (-Teilbaum) kann den zu löschenden Knoten ersetzen. 45 Löschen im binären Suchbaum Fall 2: Vorgehen: 20 17 26 30 33 39 je ein Arbeitspointer verweist auf Vaterknoten 33 und auf Löschknoten 26 left-pointer im Vaterknoten 33 wird auf den Nachfolgerteilbaum (Knoten 30) des Löschknotens umgesetzt Löschknoten 26 wird entsorgt, nachdem Wert 26 entnommen wurde 46 23

Löschen im binären Suchbaum 20 14 33 8 17 26 39 3 11 30 Fall 3: Löschen eines Knotens mit zwei Nachfolgeteilbäumen, z.b. Wurzelknoten 20 47 Löschen im binären Suchbaum Fall 3, Lösung a: einer der beiden Teilbäume ersetzt den Löschknoten der zweite Teilbaum wird in geeigneter Weise unter dem ersten Teilbaum gehängt 48 24

Löschen im binären Suchbaum Fall 3, Lösung a: Teilbaum mit Wurzel 14 ersetzt Löschknoten 20 Teilbaum mit Wurzel 33 wird als rechter Nachfolger von Knoten 17 eingehängt Ergebnis: 49 Löschen im binären Suchbaum Wie findet man den richtigen Punkt zum Einhängen des Teilbaums mit Wurzel 33? 50 25

Löschen im binären Suchbaum Fall 3, Nachteil von Lösung a: die Höhe des Baums wird größer im ungünstigsten Fall kann sich die Höhe verdoppeln 51 Löschen im binären Suchbaum 20 14 33 8 17 26 39 3 11 30 Fall 3: Löschen eines Knotens mit zwei Nachfolgeteilbäumen, z.b. Wurzelknoten 20 52 26

Löschen im binären Suchbaum Fall 3, Lösung b: Der zu löschende Knoten wird durch den Knoten mit dem in der Sortierreihenfolge nächstgrößeren oder nächstkleineren Wert ersetzt Achtung, der nächstgrößere oder nächstkleinere Knoten kann maximal einen Nachfolger haben, deshalb hierbei vorgehen wie in Fall 2, Löschen eines Knotens mit einem Nachfolger 53 Löschen im binären Suchbaum Ergebnis Fall 3, Lösung b: Knoten 20 wurde durch nächstgrößeren (Knoten 26) ersetzt Knoten 26 wurde an der ursprünglichen Stelle gelöscht 26 14 33 17 8 30 39 3 11 54 27

Löschen im binären Suchbaum Fall 3, Vorteil Lösung b: die Höhe des Baums hat sich nicht vergrößert 26 14 33 17 8 30 39 3 11 55 Löschen im binären Suchbaum Ablauf Fall 3, Lösung b: je ein Arbeitspointer verweist auf den Löschknoten (20) und auf dessen Vorgänger (hier nicht existent, deshalb root-pointer verwenden) nächstgrößerer Knoten (26) wird lokalisiert und Arbeitspointer auf ihn und seinen Vorgänger (33) gesetzt Knoten 26 wird herausgeschnitten und durch seinen Nachfolgerknoten 30 ersetzt 56 28

Löschen im binären Suchbaum left-pointer im Vaterknoten 33 wird auf Knoten 30 umgebogen left-pointer von 26 wird auf 14 gesetzt right-pointer von 26 wird auf 33 gesetzt Vorgängerknoten des Löschknotens (hier der root-pointer) wird auf die neue Wurzel 26 umgesetzt Wert 20 der alten Wurzel wird entnommen und der Knoten gelöscht fertig 57 Löschen im binären Suchbaum Fall 3, Fazit von Lösung b: deutlich aufwendiger zu programmieren als Lösung a aber auch deutliche Vorteile beim dadurch entstehenden Baum, insbesondere bei der Höhe deshalb wird Lösung b in der Regel bevorzugt 58 29