Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich."—  Präsentation transkript:

1 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl für Algorithm Engineering Wintersemester 2005/06

2 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen2 Kapitel 8: Abstrakte Datentypen Inhalt Definition ADT Keller ADT Schlange - Exkurs: Dynamischer Speicher (new / delete) ADT Liste ADT Binärbaum - Exkurs: Einfache Dateibehandlung - Exkurs: Strings (C++) - Anwendung ADT Graphen heute

3 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen3 Kapitel 8: Abstrakte Datentypen ADT Binäre Bäume: Anwendung Aufgabe: Gegeben sei eine Textdatei. Häufigkeiten der vorkommenden Worte feststellen. Alphabetisch sortiert ausgeben. Strategische Überlegungen: Lesen aus Textdatei ifstream benutzen! Sortierte Ausgabe Binärbaum: schnelles Einfügen, sortiert von selbst Worte vergleichen C++ Strings verwenden! Programmskizze: Jeweils ein Wort aus Datei lesen und in Binärbaum eintragen. Falls Wort schon vorhanden, dann Zähler erhöhen. Wenn alle Wörter eingetragen, Ausgabe (Wort, Anzahl) via Inorder-Durchlauf.

4 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen4 Kapitel 8: Abstrakte Datentypen struct BinBaum { string wort; int anzahl; BinBaum *links, *rechts; }; BinBaum *Einlesen(string &dateiname) { ifstream quelle; quelle.open(dateiname.c_str()); if (!quelle) return 0; string s; BinBaum *b = 0; while (!quelle.eof()) { quelle >> s; b = Einfuegen(s, b); } quelle.close(); return b; } Datei öffnen Worte einzeln auslesen und im Baum einfügen Datei schließen + Zeiger auf Baum zurückgeben gelesenes Wort wie oft gelesen?

