Teil XI. Datenstrukturen: Bäume, Stacks und Queues. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/

Ähnliche Dokumente
Teil XI. Datenstrukturen: Bäume, Stacks und Queues. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2017/

Teil XII. Datenstrukturen: Bäume, Stacks und Queues. Scientific Computing in Computer Science, Technische Universität München

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 13

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

Lernmodul 7 Algorithmus von Dijkstra

Algorithmen und Datenstrukturen

ContainerDatenstrukturen. Große Übung 4

Informatik II Prüfungsvorbereitungskurs

Übung Algorithmen und Datenstrukturen

Graphenalgorithmen I

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

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

Algorithmen & Komplexität

Programmierkurs Python

Programmierkurs Python II

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Graphenalgorithmen I. Geschickt Programmieren für den ICPC- Wettbewerb. Felix Weissenberger

Graphdurchmusterung, Breiten- und Tiefensuche

Suchstrukturen. Übersicht. 8 Suchstrukturen. Allgemeines. H. Täubig (TUM) GAD SS

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

Informatik II Prüfungsvorbereitungskurs

Algorithmen & Komplexität

Logische Datenstrukturen

Informatik II, SS 2014

12. AuD Tafelübung T-C3

Datenstrukturen Teil 3. Traversierung und AVL- Bäume. Traversierung. Traversierung. Traversierung

EINI LogWing/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 17/18

Informatik II, SS 2016

Übung Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen 2. Klausur SS 2001

Datenstrukturen. einfach verkettete Liste

Algorithmen und Datenstrukturen 2. Dynamische Datenstrukturen

Übung Algorithmen und Datenstrukturen

9. Natürliche Suchbäume

12. Graphen. Notation, Repräsentation, Traversieren (DFS, BFS), Topologisches Sortieren, Ottman/Widmayer, Kap ,Cormen et al, Kap.

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 1 V9/11

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Anwendungsbeispiel MinHeap

Ferienkurs zur algorithmischen diskreten Mathematik Kapitel 1: Grundlagen der algorithmischen Graphentheorie

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Wie wird ein Graph dargestellt?

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1-5. Seminar -

Algorithmen und Datenstrukturen

Komplexität eines Algorithmus, Grössenordnung, Landau-Symbole, Beispiel einer Komplexitätsberechnung (Mergesort) 7. KOMPLEXITÄT

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Datenstrukturen und Algorithmen (SS 2013)

18. Natürliche Suchbäume

Algorithmen und Datenstrukturen. Bäume. M. Herpers, Y. Jung, P. Klingebiel

Informatik II Vorlesung am D-BAUG der ETH Zürich

Datenstrukturen und Algorithmen SS07

Übung Datenstrukturen. Bäume

Breitensuche BFS (Breadth First Search)

1 AVL-Bäume. 1.1 Aufgabentyp. 1.2 Überblick. 1.3 Grundidee

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

Algorithmen und Datenstrukturen 2-1. Seminar -

Algorithmen und Datenstrukturen

Informatik B Sommersemester Musterlösung zur Klausur am

Abstrakte Datentypen und deren Implementierung in Python

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

EINI LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Voronoi-Diagramme INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

Verkettete Datenstrukturen: Bäume

Vorlesung Datenstrukturen

Nachtrag: Vergleich der Implementierungen von Stack

Definition Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u V und v V.

Übung zur Vorlesung Algorithmische Geometrie

Einfache binäre Suchbäume können entarten, so dass sich die Tiefen ihrer Blattknoten stark unterscheiden

Routing A lgorithmen Algorithmen Begriffe, Definitionen Wegewahl Verkehrslenkung

10. Übungsblatt zu Algorithmen I im SS 2010

Informatik I 2. Kapitel. Elementare Datenstrukturen. Datenstrukturen. Datenstrukturen. Rainer Schrader. 28. Mai 2008

Graphalgorithmen II. Sebastian Ehrenfels Sebastian Ehrenfels Graphalgorithmen II / 44

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Algorithmen 1 Tutorium

Digraphen, DAGs und Wurzelbäume

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Graphen. Definitionen

12. Graphen. Königsberg Zyklen. [Multi]Graph

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Vorlesung Datenstrukturen

Relationen und DAGs, starker Zusammenhang

4.1 Bäume, Datenstrukturen und Algorithmen. Zunächst führen wir Graphen ein. Die einfachste Vorstellung ist, dass ein Graph gegeben ist als

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Sortierverfahren. Laufzeitkomplexität. exponentiell

