Praktische Informatik 1

Slides:



Advertisements
Ähnliche Präsentationen
8. Termin Teil B: Wiederholung Begriffe Baum
Advertisements

DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Graphen Ein Graph ist eine Kollektion von Knoten und Kanten. Knoten sind einfache Objekte. Sie haben Namen und können Träger von Werten, Eigenschaften.
7. Natürliche Binärbäume
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Binäre Bäume Richard Göbel.
Sortieren mit Binären Bäumen
Java: Dynamische Datentypen
Baumstrukturen Richard Göbel.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26 - Graphen) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Thema: Fibonacci-Zahlen
FH-Hof Sortieren mit Binären Bäumen Richard Göbel.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Effiziente Algorithmen
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
2.4 Rekursion Klassifikation und Beispiele
Graphen und Bäume.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Algorithmen und Datenstrukturen Übungsmodul 8
Kapitel 6: Suchbäume und weitere Sortierverfahren
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
Softwareengineering Graphen und Bäume Teil II
Programmiervorkurs WS 2014/15 Methoden
10 Graphen gerichtete und ungerichtete, mit Marken an Ecken und/oder Kanten Anwendungsgebiete: Verkehrsnetze, Kommunikationsnetze, Netzpläne, Spiele,...
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Algorithmen und Datenstrukturen 1 SS 2002
7 Bäume = „verzweigte Folgen“ Z.B. Stammbaum, patriarchalisch: Abraham
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Binärer Suchbaum IV AVL-Baum I
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Binärer Suchbaum III- -AVL-Baum-
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Binärbäume.
Java Programme nur ein bisschen objektorientiert.
Die allgemeine Liste.
Praktische Informatik 1
Praktische Informatik 1
Adiazenzmatrix des Graphen
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
2.4 Rekursion Klassifikation und Beispiele
Aufgaben zu Rückgabewerten
Vorlesung AVL-Bäume/Algorithmen-
Vorlesung AVL-Bäume/Algorithmen-
Felder in Java.
Informatik Kurse
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
Heapsort-Algorithmus
 Präsentation transkript:

Praktische Informatik 1 Prof. Dr. H. Schlingloff 30. 1. 2008

Hinweis Programmierkurs (für Hörer dieser Vorlesung), auf freiwilliger Basis von Kommilitonen organisiert: http://trac2.assembla.com/engineeringPractices

Bäume in Java class Bintree{ Bintree left; int node; Bintree right; …} class Ntree{ String name; int children; Ntree [] child; Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];}

Anwendung von Binärbäumen geordnete Binärbäume: linker Unterbaum < Wurzel < rechter Unterbaum Einfügen je nach einzufügendem Inhalt Suchen im entsprechenden Unterbaum Löschen etwas komplizierter logarithmische Durchschnittskomplexität Problem: Bäume können entarten

