Einführung in die Informatik 2

Ähnliche Dokumente
Einführung in die Informatik 2

Einführung in die Informatik 2

Bäume. Listen und Bäume, Graphen und Bäume, elementare Eigenschaften von Binärbäumen, Implementierung, Generische Baumdurchläufe

Bäume. Listen und Bäume, Graphen und Bäume, elementare Eigenschaften von Binärbäumen, Implementierung, Generische Baumdurchläufe

Datenstrukturen. einfach verkettete Liste

Übung Algorithmen und Datenstrukturen

Technische Universität München. Vorlesungsgrobstruktur: wo stehen wir, wie geht s weiter

Einführung in die Informatik 2

Algorithmen und Datenstrukturen 2-1. Seminar -

Graphen und Bäume. A.1 Graphen

Einführung in die Informatik I

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

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

Verkettete Datenstrukturen: Bäume

Vorlesung Datenstrukturen

Programmiertechnik II

Programmiertechnik II

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Datenstrukturen

4.4.1 Implementierung vollständiger Bäume mit Feldern. Reguläre Struktur: Nachfolger des Knoten i sind die Knoten 2*i und 2*i+1.

Kapitel 5: Graphen und Graphalgorithmen

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

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

Algorithmen und Datenstrukturen 2

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

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

Kapitel 12: Induktive

Programmierkurs Python II

15. Elementare Graphalgorithmen

Keller, Schlangen und Listen. Elementare Datenstrukturen Keller, Schlangen und Listen 1 / 14

Programmierkurs Python II

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Zweizusammenhang und starker Zusammenhang

Grundlagen: Algorithmen und Datenstrukturen

Graphdurchmusterung, Breiten- und Tiefensuche

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

Programmierkurs Python

Algorithmen und Datenstrukturen Suchbaum

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

ADT: Verkettete Listen

Einführung in die Informatik 2

Algorithmen und Datenstrukturen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Bäume, Anwendung und Begriffe

Definition Gerichteter Pfad. gerichteter Pfad, wenn. Ein gerichteter Pfad heißt einfach, falls alle u i paarweise verschieden sind.

Einführung in die Informatik 2

Informatik II, SS 2014

Bäume und Priority Queues

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Diskrete Strukturen Kapitel 4: Graphentheorie (Bäume)

Algorithmen und Datenstrukturen

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

\ E) eines Graphen G = (V, E) besitzt die gleiche Knotenmenge V und hat als Kantenmenge alle Kanten des vollständigen Graphen ohne die Kantenmenge E.

Grundlagen der Programmierung

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen Kapitel 4 Neue Datenstrukturen, besseres (?) Sortieren

Übung 4: Die generische Klasse AvlBaum in Java 1

Algorithmen und Datenstrukturen SS09. Foliensatz 16. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

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

Logische Datenstrukturen

Algorithmische Graphentheorie

Einführung in die Informatik 2

Quicksort ist ein Divide-and-Conquer-Verfahren.

Grundbegriffe der Informatik

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Informatik II Übung, Woche 14

Verkettete Datenstrukturen: Listen

ALP II Dynamische Datenmengen Datenabstraktion

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

3. Die Datenstruktur Graph

13. Binäre Suchbäume

Informatik II Prüfungsvorbereitungskurs

Wie wird ein Graph dargestellt?

Einführung in die Informatik 2

Algorithmen und Datenstrukturen

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

WS 2013/14. Diskrete Strukturen

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

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

Informatik II, SS 2016

Geordnete Binärbäume

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

Einheit 11 - Graphen

368 4 Algorithmen und Datenstrukturen

Relationen und Graphentheorie

Informatik II Übung 2

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

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Wintersemester 2004/ Januar Aus der Vorlesung sind Datenstrukturen zur Repräsentation von Wäldern disjunkter Mengen bekannt.

8 Diskrete Optimierung

13. Bäume: effektives Suchen und Sortieren

3 Dynamische Datenstrukturen

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

Vorlesung Datenstrukturen

Informatik II, SS 2014

Algorithmen und Datenstrukturen

Implementierung eines Baumes (in Python)

Tutorium 23 Grundbegriffe der Informatik (7. Sitzung)

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Transkript:

Einführung in die Informatik 2 Bäume & Graphen Sven Kosub AG Algorithmik/Theorie komplexer Systeme Universität Konstanz http://www.inf.uni-konstanz.de/algo/lehre/ss08/info2 Sommersemester 2008 Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 1 / 29