ADS 1: Algorithmen und Datenstrukturen

Prüfung Algorithmen und Datenstrukturen I

Übung Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

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

Transkript:

Teil XI Datenstrukturen: Bäume, Stacks und Queues T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 254

Stacks (Kellerspeicher/Stapel) Funktioniert wie ein natürlicher Stapel (z.b. Papierstapel auf dem Schreibtisch) Elemente werden immer oben auf den Stapel gelegt (PUSH) Es kann immer nur das oberste Element entfernt werden (POP) Funktionsweise: LIFO (Last In, First Out) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 255

Stacks (Kellerspeicher/Stapel) Funktioniert wie ein natürlicher Stapel (z.b. Papierstapel auf dem Schreibtisch) Elemente werden immer oben auf den Stapel gelegt (PUSH) Es kann immer nur das oberste Element entfernt werden (POP) push pop Stackpointer Funktionsweise: LIFO (Last In, First Out) Stacks in Python Es gibt keine eigene Stack-Datenstruktur in Python Listen können aber als (effiziente) Stacks verwendet werden pop push PUSH: list.append(x) POP: x = list.pop() T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 255

Stack-Beispiel: Türme von Hanoi A B Hilfe T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 256

Stack-Beispiel: Türme von Hanoi A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) printhanoi () hanoi (n -1, hilfe, b, a) rekursiver Algorithmus: n=# zu versch. Scheiben Scheiben: a=woher, b=wohin, hilfe=zwischenziel T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 256

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 257

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 258

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 259

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H A -> B T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 260

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H A -> B hanoi(2,h,b,a) hanoi(1,h,a,b) H -> A T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 261

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H A -> B hanoi(2,h,b,a) hanoi(1,h,a,b) H -> A H -> B T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 262

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H A -> B hanoi(2,h,b,a) hanoi(1,h,a,b) H -> A H -> B hanoi(1,a,b,h) A -> B T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 263

A B Hilfe def hanoi (n, a, b, hilfe ): if(n > 0): hanoi (n -1, a, hilfe, b) b. append (a. pop ()) hanoi (n -1, hilfe, b, a) Optimale Zugfolge: 2 n 1 Züge 34 Jahre bei n=30 und 1 Scheibe/s 585 Mrd. Jahre bei n=64 hanoi(3,a,b,h) hanoi(2,a,h,b) hanoi(1,a,b,h) A -> B A -> H hanoi(1,b,h,a) B -> H A -> B hanoi(2,h,b,a) hanoi(1,h,a,b) H -> A H -> B hanoi(1,a,b,h) A -> B T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 264

Queues/Warteschlangen Funktioniert wie eine natürlicher Warteschlange (z.b. Supermarkt, Postamt, Druckaufträge) Elemente werden immer ans Ende der Queue angefügt (PUSH) Es wird immer nur vom Anfang der Queue entfernt (POP) Funktionsweise: FIFO (First In, First Out) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 265

Queues/Warteschlangen Funktioniert wie eine natürlicher Warteschlange (z.b. Supermarkt, Postamt, Druckaufträge) Elemente werden immer ans Ende der Queue angefügt (PUSH) Es wird immer nur vom Anfang der Queue entfernt (POP) Funktionsweise: FIFO (First In, First Out) Queues in Python Listen können nicht als Queues verwendet werden, da der Aufwand für das Entfernen des ersten Elements O(N) ist Das Module Queue stellt Queues zur Verfügung >>> from Queue import Queue >>> q = Queue () >>> q. put (1); q. put (2); q. put (3) >>> q. get () 1 T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 265

Beispiel: Bürokrat Hands-On: Programmieren Sie einen Bürostuhl-Akrobaten Buerokrat! Die Klasse Buerokrat besitzt eine Methode abgelehnt, welche als Argument lediglich einen Stapel an Formularen (strings) erhält. Jedes Formular wird bearbeitet : Das Formular wird vom Stapel genommen. Das Formular wird abgelehnt: Geben Sie hierzu am Bildschirm Formular NAME: Abgelehnt aus. NAME steht für das entsprechende Formular. Das Formular wird auf einen neuen Stapel gepackt. Der Stapel bearbeiteter Formulare soll zurückgegeben werden. Testen Sie Ihr Programm mit dem Stapel: ["Passierschein A-39", "Rundschreiben B-65", "Passierschein A-38"] T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 266