Einfügen in geordneten Binärbäumen void einfügen (int i) { if (i<node) if (left==null) left=new Bintree(i); else left.einfügen(i); else if (i>node) if (right==null) right=new Bintree(i); else right.einfügen(i); // else i==node, d.h. schon enthalten } package Bäume; class Bintree { Bintree left; int node; Bintree right; Bintree(int n){ node = n; } public String toString() { return(node + "(" + left + "," + right + ")"); } void einfügen (int i) { if (i<node) if (left==null) left=new Bintree(i); else left.einfügen(i); else if (i>node) if (right==null) right=new Bintree(i); else right.einfügen(i); // else i==node, d.h. schon enthalten class Ntree{ String name; int children; Ntree [] child; Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];} public class BaumDemo { public static void main(String[] args) { Bintree b = new Bintree(0); System.out.println(b); b.einfügen(17); System.out.println(b); b.einfügen(-5); System.out.println(b); b.einfügen(23); System.out.println(b); b.einfügen(11); System.out.println(b);

Suchen in geordneten Binärbäumen boolean finde(int i) { if (i<node) if (left==null) return false; else return left.finde(i); else if (i>node) if (right==null) return false; else return right.finde(i); else return true; //i==b.node } package Bäume; class Bintree { Bintree left; int node; Bintree right; Bintree(int n){ node = n; } public String toString() { return(node + "(" + left + "," + right + ")"); } void einfügen (int i) { if (i<node) if (left==null) left=new Bintree(i); else left.einfügen(i); else if (i>node) if (right==null) right=new Bintree(i); else right.einfügen(i); // else i==node, d.h. schon enthalten boolean finde(int i) { if (left==null) return false; else return left.finde(i); if (right==null) return false; else return right.finde(i); else return true; //i==b.node class Ntree{ String name; int children; Ntree [] child; Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];} public class BaumDemo { public static void main(String[] args) { Bintree b = new Bintree(0); System.out.println(b); b.einfügen(17); System.out.println(b); b.einfügen(-5); System.out.println(b); b.einfügen(23); System.out.println(b); b.einfügen(11); System.out.println(b);

Löschen? Beim Löschen eines Knotens muss ein Unterbaum angehoben werden Wahlfreiheit (linker oder rechter Unterbaum?) Durch das Anheben entsteht eine Lücke, die wiederum durch Anheben eines Unterbaums gefüllt werden muss Problem mit der Balance (Ausgewogenheit) des Baumes Balancegrad beeinflusst die Komplexität des Suchens! Lösungsmöglichkeiten: Abspeichern der Baumhöhe oder der Anzahl der Teilbäume für jeden Knoten endlich verzweigte Bäume

endlich verzweigte Bäume class Ntree{ String name; int children; Ntree [] child; Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];} public String toString() { String s = name + "(" + children + ")["; for (int i=0; i< children; i++) s += child[i]; s += "]"; return s; }}