5 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen5 Kapitel 8: Abstrakte Datentypen BinBaum *Einfuegen(string &s, BinBaum *b) { if (b == 0) { b = new BinBaum; b->wort = s; b->anzahl = 1; b->links = b->rechts = 0; return b; } if (b->wort rechts = Einfuegen(s, b->rechts); else if (b->wort > s) b->links = Einfuegen(s, b->links); else b->anzahl++; return b; }

6 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen6 Kapitel 8: Abstrakte Datentypen void Ausgabe(BinBaum *b) { if (b == 0) return; Ausgabe(b->links); cout anzahl wort.c_str() << endl; Ausgabe(b->rechts); } Dies ist die Inorder-Ausgabe. Präorder: cout …; Ausgabe(…); Ausgabe(…); Postorder: Ausgabe(…); Ausgabe(…); cout …;

7 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen7 Kapitel 8: Abstrakte Datentypen #include using namespace std; int main() { string s("quelle.txt"); BinBaum *b = Einlesen(s); Ausgabe(b); return 0; } Hauptprogramm:

8 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen8 Kapitel 8: Abstrakte Datentypen Durchlaufstrategien: Tiefensuche (depth-first search, DFS) - Präorder Vor (prä) Abstieg in Unterbäume die Knotenbehandlung durchführen - Postorder Nach (post) Abstieg in bzw. Rückkehr aus Unterbäumen die Knotenbehandlung durchführen - Inorder Zwischen zwei Abstiegen Knotenbehandlung durchführen z.B. Ausdruck des Knotenwertes Breitensuche (breadth-first search, BFS; auch: level search) auf jeder Ebene des Baumes werden Knoten abgearbeitet, bevor in die Tiefe gegangen wird

9 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen9 Kapitel 8: Abstrakte Datentypen Breitensuche Beispiel: eingegebene Zahlenfolge 17, 4, 36, 2, 8, 40, 19, 6, 7, Ausgabe: 17, 4, 36, 2, 8, 19, 40, 6, 37, 7 Implementierung: Übung!

10 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen10 Kapitel 8: Abstrakte Datentypen ADT Graph Verallgemeinerung von (binären) Bäumen Wichtige Struktur in der Informatik Zahlreiche Anwendungsmöglichkeiten - Modellierung von Telefonnetzen, Versorgungsnetzwerken, Straßenverkehr, … - Layout-Fragen bei elektrischen Schaltungen - Darstellung sozialer Beziehungen - etc. Viele Probleme lassen sich als Graphenprobleme verkleiden und dann mit Graphalgorithmen lösen!

11 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen11 Kapitel 8: Abstrakte Datentypen Definition EIn Graph G = (V, E) besteht aus einer Menge von Knoten V (vertex, pl. vertices) und einer Menge von Kanten E (edge, pl. edges) mit E V x V Eine Kante (u, v) heißt Schlinge (loop), wenn u = v. Der Grad (degree) eines Knotens v V ist die Anzahl der zu ihm inzidenten Kanten: deg(v) = | { (a, b) E : a = v oder b = v } |. Maxgrad von G ist (G) = max { deg(v) : v V } Mingrad von G ist (G) = min { deg(v) : v V } (G) = 6 (G)= 3 Schlinge

12 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen12 Kapitel 8: Abstrakte Datentypen Definition Für v i V heißt (v 0, v 1, v 2, …, v k ) ein Weg oder Pfad in G, wenn (v i,v i+1 ) E für alle i = 0, 1, …, k-1. Die Länge eines Pfades ist die Anzahl seiner Kanten. Ein Pfad (v 0, v 1, v 2, …, v k ) mit v 0 = v k wird Kreis genannt. Distanz dist(u, v) von zwei Knoten ist die Länge des kürzesten Pfades von u nach v. Durchmesser diam(G) eines Graphes G ist das Maximum über alle Distanzen: diam(G) = max { dist(u, v) : (u, v) V x V }. Graph ist zusammenhängend, wenn 8 u, v V mit u v einen Pfad gibt. G heißt Baum gdw. G zusammenhängend und kreisfrei. Knoten v heißt Blatt wenn deg(v) = 1.

13 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen13 Kapitel 8: Abstrakte Datentypen Darstellung im Computer Adjazenzmatrix A mit a ij = 1 falls (v i,v j ) E 0 sonst Problem: Da | E | | V | 2 = n 2 ist Datenstruktur ineffizient (viele Nullen) wenn | E | verschwindend klein. Adjazenzlisten: Für jeden Knoten v eine (Nachbarschafts-) Liste L(v) mit L(v) = { u V : (v, u) E }

14 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen14 Kapitel 8: Abstrakte Datentypen Beispiel e d a b c L(a) = ( b, e ) L(b) = ( a, c, d ) L(c) = ( b, d ) L(d) = ( b, c, e ) L(e) = ( a, d ) Adjazenzlisten abcde a01001 b10110 c01010 d01101 e10010 Adjazenzmatrix ADT Liste Array[][]

15 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen15 Kapitel 8: Abstrakte Datentypen Funktionalität 1.Initialisierung: leere Menge von Knoten 2.Knoten erzeugen: new verwenden; Wert in Knoten speichern 3.Kante eintragen zwei Knoten übergeben, Adjazenzliste aktualisieren 4.Graph ausgeben über Adjazenzlisten laufen … 5.Knoten löschen 6.Kante löschen 7.Graph zusammenhängend 8.Graph kreisfrei 9.Graph ist Baum?

16 Rudolph: EINI (WS 2005/06) Kap. 8: Abstrakte Datentypen16 Kapitel 8: Abstrakte Datentypen Implementierung? … ist natürlich machbar mit uns bisher bekannten Möglichkeiten. Bisher: Im wesentlichen Programmierung im Stil von C. Nächste Vorlesung: Einstieg in die objektorientierte Programmierung mit C++ … die Graphen kommen wieder!


Herunterladen ppt "Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich."

Ähnliche Präsentationen


Google-Anzeigen