Beispiel: Bürokrat class Buerokrat : def abgelehnt ( self, formulare ): fertig = [] while len ( formulare ) >0: f = formulare. pop () print " Formular " + f + ": abgelehnt " fertig. append (f) return fertig if name ==" main ": b = Buerokrat () formulare = [" Passierschein A -39 ", " Rundschreiben B -65 ", \ " Passierschein A -38 "] print " Arbeitsanfang :" print formulare fertig = b. abgelehnt ( formulare ) print " Arbeitsende :" print fertig T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 267

Graphen Wir ersparen uns eine formale Definition! Ein Graph besteht aus einer Menge Knoten V Zwischen den Knoten gibt es Kanten E V V T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 268

Graphen Wir ersparen uns eine formale Definition! Ein Graph besteht aus einer Menge Knoten V Zwischen den Knoten gibt es Kanten E V V Einsatzgebiete Verkehrs- und sonstige Netze (kürzeste Wege) Ablaufpläne Partitionierungsalgorithmen Viele algorithmische Probleme lassen sich auf Graphen zurückführen... T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 268

Graphen Wir ersparen uns eine formale Definition! Ein Graph besteht aus einer Menge Knoten V Zwischen den Knoten gibt es Kanten E V V Einsatzgebiete Verkehrs- und sonstige Netze (kürzeste Wege) Ablaufpläne Partitionierungsalgorithmen Viele algorithmische Probleme lassen sich auf Graphen zurückführen... Was prinzipiell möglich ist Kanten können gerichtet oder ungerichtet sein Kanten und Knoten können Gewichte haben zwischen zwei Knoten können beliebig viele Kanten sein Ein Graph kann zyklisch, planar oder zusammenhängend (und jeweils auch das Gegenteil sein) u.v.m. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 268

Beispiel: Routensuche Abbildung: Dijkstra bzw. A*; Quelle: Bungartz, Zimmer, Buchholz, Pflüger: Modellbildung und Simulation - Eine anwendungsorientierte Einführung T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 269

Datenstrukturen für Graphen Adjazenzmatrix Matrix A mit Dimension V V A[i, j] = 1 wenn (i, j) E A[i, j] = 0 sonst Gut geeignet für dichte Graphen T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 270

Datenstrukturen für Graphen Adjazenzmatrix Matrix A mit Dimension V V A[i, j] = 1 wenn (i, j) E A[i, j] = 0 sonst Gut geeignet für dichte Graphen Adjazenzliste Liste A mit V Listen n-te Liste aus A enthält alle Knoten, die über eine Kante mit Knoten n verbunden sind Gut geeignet für dünne Graphen In Python alternativ als dictionary realisierbar T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 270

Datenstrukturen für Graphen Adjazenzmatrix Matrix A mit Dimension V V A[i, j] = 1 wenn (i, j) E A[i, j] = 0 sonst Gut geeignet für dichte Graphen Adjazenzliste Liste A mit V Listen n-te Liste aus A enthält alle Knoten, die über eine Kante mit Knoten n verbunden sind Gut geeignet für dünne Graphen In Python alternativ als dictionary realisierbar Objektorientiert Knoten sind Objekte Jeder Knoten enthält eine Liste mit benachbarten Knoten T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 270

(gerichtete) Bäume Gerichteter, zusammenhängender, planarer und azyklischer Graph Hat einen Wurzelknoten (nur ausgehended Kanten) Wenn eine Kante von A zu B gerichtet ist, nennt sich A Vaterknoten von B bzw. B Kindknoten von A Knoten ohne Kinder heißen Blätter Knoten können so in einer Hierarchie angeordnet werden, dass jeder Knoten (außer dem Wurzelknoten) genau eine Eingangskante hat, die von einem Knoten in der darüberliegenden Hierarchieebene liegt. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 271

(gerichtete) Bäume Gerichteter, zusammenhängender, planarer und azyklischer Graph Hat einen Wurzelknoten (nur ausgehended Kanten) Wenn eine Kante von A zu B gerichtet ist, nennt sich A Vaterknoten von B bzw. B Kindknoten von A Knoten ohne Kinder heißen Blätter Knoten können so in einer Hierarchie angeordnet werden, dass jeder Knoten (außer dem Wurzelknoten) genau eine Eingangskante hat, die von einem Knoten in der darüberliegenden Hierarchieebene liegt. Einsatzgebiet von Bäumen Speicherung (sortierter) Daten (logarithmischer Zugriff) Entscheidungs- und Suchbäume (hierarchische) Gebietszerlegungen Viele algorithmische Probleme lassen sich auf Bäume zurückführen T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 271