Eine Beispielfamilie class BeispielFamilie extends Ntree { private Ntree t; BeispielFamilie() { Ntree n28=new Ntree("Johanna",3); Ntree n55=new Ntree("Renate",0); Ntree n60=new Ntree("Angelika",2); Ntree n62=new Ntree("Margit",1); Ntree n89=new Ntree("Laura",0); Ntree n93=new Ntree("Linda",0); Ntree n98=new Ntree("Viktoria",0); n28.child[0]=n55; n28.child[1]=n60; n28.child[2]=n62; n60.child[0]=n89; n60.child[1]=n93; n62.child[0]=n98; t=n28; } } package Bäume; class Ntree{ String name; int children; Ntree [] child; Ntree (){} Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];} public String toString() { String s = name + "(" + children + ")["; for (int i=0; i< children; i++) s += child[i]; s += "]"; return s; } } class BeispielFamilie extends Ntree{ private Ntree t; BeispielFamilie() { Ntree n28=new Ntree("Johanna",3); Ntree n55=new Ntree("Renate",0); Ntree n60=new Ntree("Angelika",2); Ntree n62=new Ntree("Margit",1); Ntree n89=new Ntree("Laura",0); Ntree n93=new Ntree("Linda",0); Ntree n98=new Ntree("Viktoria",0); n28.child[0]=n55; n28.child[1]=n60; n28.child[2]=n62; n60.child[0]=n89; n60.child[1]=n93; n62.child[0]=n98; t=n28; } public String toString() {return t.toString();} public class BaumDemo { public static void main(String[] args) { System.out.println(new BeispielFamilie());

Suche in endlich verzweigten Bäumen boolean suche (String s) { if (name==s) return true; for (int i=0; i<children; i++) if (child[i]==null) return false; else if(child[i].suche(s)) return true; return false; } package Bäume; class Ntree{ String name; int children; Ntree [] child; Ntree(){} Ntree (String s, int n) { name=s; children=n; child=new Ntree [n];} public String toString() { String s = name + "(" + children + ")["; for (int i=0; i< children; i++) s += child[i]; s += "]"; return s; } boolean suche (String s) { if (name==s) return true; for (int i=0; i<children; i++) if (child[i]==null) return false; else if(child[i].suche(s)) return true; return false; } class BeispielFamilie extends Ntree { private Ntree t; BeispielFamilie() { Ntree n28=new Ntree("Johanna",3); Ntree n55=new Ntree("Renate",0); Ntree n60=new Ntree("Angelika",2); Ntree n62=new Ntree("Margit",1); Ntree n89=new Ntree("Laura",0); Ntree n93=new Ntree("Linda",0); Ntree n98=new Ntree("Viktoria",0); n28.child[0]=n55; n28.child[1]=n60; n28.child[2]=n62; n60.child[0]=n89; n60.child[1]=n93; n62.child[0]=n98; t=n28; } public String toString() {return t.toString();} boolean suche (String s) {return t.suche(s); } public class BaumDemo { public static void main(String[] args) { BeispielFamilie f = new BeispielFamilie(); System.out.println(f); System.out.println(f.suche("Linda"));

Graphen Wdh.: Definition Graph Repräsentationsmöglichkeiten Darstellung einer binären Relationen über einer endlichen Grundmenge Tupel (V,E), V endliche Menge von Knoten, E Menge von Kanten, zu jeder Kante genau ein Anfangs- und ein Endknoten Repräsentationsmöglichkeiten als Relation (Menge von Paaren) Knotendarstellung, Verweise als Kanten Adjazenzmatrix

Adjazenzmatrix Angenommen, die Knoten seien k1…kn boolesche Matrix m der Größe nn m[i][j] gibt an, ob eine Verbindung von ki-1 zu kj-1 existiert oder nicht Vorbesetzung z.B.: static void fillMatrixRandom (boolean matrix[][], float f) { for (int i = 0; i<n; i++) { for (int j = 0; j<n; j++) { matrix[i][j]=(Math.random()<f); } } }

transitive Hülle Def. transitive Hülle: xR*y  xRy  z (xR*z  zR*y) Algorithmus von Warshall: starte mit R*=R für jeden möglichen Zwischenknoten z: Berechne für alle x und y, ob xR*y  (xR*z  zR*y) Reihenfolge der Schleifen ist wichtig! Algorithmus von Floyd (kürzeste Wege) Entfernungsmatrix, min statt , + statt 

static void warshall(boolean m[][], boolean t[][]) { for (int x = 0; x<n; x++) { for (int y = 0; y<n; y++) { t[x][y]=m[x][y]; } } for (int z=0; z<n; z++) { t[x][y]=t[x][y]||t[x][z]&&t[z][y]; }

Knoten-Kanten-Darstellung Syntaktisch lassen sich Graphen auch genauso wie endlich verzweigte Bäume darstellen: class Graph{ char node; int numberOfEdges; Graph [] edge; Graph (char c, int n) { node=c; numberOfEdges=n; edge=new Graph [n];}

zyklische Graphen Semantisch können Graphen Zyklen enthalten: BeispielGraph() { Graph nodeA=new Graph('a',3); Graph nodeB=new Graph('b',2); Graph nodeC=new Graph('c',1); Graph nodeD=new Graph('d',2); Graph nodeE=new Graph('e',0); nodeA.edge[0]=nodeB; nodeA.edge[1]=nodeC; nodeA.edge[2]=nodeD; nodeB.edge[0]=nodeD; nodeB.edge[1]=nodeE; nodeC.edge[0]=nodeE; nodeD.edge[0]=nodeA; nodeD.edge[1]=nodeE;}

Anwendung von Graphen Beispiel: Verbindungsnetz der Bahn Suche Verbindung zwischen zwei Knoten Problem: Zyklen führen evtl. zu nicht terminierender Rekursion Lösung: Markieren bereits untersuchter Knoten (z.B. Eintragen in einer Menge)

Erreichbarkeit - fehlerhaft boolean search (char c) { return suche(c, this); } private boolean suche (char c, Graph g) { // Achtung fehlerhaft!! if (g==null) return false; if (g.node==c) return true; for (int i=0; i<g.edges; i++) if (suche(c, g.edge[i])) return true; return false; } // funktioniert nur falls Graph zyklenfrei // d.h. wenn Graph n-fach verzweigter Baum ist

Erreichbarkeit - korrigiert import java.util.*; Set s; boolean search (char c) { s = new HashSet(); return suche(c, this); } private boolean suche (char c, Graph g) { if (g==null) return false; if (s.contains(g)) return false; if (g.node==c) return true; s.add(g); for (int i=0; i<g.edges; i++) if (suche(c, g.edge[i])) return true; return false; }

9.2 Suchen und Sortieren Gegeben eine (irgendwie strukturierte) Sammlung von Daten Spezielles Suchproblem: entscheide ob ein gegebenes Element in der Sammlung enthalten ist Allgemeines Suchproblem: finde ein (oder alle) Elemente mit einer bestimmten Eigenschaft Algorithmen hängen stark von der Struktur der Datensammlung ab! im Folgenden: als Reihung (Array) organisiert

lineare Suche Wenn über den Inhalt der Reihung nichts weiter bekannt ist, muss sie von vorne bis hinten durchsucht werden Komplexität: mindestens 1, höchstens n Schleifendurchläufe  O(n) static int suche(int suchreihung[], int suchinhalt) { for (int i=0; i<n; i++) { if (suchreihung[i]==suchinhalt) return(i); } return (-1);//oder exception } package Suche; public class Suche { public static final int n = 10; static void printReihung(int reihung[]) { for (int i = 0; i<n; i++) System.out.print(reihung[i] + " "); System.out.println(""); } static void fillReihungRandom(int reihung[]) { reihung[i]=(int) (Math.random()*10); static int sucheLinear(int suchreihung[], int suchinhalt) { for (int i=0;i<n;i++) { if (suchreihung[i]==suchinhalt) return(i); return (-1);//oder exception public static void main(String[] args) { int[]r=new int[n]; fillReihungRandom(r); printReihung(r); System.out.println(sucheLinear(r,3));

binäre Suche Wenn der Inhalt der Reihung aufsteigend sortiert ist, können wir es besser machen: static int sucheBZ (int sr[], int si, int lo, int hi){ if (lo > hi) return -1; int mitte = (lo + hi) / 2; if (si == sr[mitte]) return mitte; else if (si < sr[mitte]) return sucheBZ(sr, si, lo, mitte - 1); else /* (si > sr[mitte])*/ return sucheBZ(sr, si, mitte + 1, hi); } static int sucheBinaer(int suchrg[], int suchinh) { return sucheBZ (suchrg, suchinh, 0, n-1); } package Suche; public class Suche { public static final int n = 10; static void printReihung(int reihung[]) { for (int i = 0; i<n; i++) System.out.print(reihung[i] + " "); System.out.println(""); } static void fillReihungSorted(int reihung[]) { final int inc = 3; reihung[0]=(int) (Math.random()*inc); for (int i = 1; i<n; i++) reihung[i]= reihung[i-1] + (int) (Math.random()*inc); static int sucheBZ(int sr[], int si, int lo, int hi) { if (lo > hi) return -1; int mitte = (hi + lo) / 2; if (si == sr[mitte]) return mitte; else if (si < sr[mitte]) return sucheBZ(sr, si, lo, mitte - 1); else /* (si > sr[mitte])*/ return sucheBZ(sr, si, mitte + 1, hi); static int sucheBinaer(int suchreihung[], int suchinhalt) { return sucheBZ(suchreihung, suchinhalt, 0, n-1); public static void main(String[] args) { int[]r=new int[n]; fillReihungSorted(r); printReihung(r); System.out.println(sucheBinaer(r,7));

Hashtabellen Wenn über den Inhalt der Reihung mehr bekannt ist, können wir es noch besser machen Annahme: 10*i  r[i]  10*i + 9, z.B. r[7] liegt zwischen 70 und 79, d.h. jedes Datenelement hat höchstens einen möglichen Platz package Suche; public class Suche { public static final int n = 10; static void printReihung(int reihung[]) { for (int i = 0; i<n; i++) System.out.print(reihung[i] + " "); System.out.println(""); } static void fillReihungHashable(int reihung[]) { reihung[i]= 10*i + (int) (Math.random()*10); static int sucheHash(int suchreihung[], int suchinhalt) { int idx = suchinhalt / 10; return (suchreihung[idx]==suchinhalt)?idx:-1; public static void main(String[] args) { int[]r=new int[n]; fillReihungHashable(r); printReihung(r); System.out.println(sucheHash(r,77)); static int sucheHash(int suchreihung[], int suchinhalt) { int idx = suchinhalt / 10; return (suchreihung[idx]==suchinhalt)?idx:-1; }