Grundbegriffe (Wiederholung) Bäume (engl. trees) Erweiterung von Listen: in Liste hat jeder Knoten höchstens einen Nachfolger in Bäumen hat jeder Knoten mehrere Nachfolger aber höchstens einen Vorgänger Nachfolgerknoten heißt Kind (engl. child) Vorgängerknoten heißt Elter (engl. parent) Knoten ohne Kinder heißt Blatt (engl. leaf) Knoten mit Kindern heißt innerer Knoten (engl. internal node/vertex) Baum enthält nur einen Knoten ohne Elter; Knoten heißt Wurzel (engl. root) Tiefe eines Knotens ist die Länge des Pfades bis zur Wurzel Höhe eines Baumes ist die maximale Tiefe eines seiner Knoten Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 2 / 29

Grundbegriffe (Wiederholung) innerer Knoten Kind Elter Wurzel Tiefe 2 Blatt Höhe 4 Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 3 / 29

Grundbegriffe (Wiederholung) Grad eines Knotens in Baum ist die Anzahl seiner Kinder Baum ist Binärbaum (engl. binary tree) def alle Knoten haben Grad 2 Binärbaum heißt voll def alle inneren Knoten haben Grad 2 voller Binärbaum heißt vollständig def alle Blätter haben gleiche Tiefe Fakten: Baum mit n Knoten besitzt n 1 Kanten Ein voller Binärbaum mit n Blättern besitzt n 1 innere Knoten Ein vollständiger Binärbaum der Höhe h besitzt 2 h Blätter Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 4 / 29