Bäume: Beispiel Breiten- und Tiefensuche Breitensuche 1 2 3 4 5 6 7 8 9 Tiefensuche 1 7 2 9 8 4 3 6 5 T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 272

Tiefensuche in (unsortierten) Bäumen/Graphen Erster Kind-/Nachbarknoten, dann dessen Kind/Nachbar,... Worst-Case Laufzeit O( V + E ) Es ist möglich, dass der Knoten nicht gefunden wird (Bei unendlichen Graphen oder wenn Zyklen nicht überprüft werden) Iterativer Algorithmus mit Stapel def tiefensuche ( startknoten, zielknoten ): startknoten. besucht = True stapel = [ startknoten ] while len ( stapel ) >0: knoten = stapel. pop () if knoten == zielknoten : return knoten for nachbar in knoten. nachbarn : if nachbar. besucht == False : nachbar. besucht = True stapel. append ( nachbar ) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 273

Breitensuche in (unsortierten) Bäumen/Graphen Erst Knoten mit Entfernung 1 zum Startknoten, dann 2,... Bei Bäumen: ebenenweiser Durchlauf Worst-Case Laufzeit O( V + E ) Wenn der gesuchte Knoten existiert, wird er auch gefunden Iterativer Algorithmus mit Warteschlange def breitensuche ( startknoten, zielknoten ): startknoten. besucht = True warteschlange = deque ([ startknoten ]) while len ( warteschlange ) >0: knoten = warteschlange. popleft () if knoten == zielknoten : return knoten for nachbar in knoten. nachbarn : if nachbar. besucht == False : nachbar. besucht = True warteschlange. append ( nachbar ) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 274

Suchbäume Bisherige Verfahren: nicht effizient (O( V + E )) Beide Verfahren: uninformiert, d.h. alles wird blind abgesucht Heuristiken: können Suche beschleunigen (z.b. A*-Algorithmus bei Suche nach kürzesten Wegen) Falls Elemente des Baumes Totalordnung unterliegen: Suchbäume noch viel effizienter Suchbäume unterstützen drei Operationen: Einfügen eines Elements (je nach Baum evtl. O(1)) Löschen eines Elements (je nach Baum evtl. O(1)) Suchen eines Elements (O(Baumhoehe)) Unbalancierte Suchbäume: Baumhöhe max. N Balancierte Suchbäume (z.b. AVL-Baum): Baumhöhe = log(n) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 275

Binärer Suchbaum Erstes hinzugefügtes Element: bildet Wurzel Neue Elemente: - werden als Blätter in Baum aufgenommen - werden von Wurzel gemäß Sortierkriterium bis zu entsprechender Stelle durchgereicht Eigenschaften: - Baumstruktur: wird beim Hinzufügen nicht verändert - Suche: analog zum Einfügen (Vergleich des gesuchten Elements mit dem aktuellen Knoten, dann evtl. Abstieg in linken/rechten Teil,...) - Löschen: evtl. etwas komplexer (Teilbäume werden umgehängt) optimaler Fall 10 5 14 2 8 12 17 3 13 2 Worst Case 3 5 8 10 12 13 14 17 T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 276

