Programmierkurs Python

Ähnliche Dokumente
Algorithmen und Datenstrukturen 2

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

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Breiten- und Tiefensuche in Graphen

8 Diskrete Optimierung

Algorithmen und Datenstrukturen (WS 2007/08) 63

Graphen: Datenstrukturen und Algorithmen

Kürzeste Wege in Graphen. Maurice Duvigneau Otto-von-Guericke Universität Fakultät für Informatik

Graphen: Einführung. Vorlesung Mathematische Strukturen. Sommersemester 2011

Gliederung. Definition Wichtige Aussagen und Sätze Algorithmen zum Finden von Starken Zusammenhangskomponenten

Algorithmen und Datenstrukturen 2

Das Briefträgerproblem

Kapitel 6: Graphalgorithmen Gliederung

Graphenalgorithmen und lineare Algebra Hand in Hand Vorlesung für den Bereich Diplom/Master Informatik

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

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

Konzepte der Informatik

Praktikum Planare Graphen

Graphentheorie. Organisatorisches. Organisatorisches. Organisatorisches. Rainer Schrader. 23. Oktober 2007

1 topologisches Sortieren

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

Aufgabe 3: Übersetzen Sie die folgenden natürlich-sprachlichen Aussagen in die Sprache der

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

Datenstrukturen & Algorithmen

Modelle und Statistiken

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Guten Morgen und Willkommen zur Saalübung!

Graphen. Seminar Bioinformatik. Franziska Schwabe. 3. Juli Fakultät Statistik TU Dortmund 1 / 45

16. All Pairs Shortest Path (ASPS)

Schwierige Probleme in der Informatik Informationen für die Lehrperson

Algorithmische Methoden der Netzwerkanalyse

Programmierkurs Python I

Kapitel MK:IV. IV. Modellieren mit Constraints

Anmerkungen zur Übergangsprüfung

Überblick. Einführung Graphentheorie

Fully dynamic algorithms for the single source shortest path problem.

Algorithmen und Datenstrukturen Suchbaum

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

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

Informatik I WS 07/08 Tutorium 24

Grundwissen Informatik Q11/12 Fragenkatalog

Seminar Werkzeuggestütze. tze Softwareprüfung. fung. Slicing. Sebastian Meyer

Vorlesung 3 MINIMALE SPANNBÄUME

Kombinatorische Optimierung

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

1. Übung zu "Numerik partieller Differentialgleichungen"

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

WS 2009/10. Diskrete Strukturen

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

Property Testing in Graphen mit beschränktem Maximalgrad

Methoden der Netzwerkanalyse

Agenda. (1) Einleitung (2) neo4j. (3) Beispiel + Demo

Graphentheorie Mathe-Club Klasse 5/6

Beispielblatt VU Algorithmen und Datenstrukturen 1 VU 6.0

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

2 Lösungen "Peptide de novo Sequencing"

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

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Einführung in Python. Gliederung

Cliquen in Graphen Mathematische Grundlagen und der Bron-Kerbosch-Algorithmus. Karin Haenelt

EndTermTest PROGALGO WS1516 A

Bäume und Wälder. Bäume und Wälder 1 / 37

Roberto lerusalimschy. Programmieren mit Lua

Verwendung der Visage Java-API

Aufgabe 1: Eigenschaften von Algorithmen I

4 Greedy-Algorithmen (gierige Algorithmen)

Algorithmik mit Python

w a is die Anzahl der Vorkommen von a in w Beispiel: abba a = 2

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

Algorithmentheorie Maximale Flüsse

Informatik I Einfache Datenstrukturen

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

Struktur am Beispiel einer Liste

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Formelsammlung Mathematische Grundlagen für die Informatik

Parallele Breitensuche in X10

Python-Workshop. Python für C/C++ Programmierer. Carl Friedrich Bolz. Carl Friedrich Bolz

Beispiele für Relationen

27. August 2013 Einleitung. Algorithmen und Datenstrukturen

Datenbankanwendung. Prof. Dr.-Ing. Sebastian Michel TU Kaiserslautern. Wintersemester 2014/15.

Codes und Informationsgehalt

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Daten, Daten, Daten. Und immer an den Zugriff denken.

Efficient Parallel Algorithms for Edge Coloring Problems H. Karloff, D. Shmoys Journal of Algorithms 8, (1987)

