8 Baum in perfekter Komposition

Ähnliche Dokumente
1. Die rekursive Datenstruktur Liste

Bäume als spezielle Graphen

Bäume als spezielle Graphen

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Informatik Abitur Bayern 2017 / II - Lösung

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 16. Juli Klausur

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

I Die rekursive Datenstruktur Liste

Vorlesung Datenstrukturen

Kapitel 12: Induktive

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Dokumentation zum AVL-Baum (C++)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

2. Vererbung und Kapselung

3. Die Datenstruktur Graph

Geordnete Binärbäume

Von der UML nach C++

Grundlagen der Informatik

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Verkettete Datenstrukturen: Bäume

Tutoraufgabe 1 (Listen):

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Konstruktor BinaryTree() Nach dem Aufruf des Konstruktors existiert ein leerer Binärbaum.

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

9. Vererbung und Polymorphie. Informatik Vererbung und Polymorphie 1

13. Bäume: effektives Suchen und Sortieren

13. Bäume: effektives Suchen und Sortieren

Kapitel 10 Mampfi im Labyrinth

10. Datenbank Design 1

Bäume. Martin Wirsing. Ziele. Implementierung von Knoten. Bäume (abstrakt) Standardimplementierungen für Bäume kennen lernen

Umsetzung einer Klassenkarte in einer Programmiersprache

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Ein erstes "Hello world!" Programm

12. Dynamische Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Übung 4: Die generische Klasse AvlBaum in Java 1

Verkettete Datenstrukturen: Listen

ALP II Dynamische Datenmengen Datenabstraktion

Algorithmen und Datenstrukturen I AVL-Bäume

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

Binärbäume: Beispiel

Algorithmen und Datenstrukturen. Bäume. M. Herpers, Y. Jung, P. Klingebiel

Tutoraufgabe 1 (Implementierung eines ADTs):

Tutoraufgabe 1 (2 3 4 Bäume):

Kapitel 14 Das Labyrinth optimieren

1. Die rekursive Datenstruktur Liste

Grundlagen der Objektorientierten Programmierung - Methoden -

Algorithmen und Datenstrukturen 1

Gliederung der Folien

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Java: Implemen'erung von Assozia'onen.

ÜBUNGEN ZUR OBJEKTORIENTIERTEN MODELLIERUNG

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B4.1 Definitionen und Eigenschaften. B4.2 Traversierung. B4.

Algorithmen und Datenstrukturen

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Praktikum OOP/C++ - Versuch 5

Theorie zu Übung 8 Implementierung in Java

Kapitel 11 Objektkommunikation mit Antworten

Klausur "ADP" SS 2015

1 Abstrakte Datentypen

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

13. Dynamische Datenstrukturen

Semestralklausur Informatik I - Programmierung

Abiturfach Informatik. Rahmenbedingungen und Aufgabenbeispiele

Algorithmen und Datenstrukturen 2. Dynamische Datenstrukturen

Wiederholungsklausur "ADP" WS 2016/2017

ADT: Verkettete Listen

Transkript:

8 Baum in perfekter Komposition Die Implementierung des Binärbaums im letzten Kapitel wird mithilfe des Entwurfsmusters Kompositum optimiert. Knoten und Abschluss Bei der einfach verketteten Liste wurde durch den Einsatz des Entwurfsmusters Kompositum die Struktur der Klassenbeziehungen verändert und eine optimierte Implementierung erreicht. 4 Wie funktioniert das Software-Entwurfsmuster bei der einfach verketteten Liste? Welche Sonderfälle vereinfacht es? Wie kann das Entwurfsmuster Kompositum bei Baumstrukturen angewendet werden? Welche Klassen benötigt man zur Umsetzung der Datenstruktur Binärbaum mithilfe des Entwurfsmusters Kompositum? In welchen Beziehungen stehen die Klassen zueinander? Jeder Knoten hat die Referenzattribute linkernachfolger und rechternachfolger. Gibt es keinen Nachfolger, so hat das Referenzattribut den Wert null. In Abbildung 1 wurden, im Gegensatz zu den vereinfachten Darstellungen im letzten Kapitel, bei jedem Knoten beide Pfeile als Symbol für die Referenzattribute eingetragen. 1 Darstellung des Binärbaums mit Abschlusssymbolen Wie im Kapitel 4 ist auch hier der Ansatz möglich, dass man anstelle von null als Wert der Referenzattribute für den linken und rechten Nachfolger eine Referenz auf ein Objekt der Klasse ABSCHLUSS setzt. Objekte der Klasse ABSCHLUSS haben weder Referenzattribute auf Nachfolger noch auf ein Datenelement, bieten jedoch die gleiche Schnittstelle in Form von n an wie die Klasse KNOTEN. In Abbildung 2 sind die Objekte der Klasse ABSCHLUSS eingefügt. 2 Baum mit Objekten der Klasse ABSCHLUSS (blaue Einfärbung) Objekte der Klassen KNOTEN und ABSCHLUSS müssen nach außen die gleichen n anbieten, somit die gleiche Schnittstelle realisieren. Im Vergleich zur Liste wird diese jedoch nicht LISTENELEMENT, sondern BAUMELEMENT genannt. Sowohl jeder Knoten als auch jedes Abschluss-Objekt ist ein Baumelement. Deshalb wird die Schnittstelle durch 75

