Weiteres Programm Studium des Breitendurchlaufs Hierzu

Slides:



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

Vorbereitung: struct knoten { int x; struct knoten *l, *r; } *b, *bh, **bp; b: Zeiger auf Wurzel bh: Hilfszeiger bp: Zeiger auf Zeiger auf knoten b bp.
Claudio Moraga; Gisbert Dittrich
7. Natürliche Binärbäume
Kapitel 6. Suchverfahren
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Gliederung Motivation / Grundlagen Sortierverfahren
Sortieren mit Binären Bäumen
Java: Objektorientierte Programmierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
WS Algorithmentheorie 05 - Treaps Prof. Dr. 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.
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.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 11 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
IKG - Übung Diskrete Mathe I – Jörg Schmittwilken
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
DVG Klassen und Objekte
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Einführung in die Programmierung Datensammlung
Informatikunterricht mit Java
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmiersprache C 4
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Vorlesung Binärer Suchbaum II-
Graphen und Bäume.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Algorithmen und Datenstrukturen 1 SS 2002
1 // Verkettete Liste 3 // demonstriert verkettete Listen und // Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element;
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-
Binärer Baum, Binärer Suchbaum I
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Diskrete Mathematik I Vorlesung 7 Binärer Suchbaum III.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Implementieren von Klassen
 Präsentation transkript:

Weiteres Programm Studium des Breitendurchlaufs Hierzu zunächst Studium von Warteschlangen zuerst einfache Warteschlangen aus ganzen Zahlen daraus Abstrakter Datentyp Warteschlange Anpassung für Baumknoten

Strategie bei den drei behandelten Durchlaufarten durch binäre Suchbäume heißt Tiefensuche (es wird zunächst in die Tiefe und nicht in die Breite gegangen). Alternative: Breitensuche - trage den Baum schichtenweise ab. Beispiel: 17 17 # 6 # 23 # 4 # 7 # 18 # 26 6 23 4 7 18 26 Implementation?

Idee: verwalte die Knoten in einer Warteschlange. ein Knoten wird gedruckt seine Söhne werden in die Warteschlange eingefügt bis die Warteschlange leer ist Initialisierung der Warteschlange: Wurzel

Beispiel: 17 6 23 4 7 18 26

Realisierung? Wir machen einen Ausflug in das Gebiet der Warteschlangen. Eine Warteschlange arbeitet so: Einfügen von Elementen am Ende Entfernen von Elementen am Anfang Vereinfachende Annahme für diese einführende Diskussion: Elemente sind ganze Zahlen.

Berücksichtigt werden muß: ausgezeichnete Elemente Anfang (Kopf) und Ende (Fuß) Liste der Elemente (möchte mich nicht am Anfang auf eine feste Anzahl von Elementen festlegen; sonst: Feld möglich) Operationen: Einfügen am Ende Entfernen am Anfang Initialisierung Wunsch: möchte Daten und Operationen gern zusammen betrachten können.

Aber weiter: Kopf, Fuß und Operationen auf der Warteschlange? struct IntListe { int Element; IntListe * weiter; }; die bekannte Listendeklaration. Aber weiter: Kopf, Fuß und Operationen auf der Warteschlange? Idee: deklariere entsprechende struct.

Warteschlange struct Warteschlange { }; DieListe IntListe * DieListe; IntListe * Kopf, *Fuss; Kopf Fuss Einfuegen(int) IntListe * Einfuegen(int); Entfernen() IntListe * Entfernen(); Init() IntListe * Init(); DerKopf() int DerKopf(); ListenDruck(...) void ListenDruck(ofstream *);

Damit wird die Signatur der Operationen mit den Daten für die Operationen gemeinsam deklariert. Vorteil: alle Eigenschaften eines Datentyps (hier: Warteschlange) sind zusammengefaßt. die wesentlichen Operationen, die zu einem Datentyp gehören, werden mit dem Datentypen vereinbart, d.h. Lokalität der Änderungen Übersichtlichkeit Verständlichkeit