Objektorientierte Programmierung

368 4 Algorithmen und Datenstrukturen

Periodische Fahrpläne und Kreise in Graphen

28. April Python ist eine Interpreter Sprache. einfach durch eigene C Module erweiterbar. Daten werden dynamisch getypt

Schulinternes Curriculum im Fach Informatik

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

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

Seminararbeit für das SE Reine Mathematik- Graphentheorie

Programmierkurs Python I

Kapiteltests zum Leitprogramm Binäre Suchbäume

Binäre Bäume Darstellung und Traversierung

Informatik II Einfache Datenstrukturen

Suchen in Listen und Hashtabellen

Transkript:

Programmierkurs Python Stefan Thater Michaela Regneri 2010-0-29 Heute Ein wenig Graph-Theorie (in aller Kürze) Datenstrukturen für Graphen Tiefen- und Breitensuche Nächste Woche: mehr Algorithmen 2

Was ist ein Graph? Graphen kann man sich als Menge von Knoten ( Ecken, nodes, vertices) vorstellen, die über Kanten (edges) verbunden sind. Varianten: gerichtete Graphen (Kanten haben eine Richtung) gewichtete Graphen (Kanten haben Gewichte) [ ] 1 2 5 6 1 2 5 6 1 2 1 2 27 11 0 9 5 6 Ungerichteter (undirected) Graph Ein ungerichteter Graph ist ein Paar (V, E) mit V eine Menge von Knoten E [V] 2 eine Menge von Kanten (edges) Zum Beispiel: V = { 1, 2,,, 5, 6 } 1 2 E = {" {1, 2}, {2, }, {2, 5}, " " {2, 6}, {, 6} } 5 6

Gerichteter (directed) Graph Ein gerichteter Graph ist ein Paar (V, E) mit V eine Menge von Knoten E V x V eine Menge von Kanten Zum Beispiel: V = { 1, 2,,, 5, 6 } 1 2 E = {" (1, 2), (2, ), (5, 2), " " (2, 6), (, 6), (, 5), " " (5, ) } 5 6 5 Inzident, adjazent Ein Knoten v ist mit einer Kante e inzident wenn v von e berührt wird (also Start- oder Endknoten von e ist). Zwei Knoten sind adjazent (benachbart), wenn sie über eine Kante verbunden sind. Der Grad eines Knotens = Anzahl inzidenter Kanten In gerichteten Graphen: Eingangsgrad = Anzahl eingehender Kanten Ausgangsgrad = Anzahl ausgehender Kanten 6

Pfade und Zyklen (pathes and cycles) Ein Pfad ist eine Knotenfolge v 1,, vn, so dass gilt es gibt Kante (vi, vi+1), für alle 1 i < n Ein Pfad ist ein Zyklus, falls Start- und Endknoten identisch sind. Ein Pfad ist einfach, falls alle Knoten auf dem Pfad parweise verschieden sind. Ein Graph heißt zyklisch, wenn er einen Zyklus enthält, ansonsten azyklisch. 7 Teilgraphen (subgraphs) Ist G = (V, E) ein Graph, dann ist G = (V, E ) ein Teilgraph von G falls V V und E E. Der Teilgraph G heißt induziert (aufgespannt), wenn er alle Kanten {v1, v2} E mit v1, v2 V enthält. Notation: G = G[V ] 8

Komponenten Ein Graph ist zusammenhängend (connected), wenn er für je zwei seiner Knoten einen Pfad enthält, der die Knoten verbindet. Ein maximal zusammenhängender Teilgraph eines Graphen G ist eine Komponente von G. 9 Graphen als Datenstruktur Graphen kann man auf verschiedene Weise als Datenstruktur repräsentieren. Adjazenzmatrix (Nachbarschaftsmatrix) Adjazenzliste (Nachbarschaftsliste) [ ] 10

Adjazenzmatrix V x V Matrix A A[i, j] = 1 wenn (i, j) E A[i, j] = 0 wenn (i, j) E 1 2 1 2 1 2 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 11 Adjazenzmatrix V x V Matrix A A[i, j] = 1 wenn {i, j} E A[i, j] = 0 wenn {i, j} E 1 2 1 2 1 2 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 12

Adjazenzmatrix V x V Matrix A A[i, j] = 1 wenn (i, j) E A[i, j] = 0 wenn (i, j) E O( V 2 ) Speicherplatz Gut geeignet für dichte Graphen ( E V 2 ) O(1) Zeit, um zu prüfen, ob (i, j) E 1... in Python class AdjacencyMatrix: def init (self, size): self.matrix = [ [ 0 ] * size for i in range(size) ] def add_edge(self, i, j): self.matrix[i][j] = 1 def has_edge(self, i, j): return self.matrix[i][j] def edges(self): for (i, adj) in enumerate(self.matrix): for (j, b) in enumerate(adj): if b: yield (i, j) [...] 1

Alternativ class AdjacencyMatrix: def init (self, size): self.matrix = [ 0 ] * (size * size) self.size = size def add_edge(self, i, j): self.matrix[(i * self.size) + j] = 1 def has_edge(self, i, j): return self.matrix[(i * self.size) + j] def edges(self): for i in range(self.size): for j in range(self.size): if self.has_edge(i, j): yield (i, j) [...] 15 Adjazenzlisten Ein Array A von V Listen A[u] verweist auf alle adjazenten Knoten Python: Array Liste fester Länge Liste Liste variabler Länge (hier: verkettete Paare) 1 2 1 2 2 16

Adjazenzlisten Ein Array A von V Listen A[u] verweist auf alle adjazenten Knoten Python: Array Liste fester Länge Liste Liste variabler Länge (hier: verkettete Paare) 1 2 1 2 2 1 1 1 17 Adjazenzlisten Ein Array A von V Listen A[u] verweist auf alle adjazenten Knoten O( V + E ) Speicherplatz gut geeignet für dünne Graphen ( E V ) O( V ) Zeit, um zu prüfen, ob (i, j) E 18

... in Python class AdjacencyList: def init (self, size): self.node_list = [ [] for i in range(size) ] def add_edge(self, i, j): if not self.has_edge(i, j): self.node_list[i].append(j) def has_edge(self, i, j): return j in self.node_list[i] def edges(self): for (i, adj) in enumerate(self.node_list): for j in adj: yield (i, j) [...] 19 Graphen in Python Adjazenzlisten bzw. Matrizen sind nicht unbedingt die natürlichsten Datenstrukturen, um Graphen in Python zu implementieren. In Python bieten sich zwei Varianten an: Graphen als Wörterbücher mit Mengen (oder Listen) Graphen ganz objektorientiert (in Klassen aufgeteilt) Variante 1: ein Dictionary, das Knoten jeweils auf die Menge der adjazenten Knoten abbildet. etwas langsamer, aber viel flexibler als die Matrizen alle Datentypen, die als Schlüssel eines dict verwendet werden dürfen, können für Knoten stehen. 20

Zum Beispiel so class Graph: def init (self): self.nodes = dict() def add_edge(self, i, j): try: self.nodes[i].add(j) except KeyError: self.nodes[i] = set([j]) def has_edge(self, i, j): return j in self.nodes.get(i, []) def edges(self):! for (i, adj) in self.nodes.items():!! for j in adj:!!! yield (i, j) 21 Suche in Graphen Besuche alle Knoten eines Graphen: Breitensuche zuerst alle Geschwister besuchen Tiefensuche erst alle Kinder-Knoten, dann die Geschwister 22

Tiefensuche noch nicht besucht besucht fertig 2 Tiefensuche def nop(node): pass class : def dfs(self, node, dosomething = nop): visited = set() stack = [node] while stack: node = stack.pop() if node not in visited: visited.add(node) dosomething(node) stack.extend(self.children(node)) [...] 2

Tiefensuche (Iterator) class Graph(object): for n in g.dfs(start): def dfs(self, node): dosomething(n) visited = set() stack = [node] while stack: node = stack.pop() if node not in visited: visited.add(node) yield node stack.extend(self.children(node)) [...] 25 Tiefensuche Anwendungen Erreichbarkeit, transitiver Abschluss Untersuchung des Graphen auf Zyklen Zusammenhangskomponenten Topologische Sortierung [ ] 26

Breitensuche Wie Tiefensuche, nur mit einer Warteschlange statt eines Stapels queue = [] queue.append(elt)"# am Ende anhängen queue.remove(elt)"# von Anfang entfernen 27