II Die rekursive Datenstruktur Baum eine abstrakte Oberklasse realisiert. Das Klassendiagramm in Abbildung 3 gibt eine Übersicht über die beteiligten Klassen und deren Beziehungen. Das Entwurfsmuster Kompositum ist durch eine blaue Linienfarbe hervorgehoben. 3 Klassendiagramm der Binärbaumstruktur mit Kompositum BAUMELEMENT {abstrakt} BAUMELEMENT() ABSCHLUSS ABSCHLUSS() BINBAUM BAUMELELEMNT wurzel BINBAUM() KNOTEN DATENELEMENT daten BAUMELEMENT linkernachfolger BAUMELEMENT rechternachfolger KNOTEN(DATENELEMENT) KNOTEN(DATENELEMENT, KNOTEN, KNOTEN) Wie unterscheiden sich die Beziehungen des Klassendiagramms in Abbildung 3 von denen im Klassendiagramm, das in Abbildung 3 von Kapitel 4 die Datenstruktur Liste mithilfe des Entwurfsmusters Kompositum umsetzt? Welche Änderungen ergeben sich bei den Attributen der Klassen KNOTEN, BINBAUM und DATENELEMENT durch die Umstellung auf das Entwurfsmuster Kompositum? Implementierung des Entwurfsmusters Kompositum Attribute und Konstruktoren Im ersten Schritt der Umsetzung werden nur die Attribute und Konstruktoren betrachtet. Die Klasse BAUMELEMENT hat keine Attribute. Somit müssen im Konstruktor keine Anweisungen ausgeführt werden, der Rumpf ist leer. Die Klasse ABSCHLUSS hat keine Attribute. Wiederum müssen im Konstruktor keine Anweisungen ausgeführt werden. Im Sinne eines guten Programmierstils ruft man dennoch den Konstruktor der Oberklasse auf. Die Klasse KNOTEN hat wie bisher Referenzen auf den rechten und linken Nachfolger und ein Datenelement. Die Nachfolger sind entsprechend dem Klassendiagramm aus Abbildung 3 vom Datentyp BAUMELEMENT. Der Konstruktor hat bisher beim Aufruf die eingegebene Referenz dem Referenzattribut daten zugewiesen und die Werte der beiden Nachfolgerreferenzen auf null gesetzt. Letzteres muss geändert werden: Man muss zwei Objekte der Klasse ABSCHLUSS erzeugen und deren Referenzen den Referenzattributen linkernachfolger und rechternachfolger zuordnen (Abbildung 4). Die Klasse BINBAUM hat wie bisher ein Referenzattribut wurzel. Dieses ist nun vom Typ BAUMELEMENT. Beim Erzeugen eines leeren Baums ist die Wurzel ein Objekt der Klasse ABSCHLUSS (Abbildung 5). 4 Alle beteiligten Objekte beim Erzeugen eines Knotens 5 Alle beteiligten Objekte beim Erzeugen eines Binärbaums 76

Suchen Bei der Suchen zeigt sich klar der Vorteil des Entwurfsmusters Kompositum. Alle bedingten Anweisungen, die prüfen, ob es einen Nachfolger gibt oder nicht, werden überflüssig. Dafür sind die Implementierungen der Suchen in den Klassen ABSCHLUSS und KNOTEN unterschiedlich. - Suchen der Klasse KNOTEN: War die Suche bisher erfolglos, so wird bei einem der Nachfolger ein rekursiver Aufruf der vorgenommen. Jeder Knoten hat jetzt immer zwei Nachfolger. - Suchen der Klasse ABSCHLUSS: Die Suche war erfolglos, es wird die leere Referenz zurückgegeben. Folgende Gegenüberstellung zeigt die Änderungen im Detail: vorher (einfacher Binärbaum) Klasse KNOTEN wenn (daten.istschluesselgleich(suchschluessel)) return daten wenn (daten. IstSchluesselGroesserAls(suchSchluessel)) wenn (linkernachfolger!= null) return linkernachfolger. wenn (rechternachfolger!= null) return rechternachfolger. nachher (Binärbaum nach Entwurfsmuster Kompositum) Klasse KNOTEN wenn (daten.istschluesselgleich(suchschluessel)) return daten wenn (daten. IstSchluesselGroesserAls(suchSchluessel)) return linkernachfolger. return rechternachfolger. Klasse ABSCHLUSS 6 Veränderung der Suchen in der Klasse KNOTEN durch die Umstellung auf das Entwurfsmuster Kompositum Die Suchen der Klasse BINBAUM verkürzt sich ebenfalls. Es muss nicht mehr überprüft werden, ob der Baum leer ist, denn ein leerer Baum hat ein Abschluss-Objekt. Dieser gibt mit null die richtige Antwort auf eine Suchanfrage (siehe nächste Seite). 77