AVL-Baum Binärer Suchbaum, bei dem für jeden Knoten k gilt, dass die Höhe von linkem (H l (k) und rechtem (H r (k)) Teilbaum sich um maximal 1 unterscheiden. Höhe im schlimmsten Fall ca. 1.44 log 2 (N + 2), d.h. Suchen eines Elements immer in O(log(N)); Für jeden Knoten gibt es ein Balance-Kriterium bal(k) = H r (k) H l (k), das immer { 1, 0, 1} sein muss. normaler Fall Worst Case 10 12 2 1 3 0 5 14 0 7 8 12 17 0 9 1 11 0 0 0 1-1 -1 15 21 1 16 0 2 3 5 8 17-1 7 10 11-1 -1-1 14-1 0 0 0 15 21 T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 277-1 -1 0

Einfügen eines Elements Vor dem Einfügen sind alle Balancewerte { 1, 0, 1}. Zunächst wir der Einfügepunkt gesucht. Einfügen bei Knoten mit einem Kind Der bisherige Balancewert des Knotens ist { 1, 1}. Der neue Balancewert ist 0. keine Rebalancierung notwendig Einfügen bei Blattknoten Der bisherige Balancewert des Knotens ist 0. Neuer Balancewert ist { 1, 1} (aktueller Teilbaum höher). Information muss rekursiv nach oben weitergegeben werden. Bei jedem Vaterknoten wird der neue Balancewert berechnet. - Bei Balancewert { 1, 1} geht man weiter nach oben. - Bei Balancewert 0 kann der Aufstieg abgebrochen werden. - Bei Balancewert { 2, 2} muss neu balanciert werden. - Nach Balancierung muss nicht weiter nach oben gegangen werden, die übrigen Balancewerte ändern sich nicht. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 278

Balancieren des Baums: Einfachrotation x 2 y 1 (bzw. 0) x 0 (bzw. 1) y 0 (bzw. -1) Rechter Sohn von x ist y Linker Teilbaum von x ist am niedrigsten Linker Teilbaum von y ist nicht höher als rechter Teilbaum von y y wird Wurzel, x linker Sohn, bisheriger linker Teilbaum von y wird rechter Teilbaum von x, Rest bleibt gleich Höhe des neuen Baums gleich wie vor dem Einfügen, Balancierung beendet Analoges Vorgehen im spiegelverkehrten Fall T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 279

Balancieren des Baums: Doppelrotation x 2 z 1/0/-1 y -1 x 2 z 2/1 y 0/1 x -1/0 z 0 y 0/1 Nun ist der linke Teilbaum von y (mit Wurzel z) höher als der rechte. Einfachrotation würde Balance von x von 2 auf -2 ändern Zunächst Rotation, um dafür zu sorgen, dass der rechte Teilbaum der höchste ist; Dann eine weitere Einfachrotation wie auf der vorigen Folie. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 280

Löschen eines Elements Vor dem Löschen sind alle Balancewerte { 1, 0, 1}. Zunächst wir das zu löschende Element k gesucht Knoten k ist ein Blatt Der Knoten wird gelöscht, der Teilbaum um 1 niedriger. Balance des Vaters (rekursiv) anpassen evtl. Rebalancierung Knoten k hat genau einen Sohn s s tritt an Stelle von k, Teilbaum wird um 1 niedriger. rekursiv Balance anpassen Knoten k hat zwei Söhne Bei Balancewert { 1, 1} geht man weiter nach oben. Bei Balancewert 0 kann der Aufstieg abgebrochen werden. Bei Balancewert { 2, 2} muss neu balanciert werden. Beim Löschen kann sich im Gegensatz zum Einfügen die Balance des Vaterknotens eines gerade balancierten Teilbaums auch ändern, es muss weiter nach oben gegangen werden. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 281

Beispiel Bäume: Spacetrees (1) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 282

Beispiel Bäume: Spacetrees (1) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 282

Beispiel Bäume: Spacetrees (1) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 282

Beispiel Bäume: Spacetrees (1) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 282

Beispiel Bäume: Spacetrees (2) Konzept Baumbasierte Hierarchische Raumaufteilung Erlaubt Gebietsverteilung und Partitionierung Raumadaptives Gitter Approximation von Geometrien Simulationsanwendungen T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 283

Spacetrees: Kreisapproximation (1) Beschreibung der Geometrie: Klasse Geometry Methode schneidetvolumen(ll,ur) gibt True zurück, falls die Geometrie die Box mit unterer linker Ecke LL und rechter oberer Ecke UR schneidet Sphere: erbt von Geometry und implementiert 2D-Kugel (Kreis) Exzerpt (geometry.py): class Geometry : def schneidetvolumen (self,ll,ur ): pass class Sphere ( Geometry ): def init (self, center, radius ):... def schneidetvolumen (self,ll,ur ):... T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 284

Spacetrees: Kreisapproximation (2) Adaptives Gitter: Klasse Spacetree Konstruktor-Argumente: Geometry-Objekt Bounding Box (linke,untere Ecke LL und rechte,obere Ecke UR) Max. Anzahl von Baumlevels levels Konstruktor: Baut den Spacetree rekursiv auf: Falls der Baum nur ein Level (levels=0) besitzt: lege nur eine Zelle an Andernfalls: Teste, ob die momentane Zelle die Geometrie schneidet Zelle schneidet Geometrie: lege 4 Spacetrees der Höhe levels-1 an und bette sie in momentane Gitterzelle ein Kein Schnitt: keine weitere Operation T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 285

Spacetrees: spacetree.py (1) class Spacetree : def init (self,ll,ur, geometry, levels ): self. LL = LL # lower left corner of grid cell self. UR = UR # upper right corner of grid cell self. levels = levels # number of grid levels self. kinder =[] # subtrees if ( levels ==0): return... T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 286

Spacetrees: spacetree.py (2)... # berechne Punkte in LL, UR Flaeche # x6 ----x7 ----UR # : : : # x3 ----x4 ----x5 # : : : # LL ----x1 ----x2 x1 = ( 0.5*( LL [0]+ UR [0]), LL [1] ) x3 = ( LL [0], 0.5*( LL [1]+ UR [1]) ) x4 = ( 0.5*( LL [0]+ UR [0]), 0.5*( LL [1]+ UR [1]) ) x5 = ( UR [0], 0.5*( LL [1]+ UR [1]) ) x7 = ( 0.5*( LL [0]+ UR [0]), UR [1] ) # Falls nahe am Rande der Geometrie -> Verfeinern if geometry. schneidetvolumen (LL,UR ): self. kinder = [ Spacetree (LL,x4, geometry, levels -1), \ Spacetree (x1,x5, geometry, levels -1), \ Spacetree (x3,x7, geometry, levels -1), \ Spacetree (x4,ur, geometry, levels -1) ] T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 287

Spacetrees: spacetree.py (3) Methode visualisiere(myvis) Durchlaufe Baum depth-first (vgl. Tiefensuche) Visualisiere jedes Blatt mit Hilfe des Visualisierungsobjekts myvis (vgl. Vis. der Partikelsysteme) def visualisiere ( self, myvis ): # Falls Kinder vorhanden : rekursives Plotten if len ( self. kinder ) >0: for k in self. kinder : k. visualisiere ( myvis ) # Falls Blatt : visualisiere Gitterzelle else : myvis. visualisierezelle ( self.ll, self.ur) T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 288

Spacetrees: Visualisierung T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 289

Wiederholung Hands-On: Sortieren von Zahlen 1. Sortieren Sie die folgenden Zahlen mit Hilfe eines binären Suchbaums: 3 1 7 9 4 5 10 2 8 6 Die Zahlen sollen in einer Liste vorliegen und von links nach rechts eingelesen und einsortiert werden. Stellen Sie den entstehenden Suchbaum graphisch dar. 2. Ist der entstandene Baum ein AVL-Baum? Geben Sie eine kurze Begründung. 3. Wie kann der entstandene Baum mit möglichst wenigen Operationen in einen AVL-Baum überführt werden? T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 290

1. Sortieren Sie die folgenden Zahlen mit Hilfe eines binären Suchbaums: 3 1 7 9 4 5 10 2 8 6 Die Zahlen sollen in einer Liste vorliegen und von links nach rechts eingelesen und einsortiert werden. Stellen Sie den entstehenden Suchbaum graphisch dar. 3 1 7 2 4 9 5 8 10 6 2. Ist der entstandene Baum ein AVL-Baum? Geben Sie eine kurze Begründung. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 291

1. Sortieren Sie die folgenden Zahlen mit Hilfe eines binären Suchbaums: 3 1 7 9 4 5 10 2 8 6 Die Zahlen sollen in einer Liste vorliegen und von links nach rechts eingelesen und einsortiert werden. Stellen Sie den entstehenden Suchbaum graphisch dar. 3 1 7 2 4 9 5 8 10 6 2. Ist der entstandene Baum ein AVL-Baum? Geben Sie eine kurze Begründung. Antwort: Nein. Höhe rechter Subbaum: 4, Höhe linker Subbaum: 2. Max. Differenz (in AVL-Baum: 1) ist somit überschritten. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 291

Wiederholung 3. Wie kann der entstandene Baum mit möglichst wenigen Operationen in einen AVL-Baum übergeführt werden? T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 292

Wiederholung 3. Wie kann der entstandene Baum mit möglichst wenigen Operationen in einen AVL-Baum übergeführt werden? 3 1 7 2 5 9 4 6 8 10 Einfachrotation im Zweig 4-5-6 T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/2017 292