Problem: wir kennen die Signaturen der Operationen. Was ist mit dem Code? Der wird getrennt von der struct-Definition vereinbart. (Analogie: Angabe der Signatur der benutzten Funktionen in einer Funktion, davon getrennte Angabe des Code )

Name des Typs “das zum Typ gehörende Init” Typ des Rückgabewerts Warteschlange gehörende Init” Typ des Rückgabewerts IntListe * Warteschlange::Init() { Kopf = Fuss = NULL; return Kopf; }; Name der Funktion

IntListe * Warteschlange::Init() { DieListe = Kopf = Fuss = NULL; return DieListe; }; Beachte: die in der struct-Definition definierten Namen (Kopf, Fuss) sind hier sichtbar. der Name der struct muß angegeben werden, um die Zuordnung zu ermöglichen (Init kann ja auch bei anderen Typen vorkommen).

Konvention Weitere Beispiele int Warteschlange::DerKopf() { return (DieListe == NULL ? -1 : DieListe->Element); }; void Warteschlange::ListenDruck(ofstream *aus) { IntListe * Laeufer = Kopf; while (Laeufer != NULL) { *aus << Laeufer->Element << endl; Laeufer = Laeufer->weiter; } };

IntListe * Warteschlange::Entfernen() { if (Kopf == NULL){ DieListe = Kopf; return NULL; else { if (Kopf == Fuss) { Kopf = Fuss = NULL; } Kopf = Kopf->weiter; DieListe = Kopf return DieListe; };

der Code müßte bekannt sein IntListe * Warteschlange::Einfuegen(int i) { IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = K; Kopf->weiter = Fuss; } else if (Fuss == NULL){ Kopf->weiter = K; Fuss = K; else { Fuss->weiter = K; DieListe = Fuss; return DieListe; }; der Code müßte bekannt sein

Deklaration der Warteschlange void main() { ofstream *out = new ofstream("aus.aus"); Warteschlange W; W.Init(); for (int i=1; i < 10; i++) W.Einfuegen(i); W.ListenDruck(out); W.Einfuegen(117); *out << "\nNach Einfuegen von 117: " << endl; W.ListenDruck(out); *out << "\nKopf: " << W.DerKopf() << endl; W.Entfernen(); *out << "\nNach Entfernen des ersten Elements: "; } Deklaration der Warteschlange Zugriff über Qualifikation

Ausgabe: Programm: prog-21.cpp 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # Nach Einfuegen von 117: 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 117 # Kopf: 1 Nach Entfernen des ersten Elements: 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 117 # Kopf: 2 Programm: prog-21.cpp

Abstrakter Daten- typ Beobachtung: Eigentlich werden die Interna (Kopf, Fuss, DieListe etc) überhaupt nicht benötigt. Die Interna könnten/sollten privat, d.h. verborgen bleiben. Zugriff von außen nur über die entsprechenden Operationen Warteschlange als eine Art Datenkapsel mit internen Zustand (Kopf, Fuss, DieListe) Zugriffsoperationen (Einfuegen etc.) Zustand von außen nicht änderbar Abstrakter Daten- typ

privat öffentlich DieListe Kopf Fuss Einfuegen(int) Entfernen() Init() DerKopf() ListenDruck(...) privat öffentlich

Führt zu folgender Deklaration: neu Führt zu folgender Deklaration: struct Warteschlange { private: IntListe * DieListe; IntListe * Kopf, * Fuss; public: void Einfuegen(int); void Entfernen(); void Init(); int DerKopf(); void ListenDruck(ofstream *); }; beachte: void

Beispiel: Warteschlange W sei deklariert. hierbei: public deutet an, daß auf die darauf folgenden Namen von außen (durch Qualifikation) zugegriffen werden darf. private deutet an, daß die darauf folgenden Namen vor dem Zugriff geschützt sind Beispiel: Warteschlange W sei deklariert. Illegal: W.Kopf W.DieListe W.Fuss Legal z.B.: W.Init() W.Einfuegen(45) W.DerKopf()

Änderungen: Typ der Rückgabe ist void; eliminiert return eliminiert void Warteschlange::Einfuegen(int i) { IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = K; Kopf->weiter = Fuss; } else if (Fuss == NULL){ Kopf->weiter = K; Fuss = K; else { Fuss->weiter = K; DieListe = Kopf; };

Programm: prog-21a.cpp Allgemeine Anmerkung: Warteschlange wird ein abstrakter Datentyp (ADT) genannt. ADTs sind charakterisiert durch Offenlegen der Schnittstellen (Signaturen) Verbergen der Implementation (d.h. Zugriff nur über wohldefinierte Operationen) Wichtige Konstruktion in der Softwaretechnik, insb. im objektorientierten Entwurf. Wesentliches Thema für das zweite Semester

Zurück zur Breitensuche. Strategie: Verwendung einer Warteschlange Q, die aus Knoten des Baums besteht Füge zunächst den Wurzelknoten in Q ein. der Kopf K von Q wird gedruckt. nach dem Druck geschieht folgendes: ist K.LSohn != NULL, so wird dieser Knoten in Q eingefügt, ist K.RSohn != NULL, so wird dieser Knoten in Q eingefügt, das geschieht solange, bis Q leer ist

Anpassung der Datentypen: struct BinBaum { char text[maxLen]; int zaehler; BinBaum * LSohn, *RSohn; }; Anpassung der Datentypen: struct BaumListe { BinBaum * Element; BaumListe * weiter; }; Änderung im Typ des Listen- elements struct Warteschlange { private: BaumListe * DieListe; BaumListe * Kopf, * Fuss; public: void Einfuegen(BinBaum *); void Entfernen(); void Init(); int IstLeer(); BinBaum * DerKopf(); };

zentrale Prozedur: Programm: prog-22.cc void BreitenSuche(BinBaum *K, ofstream *aus) { void KnotenDruck(BinBaum *, ofstream *); Warteschlange W; W.Init(); W.Einfuegen(K); while (!W.IstLeer()) { BinBaum *L = W.DerKopf(); W.Entfernen(); W.Einfuegen(L->LSohn); W.Einfuegen(L->RSohn); KnotenDruck(L, aus); } Programm: prog-22.cc

1 Herr 1 Havelland,Ein 6 von 3 Birnbaum 2 Herbsteszeit 9 Ribbeck Herr von Ribbeck auf Ribbeck im Havelland, Ein Birnbaum in seinem Garten stand, Und kam die goldene Herbsteszeit Und die Birnen leuchteten weit und breit, Da stopfte, wenn's Mittag vom Turme scholl, Der von Ribbeck sich beide Taschen voll, Und kam in Pantinen ein Junge daher, So rief er: »Junge, wiste 'ne Beer?« Und kam ein Mädel, so rief er: »Lütt Dirn, Kumm man röwer, ick hebb 'ne Birn.« So ging es viel Jahre, bis lobesam Der von Ribbeck auf Ribbeck zu sterben kam. Er fühlte sein Ende. 's war Herbsteszeit, Wieder lachten die Birnen weit und breit; Da sagte von Ribbeck: »Ich scheide nun ab. Legt mir eine Birne mit ins Grab.« Und drei Tage drauf, aus dem Doppeldachhaus, Trugen von Ribbeck sie hinaus, Alle Bauern und Büdner mit Feiergesicht Sangen »Jesus meine Zuversicht«, Und die Kinder klagten, das Herze schwer: »He is dod nu. Wer giwt uns nu 'ne Beer?« 1 Herr 1 Havelland,Ein 6 von 3 Birnbaum 2 Herbsteszeit 9 Ribbeck 3 weit 1 »Junge, 1 Garten 1 Havelland. 1 Herbsteszeit, 1 Mittag 4 auf 2 war 1 wenn's 1 »Ich 5 'ne 2 Birnen 1 Grab.« 1 Junge