II Die rekursive Datenstruktur Baum vorher (einfacher Binärbaum) Klasse BINBAUM wenn (wurzel!= null) return wurzel. nachher (Binärbaum nach Entwurfsmuster Kompositum) Klasse BINBAUM return wurzel. 7 Veränderung der Suchen in der Klasse BINBAUM durch die Umstellung auf das Entwurfsmuster Kompositum und Einfügen Ein Einfügen findet beim geordneten Binärbaum immer am Ende eines Astes statt. Dort wird das Abschluss-Objekt ersetzt durch einen neuen Knoten. Er referenziert das einzufügende Datenelement und zwei Objekte der Klasse ABSCHLUSS. Abbildung 8 verdeutlicht dies am Beispiel des naufrufs wurzel.einfuegen(referenz auf Datenelement mit "cake" als Schlüssel). Der Abschluss a1 wird also durch einen neuen Knoten ersetzt, dessen Datenelement den Schlüssel "cake" hat und der zwei neue Abschlüsse referenziert. 8 Beim Einfügen wird ein Abschluss-Objekt (hier a1) durch einen neuen Knoten (hier mit der Beschriftung cake ) mit zwei neuen Abschluss-Objekten (hier a4 und a5) ersetzt. Die Schwierigkeit bei dem in Abbildung 8 dargestellten Einfügevorgang ist, dass das Objekt "call" noch nicht weiß, dass es einen neuen linken Nachfolger erhalten wird, wenn es den Auftrag zum Einfügen an das Objekt a1 weitergibt. Das Objekt a1 erzeugt nun einen neuen Knoten "cake". Da a1 seinen Aufrufer, das Objekt "call", bisher aber nicht kennt, kann es ihn nicht über den neuen Nachfolger informieren. Wie kann der Aufrufer trotz der fehlenden Referenz nach oben die Information über den neuen Nachfolger erhalten? Man löst dieses Problem, indem man die Einfuegen mit einem Rückgabewert vom Typ BAUMELEMENT versieht. Darüber kann jedes Objekt der Klasse ABSCHLUSS (hier das Objekt a1) dem Aufrufer-Objekt (hier der Knoten mit der Beschriftung "call") eine Referenz des von ihm erzeugten Knotens (hier der Knoten "cake") übergeben. Welchen Wert geben Objekte der Klasse KNOTEN beim Aufruf der Einfuegen zurück? 78

Objekte der Klasse KNOTEN rufen zwar abhängig davon, ob das eigene Datenelement größer oder kleiner ist als die neuen Daten, die Einfügen des linken oder rechten Nachbarn auf. Danach wird aber in beiden Fällen mit this die Referenz auf sich selbst zurückgegeben, da die Position jedes Knotens innerhalb der Baumstruktur gleich bleibt. Hinweise: - Das Verfahren, eine Information an den Aufrufer einer durch die Einführung eines Rückgabewerts zu übergeben, wurde bereits bei der EinfuegenVor bei Listen und bei der Entfernen bei Bäumen angewandt. - Das Abschluss-Objekt a1 wird nach dem Einfügen (Abbildung 8 rechts) nicht mehr benötigt. In den meisten objektorientierten Programmiersprachen werden nicht mehr referenzierte Objekte von der automatischen Speicherplatzbereinigung gelöscht. 3 7 garbage collection Der Ablauf beim Einfügen des Wortes cake : wurzel.einfuegen("cake") Daten sind gleich? nein Sind eigene Daten größer als die neuen Daten? ja Beauftrage linken Nachfolger mit dem Einfügen. wurzel.linf.einfuegen("cake") Erzeuge einen Knoten mit einem Datenelement "cake". Gib eine Referenz auf den erzeugten Knoten zurück. Setze den Rückgabewert als linken Nachfolger. Gib eine Referenz auf dich selbst zurück. 9 Ablauf des naufrufs wurzel.einfuegen("cake") 79