Programmierkurs Python II

Ä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

Algorithmen und Datenstrukturen 2

Das Briefträgerproblem

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

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

Datenstrukturen & Algorithmen

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

Modelle und Statistiken

Datenstrukturen. Mariano Zelke. Sommersemester 2012

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

Guten Morgen und Willkommen zur Saalübung!

16. All Pairs Shortest Path (ASPS)

Schwierige Probleme in der Informatik Informationen für die Lehrperson

Algorithmen und Datenstrukturen Suchbaum

Algorithmische Methoden der Netzwerkanalyse

Kombinatorische Optimierung

Kapitel MK:IV. IV. Modellieren mit Constraints

Anmerkungen zur Übergangsprüfung

Überblick. Einführung Graphentheorie

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

Fully dynamic algorithms for the single source shortest path problem.

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

Property Testing in Graphen mit beschränktem Maximalgrad

Methoden der Netzwerkanalyse

Graphentheorie Mathe-Club Klasse 5/6

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

Vorlesung 3 MINIMALE SPANNBÄUME

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

1. Übung zu "Numerik partieller Differentialgleichungen"

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

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

Grundwissen Informatik Q11/12 Fragenkatalog

Programmierkurs Python I

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

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"

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

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

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

Aufgabe 1: Eigenschaften von Algorithmen I

4 Greedy-Algorithmen (gierige Algorithmen)

Verwendung der Visage Java-API

Algorithmik mit Python

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

Algorithmentheorie Maximale Flüsse

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

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

Programmierkurs Python I

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Parallele Breitensuche in X10

Untersuchung und Bewertung von Tearing-Algorithmen. zur Erlangung des akademischen Grades Diplomingenieur (Dipl. -Ing.)

Beispiele für Relationen

27. August 2013 Einleitung. Algorithmen und Datenstrukturen

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

Literatur. Dominating Set (DS) Dominating Sets in Sensornetzen. Problem Minimum Dominating Set (MDS)

Codes und Informationsgehalt

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

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

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

368 4 Algorithmen und Datenstrukturen

Periodische Fahrpläne und Kreise in Graphen

Algorithmische Methoden zur Netzwerkanalyse

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

Kapiteltests zum Leitprogramm Binäre Suchbäume

Binäre Bäume Darstellung und Traversierung

Informatik II Einfache Datenstrukturen

Die Suche nach Genen in Bakteriengenomen. BWInf-Workshop März Prof. Dr. Sven Rahmann AG Bioinformatik Informatik XI, TU Dortmund

Suchen in Listen und Hashtabellen

Transkript:

Programmierkurs Python II Stefan Thater & Michaela Regneri FR.7 Allgemeine Linguistik (Computerlinguistik) Universität des Saarlandes Sommersemester 011 Heute Ein wenig Graph-Theorie (in aller Kürze) Datenstrukturen für Graphen Tiefen- und Breitensuche Nächste Woche: mehr Algorithmen

Was ist ein Graph? Graphen kann man sich als Mengen 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 5 6 1 5 6 1 1 7 11 0 9 5 6 Ungerichteter (undirected) Graph Ein ungerichteter Graph ist ein Paar (V, E) mit V eine Menge von Knoten E [V] eine Menge von Kanten (edges) Zum Beispiel: V = { 1,,,, 5, 6 } E = {" {1, }, {, }, {, 5}, " " {, 6}, {, 6} } 1 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,,,, 5, 6 } E = {" (1, ), (, ), (5, ), " " (, 6), (, 6), (, 5), " " (5, ) } 1 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 v1,, 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 paarweise 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, v} E mit v1, v 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 1 1 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 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1

Adjazenzmatrix V x V Matrix A - A[i, j] = 1 wenn (i, j) E - A[i, j] = 0 wenn (i, j) E O( V ) Speicherplatz: gut geeignet für dichte Graphen ( E V ) 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 1 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 1 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. 0

Zum Beispiel so class Graph: def init (self): self.nodes = dict() def add_edge(self, i, j): self.nodes[i] = self.nodes.get(i,set()) 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) 1 Suche in Graphen Besuche alle Knoten eines Graphen: Breitensuche zuerst alle Geschwister besuchen Tiefensuche erst alle Kinder-Knoten, dann die Geschwister

Tiefensuche noch nicht besucht besucht fertig Tiefensuche def nop(node): pass 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)) [...]

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)) [...] 5 Tiefensuche Anwendungen Erreichbarkeit, transitiver Abschluss Untersuchung des Graphen auf Zyklen Zusammenhangskomponenten Topologische Sortierung [ ] 6

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