Grundlagen der Programmierung Algorithmen und Datenstrukturen Die Inhalte der Vorlesung wurden primär auf Basis der angegebenen Literatur erstellt. Darüber hinaus sind viele Teile direkt aus der Vorlesung von Prof. Dr.-Ing. Faustmann (ebenfalls FHW Berlin) übernommen worden. Für die Bereitstellung dieses Vorlesungsmaterials möchte ich mich an dieser Stelle noch einmal recht herzlich bedanken. 14.12.2005 Prof. Dr. Andreas Schmietendorf 1 Datenstrukturen 14.12.2005 Prof. Dr. Andreas Schmietendorf 2 Motivation § § Ziele bei der Entwicklung komplexer Datenstrukturen: - Effiziente Speicherung von Daten - Effiziente Suche in gossen Datenbeständen - Nachbildung abstrakter und realer Sachverhalte Komplexe Datenstrukturen - Verkettete Listen (Gegenstück zu den bekannten Feldern) - Bäume (inkl. Binärbäume) - Graphen (gerichtet und ungerichtet) 14.12.2005 Prof. Dr. Andreas Schmietendorf 3 Motivation § Sortierte Reihungen (Arrays) - § Verkettete Listen - § schnelles Suchen von Elementen Hoher Aufwand des Einfügens Speicher muss von Beginn an reserviert werden einfaches Einfügen eines Elements aufwändiger Zugriff auf ein bestimmtes Element Liste kann dynamisch erweitert werden Bäume - einfaches Wiederauffinden von Elementen Baum kann dynamisch erweitert werden Baum muss gute Struktur haben! 14.12.2005 Prof. Dr. Andreas Schmietendorf 4 Verkettete Listen 14.12.2005 Prof. Dr. Andreas Schmietendorf 5 Verkettete Liste DATA Unter einer verketteten Liste Kopfknoten LINK versteht man eine lineare und dynamisch erweiterbare Anordnung von Datenelementen. DATA LINK Die einzelnen Elemente einer Liste sind explizit durch Kanten verbunden, die durch Zeiger oder DATA LINK Referenzen ausgedrückt werden. Quelle: Ehses, E.; Victor, F.: Programmiersprachen, in Taschenbuch der Informatik, Fachbuchverlag Leipzig, 3. Auflage, ISBN 3-446-21331-7 14.12.2005 DATA Schwanzknoten null Prof. Dr. Andreas Schmietendorf 6 Verkettete Listen Beispiel für eine verkettete Liste in Java: § In Java existieren keine explizite Zeiger - In Java ist der Name des Objektes ist gleich mit dessen Adresse - Jeder Knoten besitzt einen Verweis auf das nächste Element der Liste § Es soll eine verkettete Liste von Integerwerten aufgebaut werden - Klasse: IntNode à Repräsentiert die Knoten der verketteten Liste - Klasse: IntList à Implementierung der verketteten Liste - Klasse: IntListTest à Test der verketteten Liste Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4 14.12.2005 Prof. Dr. Andreas Schmietendorf 7 Verkettete Listen Klasse: IntNode à Repräsentiert die Knoten der verketteten Liste: § 2 Instanzvariablen - Speichern des eigentlichen Datenelementes (hier ein Integerwert) - Speichern des Verweises auf den nächsten Knoten vom Typ IntNode § Konstruktor – Belegung der Variablen beim Erzeugen der Instanz - this.data = initialData; - this.link = initialLink; § Methoden von IntNode: - Setzen der Instanzvariablen à setData(..) bzw. setLink(..) - Lesen der Instanzvariablen à getData() bzw. getLink() Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4 14.12.2005 Prof. Dr. Andreas Schmietendorf 8 Verkettete Listen Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4 14.12.2005 Prof. Dr. Andreas Schmietendorf 9 Verkettete Listen //**** Klasse für einen Knoten der Liste ******* class IntNode { // Invarianten: // 1. Die Integervariable speichert das Datenelement. // 2. Der Verweis ist null für den letzten Knoten, // ansonsten zeigt er auf den nächsten Knoten. private int data; private IntNode link; //**************************** // Konstruktor //**************************** public IntNode(int initialData, IntNode initialLink) { this.data = initialData; this.link = initialLink; } 14.12.2005 Prof. Dr. Andreas Schmietendorf 10 Verkettete Listen // Zugriffs- und Manipulationsmethoden // für die Instanzvariablen von IntNode public int getData(){ return this.data; } public void setData(int newData){ this.data = newData; } public IntNode getLink(){ return this.link; } public void setLink(IntNode newLink){ this.link = newLink; } } 14.12.2005 Prof. Dr. Andreas Schmietendorf 11 Verkettete Listen Klasse: IntList à Implementiert die verketteten Liste von Int-Werten: § 2 Instanzvariablen - Erster Knoten in der Liste - Anzahl der Knoten in der Liste § Konstruktor – Belegung der Variablen beim Erzeugen der Instanz - this.head = null; - this.numNodes = 0; § Methoden von IntList: - Traversieren - Elemente der Liste untersuchen à showList() - Einfügen – Knoten in die Liste einfügen (am Kopf oder in der Liste) - Entfernen – Knoten aus der Liste entfernen (am Kopf oder in der Liste) Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4 14.12.2005 Prof. Dr. Andreas Schmietendorf 12 Verkettete Listen Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4 14.12.2005 Prof. Dr. Andreas Schmietendorf 13 Verkettete Listen package listen; //Klasse für verkettete Liste von Integerwerten class IntList{ // IntList - Container zum Speichern von Objekten der Klasse IntNode // Instanzvariablen int numNodes; // Anzahl Knoten in Liste IntNode head; // Erster Knoten in Liste // Konstruktor public IntList(){..} // Einfügen eines Elements am Kopf der Liste public void insertAtHead(int item){..} // Löscht das Element im Kopf der Liste. public boolean removeFromHead(){..} // Traversiere Liste und zeige alle Elemente public void showList(){..} } 14.12.2005 Prof. Dr. Andreas Schmietendorf 14 Verkettete Listen // Einfügen eines Elements am Kopf der Liste public void insertAtHead(int item) { // Erzeuge neuen Knoten IntNode aNode = new IntNode(item, this.head); // Anzahl Knoten updaten this.numNodes++; // Kopf auf neuen Knoten setzen this.head = aNode; // Kopf auf neuen Knoten setzen } 14.12.2005 Prof. Dr. Andreas Schmietendorf 15 Verkettete Listen // Löscht das Element im Kopf der Liste. public boolean removeFromHead() { // Leere Liste? if(this.numNodes == 0) return false; // Entferne Knoten durch Umsetzen des Kopfes this.head = this.head.getLink(); this.numNodes--; return true; } 14.12.2005 Prof. Dr. Andreas Schmietendorf 16 Verkettete Listen public void showList(){ // Zeige Anzahl Knoten in Liste System.out.println("Anzahl Knoten: " + this.numNodes); // Erzeuge eine Variable für die Traversierung. // Diese Variable ist von Typ IntNode und wird mit // dem Kopf der Liste initialisiert. IntNode aNode = this.head; while(aNode != null){ System.out.print(aNode.getData() + " "); // nächster Knoten aNode = aNode.getLink(); } System.out.println(); } 14.12.2005 Prof. Dr. Andreas Schmietendorf 17 Verkettete Listen Übung: § Analysieren Sie die Ihnen zur Verfügung gestellten Klassen § Schreiben Sie ein Programm welches in Abhängigkeit eingegebener Integerzahlen eine verkettete Liste erzeugt. - Legen Sie die eingegeben Werte in einem Array aus Integerwerten ab - Nutzen Sie die Klassen IntNode und IntList (verwendet IntNode) - Erzeugen der verketteten Liste IntList myList = new IntList(); - Fügen Sie die einzelnen Werte jeweils am Kopf der Liste ein - Geben Sie die komplette Liste aus - Löschen Sie ein Element am Kopf der Liste - Geben Sie die komplette Liste wiederum aus § Optional: Einfügen/Entfernen eines bestimmten Elementes 14.12.2005 Prof. Dr. Andreas Schmietendorf 18 Verkettete Listen Übung – Optional (Problem des Josephus ): N Personen beschließen, einen Massenselbstmord zu begehen. Sie stellen sich in einen Kreis auf und töten jeweils die M-te Person, wobei sich immer wieder der Kreis schließt. Es ist zu ermitteln, welche Person als letzte überlebt bzw. allgemeiner wie die Reihenfolge aussieht. Beispiel für N=5 und M=3: 1 3 4 2 4 Reihenfolge: 31524 1 2 5 3 Nutzen Sie den vorgegebenen Rahmen Josephus.java! 14.12.2005 Prof. Dr. Andreas Schmietendorf 19 Verkettete Listen Mehrfach verkettete Listen: § Liste mit mehrfachen Referenzen - Speicherung von Nachfolgerknoten und Vorgängerknoten - Ggf. Speicherung weiterer für die Operation benötigter Knoten § Bewertung: - Vorteil: Verbesserung der Laufzeit - Nachteil: Erhöhter Bedarf an Speicherplatz § Zirkuläre Listen - letzter Knoten der Liste verweist auf den ersten Knoten - Verwendung zur Implementierung von Ein- und Ausgabepuffer 14.12.2005 Prof. Dr. Andreas Schmietendorf 20 Verwendung von Bäumen 14.12.2005 Prof. Dr. Andreas Schmietendorf 21 Bäume Ein Baum ist ein gerichteter Graph, bei dem jeder Knoten ausgehend von einem besonderen Knoten, dem so genannten Wurzelknoten, über genau einen Weg erreichbar ist. Die von einem Knoten unmittelbar über eine Kante erreichbaren Knoten heißen Kindknoten. Der Knoten selbst Elternknoten. Binärbäume (binary trees) sind Bäume, bei denen jeder Knoten höchstens zwei Kindknoten hat. Quelle: Ehses, E.; Victor, F.: Programmiersprachen, in Taschenbuch der Informatik, Fachbuchverlag Leipzig, 3. Auflage, ISBN 3-446-21331-7 14.12.2005 Prof. Dr. Andreas Schmietendorf 22 Bäume Definition 1: § Ein Binärbaum ist eine - leere Struktur oder - ein Knoten mit einem linken (Teil-)Baum und einem rechten (Teil-)Baum. Definition 2: § Ein binärer Suchbaum ist ein binärer Baum mit folgender Zusatzbedingung für alle Knoten: - Alle kleineren und gleichen Schlüssel befinden sich im linken Teilbaum. - Alle größeren Schlüssel befinden sich im rechten Teilbaum. 14.12.2005 Prof. Dr. Andreas Schmietendorf 23 Bäume – Begriffe I § Die Wurzel eines Baumes ist Wurzelknoten der Knoten, der als einziger Ein innerer Knoten keinen Vorgänger besitzt. § Ein Blatt ist ein Knoten, der keinen Nachfolger hat. Alle Zwei innere Knoten anderen Knoten heißen auch Drei Blätter innere Knoten. 14.12.2005 Prof. Dr. Andreas Schmietendorf 24 Bäume – Begriffe II § Die Knoten eines Baums können in Ebenen unterteilt werden: § Ein Binärbaum heißt voll, wenn außer der letzten alle seine Ebenen „voll besetzt sind“, d.h. wenn die Ebenen k genau 2k Knoten enthält. § Ein Binärbaum heißt komplett, wenn er voll ist und die Knoten auf der letzten Ebene alle „linksbündig und dicht“ angeordnet sind. 14.12.2005 Prof. Dr. Andreas Schmietendorf 25 Bäume – Begriffe III § Ein Pfad in einem Baum ist eine Folge von Knoten p0, ..., pk eines Baums, die die Bedingung erfüllt, dass pi+1 Nachfolger von pi ist für 0=<i<k. § Ein Pfad, der p0 mit pk verbindet, hat die Länge k. § Jeder von der Wurzel verschiedene Knoten eines Baums ist durch genau einen Pfad mit der Wurzel verbunden. 14.12.2005 Prof. Dr. Andreas Schmietendorf 26 Bäume – Begriffe IV § § § Die Tiefe eines Knotens ist sein Abstand zur Wurzel, d.h. die Anzahl der Kanten auf dem Pfad von diesem zur Wurzel. Die Höhe eines Baums gibt an, wie weit die tiefsten Blätter von der Wurzel entfernt sind. Sein Gewicht ist die Anzahl der Knoten: 14.12.2005 Prof. Dr. Andreas Schmietendorf 27 Bäume Implementierung Binärbaums (Knoten als Objekt d. Klasse BTNode): § Benötigte Instanzvariablen: - Knotendaten private char data; - Knotenlevel private int level; - Referenz auf das linke Kind des Knotens private BTNode leftCh; - Referenz auf das rechte Kind des Knotens private BTNode rightCh; § Benötigte Methoden innerhalb der Klasse BTNode - Konstruktor – Init der 4 Instanzvariablen this.level = nodeLevel; - Schreiben und Lesen der Instanzvariablen public BTNode getLeft() public void setLeft() 14.12.2005 Prof. Dr. Andreas Schmietendorf 28 Bäume 14.12.2005 Prof. Dr. Andreas Schmietendorf 29 Bäume Operationen auf Bäume § Basisoperationen - Suchen nach einem Schlüssel - Einfügen eines Knotens mit gegebenem Schlüssel - Entfernen eines Knotens mit gegebenem Schlüssel Diese Operationen werden Wörterbuchoperationen genannt. Eine entsprechende Struktur mit ihren Operationen wird als Implementierung eines Wörterbuchs bezeichnet. § Weitere Operationen - Durchlaufen aller Knoten in bestimmter Reihenfolge (Traversieren) Aufspalten eines Baums in mehrere Bäume Zusammenfügen mehrerer Bäume zu einem Baum Konstruieren eines Baums mit bestimmten Eigenschaften 14.12.2005 Prof. Dr. Andreas Schmietendorf 30