Implementierung von Bäumen: Binärbäume package tree; class Node { Object data; Node left; Node right;. // Konstruktor Node(Object obj) { data=obj; left=right=null; Paket tree kapselt Klasse Node; deshalb: kein Widerspruch zur Knotenklasse bei Listen left data right Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 5 / 29

Implementierung von Bäumen: Binärbäume. public class Tree { protected Node root; // Konstruktoren Tree() { root=null; Tree(Node r) { root=r; // Zugriffsmethoden public boolean isempty() { return (root==null);.. Generische Binärbäume durch Referenz auf Knoten Ein leerer Baum t wird nicht durch t=null repräsentiert, sondern durch existierendes Objekt t.root=null Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 6 / 29

Rekursive Traversierung von Binärbäumen package tree;. interface NodeActionInterface { public void action(node n);. Schnittstellenklasse für generische Durchläufe (Traversierungen) Aktionsobjekt der Klasse NodeActionInterface als Parameter public void preorder/inorder/postorder(nodeactioninterface p) { if (this.isempty()) return; Tree lefttree=new Tree(root.left); Tree righttree=new Tree(root.right); Präorder p.action(root); lefttree.preorder(p); righttree.preorder(p); Inorder lefttree.preorder(p); p.action(root); righttree.preorder(p); Postorder lefttree.preorder(p); righttree.preorder(p); p.action(root); Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 7 / 29

Rekursive Traversierung von Binärbäumen: Beurteilung Laufzeit: jede Baumkante wird zweimal durchlaufen: einmal beim Absteigen im Rekursionsbaum, einmal beim Wiederaufstieg damit: 2n 2 Kantentraversierungen, d.h., O(n) Schritte, für Baum mit n Knoten (zusätzlicher) Speicherplatz: betrachten Baumerzeugungen beim Rekursionsaufruf: Tree lefttree=new Tree(root.left); Tree lefttree=new Tree(root.right); für jeden Knoten werden 2 Bäume erzeugt und wieder zerstört damit: im schlechtesten Fall 2n zusätzliche Referenzen auf Objekte (Bäume) und 2n zusätzliche Variablen (Wurzeln) Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 8 / 29

Nicht-rekursive Traversierung von Binärbäumen Reduzierung des Rekursionsaufwandes bei der Traversierung: Stacks: Simuliere Rekursionsstack innerhalb der Klasse Stack ist Datenstruktur mit Operationen push und pop push legt ein Objekt als oberstes Element auf den Stack pop nimmt das oberste Objekt vom Stack Realisierung des LIFO-Prinzips ( last-in first-out ) Jackets: Benutze eine Mantelprozedur benutze zwei Traversierungsmethoden: eine public und eine private private Methode greift intern explizit auf die Knoten zu Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 9 / 29

Traversierung von Binärbäumen: Stacks package tree; public class Tree { protected Node root;. public void preordernonrecursive(nodeactioninterface p) { java.util.stack stack=new java.util.stack(); stack.push(root); while (!stack.isempty()) { Object tmp=stack.pop(); if (tmp!= null && tmp instanceof Node) { Node tmpn = (Node) tmp; p.action(tmpn); stack.push(tmpn.right); stack.push(tmpn.left);. Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 10 / 29

Traversierung von Binärbäumen: Jackets package tree; public class Tree { protected Node root;. public void preordernonrecursive(nodeactioninterface p) { traversepreorder(root,p); private void traversepreorder(node n,nodeactioninterface p) { if (n == null) return; p.action(); traversepreorder(n.left,p); traversepreorder(n.right,p);. Problem: stets n + 1 triviale Aufrufe von traversepreorder Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 11 / 29

Traversierung von Binärbäumen: Jackets package tree; public class Tree { protected Node root; Ausweg: späterer Emptiness-Test. public void preorder(nodeactioninterface p) { if (!isempty()) traversepreordernonempty(root,p); private void traversepreordernonempty(node n,nodeactioninterface p) { p.action(); if (left!= null) traversepreorder(n.left,p); if (right!= null) traversepreorder(n.right,p);. Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 12 / 29

Grundbegriffe: Graphen Bisher: Bäume als Verallgemeinerung von Listen Jetzt: Bäume als Spezialfall von Graphen Ein gerichteter Graph ist ein Paar G = (V, E) bestehend aus einer (nicht-leeren) Menge V von Knoten oder Ecken (engl. vertices, nodes) einer Menge E von gerichteten Kanten (engl. edges, arcs): Kantenmenge E ist eine binäre Relation auf V, d.h. E V V Kante (u, v) E ist von u nach v gerichtet, symbolisch u v; u heißt Kopf (engl. head), v heißt Ende (engl. tail) in Graphen als Datenstruktur dürfen sowohl Knoten als auch Kanten Etikette (engl. labels) besitzen Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 13 / 29

Grundbegriffe: Graphen Baum mit Wurzel als gerichteter Graph: Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 14 / 29

Grundbegriffe: Graphen Ein ungerichteter Graph ist ein Paar G = (V, E) bestehend aus einer (nicht-leeren) Menge V von Knoten oder Ecken einer Menge E von ungerichteten Kanten: Kantenmenge E ist eine symmetrische binäre Relation auf V, d.h. (u, v) E (v, u) E ungerichtete Kanten werden meist durch Mengen beschrieben, also {u, v E (in Mengen spielt die Reihenfolge der Elemente keine Rolle) alternativ: nur ein Paar angeben und festlegen, dass Graph ungerichtet sein soll Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 15 / 29

Grundbegriffe: Graphen Baum als ungerichteter Graph: Wo ist die Wurzel? Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 16 / 29

Grundbegriffe: Graphen Betrachten ungerichteten Graphen G = (V, E) Ein Weg (der Länge k) in G ist Folge von Knoten (v 0, v 1,..., k), so dass jeweils {v i 1, v i eine Kante in E ist (Beachte: Weg der Länge 0 besteht nur aus einem einzigen Knoten) Ein Pfad (der Länge k) in G ist eine Weg (v 0, v 1,..., v k ), wobei jeder Knoten nur einmal vorkommt Ein Kreis in G ist ein Weg, bei dem der erste und der letzte Knoten übereinstimmen und bei dem keine Kante mehrfach benutzt wird Eigenschaften eines ungerichteten Graphen G = (V, E): G ist zusammenhängend def für alle Knoten u, v V gibt es einen Weg mit u als erstem und v als letztem Knoten G ist ein Baum def G ist zusammenhängend und kreisfrei G ist ein Wald def G ist kreisfrei Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 17 / 29

Grundbegriffe: Graphen ungerichteter Graph mit Kreis, zusammenhängend (kein Baum): Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 18 / 29

Grundbegriffe: Graphen ungerichteter Graph mit Kreis, nicht zusammenhängend (kein Wald): Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 19 / 29

Grundbegriffe: Graphen Wald (kein Baum): Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 20 / 29

Grundbegriffe: Graphen Es sei G = (V, E) ein ungerichteter Graph Fakten: G = (V, E ) ist Teilgraph von G def V V und E E Ein Spannbaum von G ist ein Teilgraph G = (V, E ) von G mit folgenden Eigenschaften: G ist ein Baum V = V Jeder zusammenhängende, ungerichtete Graph enthält einen Spannbaum G ist Baum G ist zusammenhängend und m = n 1 G ist Baum zwischen jeweils zwei Knoten von G gibt es genau einen Pfad Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 21 / 29

Grundbegriffe: Graphen Graph mit Spannbaum: Wie finden wir einen Spannbaum? Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 22 / 29

Implementierung von Graphen Konvention: n ist die Anzahl der Knoten eines Graphen m ist die Anzahl der Kanten eines Graphen Gebräuchliche Implementierungen: Kantenlisten Adjazenzlisten Adjazenzmatrix wichtige Operationen auf Graphen: Adjazenztest: Sind zwei Knoten durch eine Kante verbunden? Bestimmung inzidenter Kanten: Welche Kanten berühren einen gegebenen Knoten? Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 23 / 29

Implementierung von Graphen: Kantenlisten Kantenlisten bestehen aus Knoten- und Kantenobjekten Knotenobjekt für einen Knoten v V : Zeiger auf Datenobjekt (Label bzw. Etikett) Zeiger auf nächstes Knotenobjekt Kantenobjekt für eine Kante e E: Zeiger auf Datenobjekt (Label bzw. Etikett) Zeiger auf die beteiligten Knoten (head und tail) Markierung für gerichtet oder ungerichtet Zeiger auf nächstes Kantenobjekt Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 24 / 29

Implementierung von Graphen: Kantenlisten Kantenliste für Beispielgraph: A 1 2 B D C E 3 4 F Knoten 1 2 3 4 Kanten A B C D E F Bestimmung inzidenter Kanten an einem Knoten in O(m) Adjazenztest in O(m) Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 25 / 29

Implementierung von Graphen: Adjazenzlisten Adjazenzlisten bestehen aus Knoten- und Kantenobjekten Knotenobjekt für einen Knoten v V : Zeiger auf Datenobjekt (Label bzw. Etikett) Zeiger auf Listen für eingehende (inbound) und ausgehende Kanten (outbound) Zeiger auf nächstes Knotenobjekt Kantenobjekt für eine Kante e E: Zeiger auf Datenobjekt (Label bzw. Etikett) Zeiger auf die beteiligten Knoten (head und tail) Markierung für gerichtet oder ungerichtet Zeiger auf nächstes Kantenobjekt Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 26 / 29

Implementierung von Graphen: Adjazenzliste Adjazenzliste für den Beispielgraph: Knoten 1 2 3 4 Kanten A B C D E F Bestimmung inzidenter Kanten an einem Knoten in O(deg(v)) Adjazenztest in O(min{deg(u), deg(v)) Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 27 / 29

Implementierung von Graphen: Adjazenzmatrix Adjazenzmatrix A(G) für Graphen G = (V, E) mit V = {0,..., n 1 ist eine n n-matrix mit { 1 wenn (i, j) E a ij = def 0 wenn (i, j) / E Beispielgraph G = (V, E) hat folgende Adjazenzmatrix: 0 1 1 0 A(G) = 0 0 1 1 0 0 0 1 0 0 1 0 Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 28 / 29

Implementierung von Graphen: Adjazenzmatrix Adjazenzmatrix (als Datenstruktur) besteht aus Knotenobjekten, Kantenobjekten und einem Matrixobjekt Knotenobjekt für einen Knoten v V : Zeiger auf Datenobjekt (Label bzw. Etikett) Index von v, d.h. seine Nummer in V Zeiger auf nächstes Knotenobjekt Kantenobjekt wie bei Kantenlisten Matrixobjekt als n n-reihung A mit A[i][j] enthält Zeiger auf Kantenobjekt für Kante e = (i, j) (für ungerichtete Graphen: A[i][j]=A[j][i]), sonst null Bestimmung inzidenter Kanten an einem Knoten in O(min{n, m) Adjazenztest in O(1) Problem: stets O(n 2 ) Speicherplatz unabhängig von Anzahl tatsächlich vorhandener Kanten (nur für dichte Graphen sinnvoll) Sven Kosub (Algorithmik/TKS) EI2: Bäume & Graphen 29 / 29