Grundlagen der Programmierung

Werbung
Grundlagen der Programmierung
Algorithmen und Datenstrukturen
Die Inhalte der Vorlesung wurden primär auf Basis der angegebenen Literatur erstellt. Darüber
hinaus wurden ausgewählte Teile in Abstimmung zur Vorlesung von Prof. Dr.-Ing. Faustmann
(ebenfalls FHW Berlin) aufgenommen.
09.01.2012
Prof. Dr. Andreas Schmietendorf
1
Datenstrukturen
09.01.2012
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)
09.01.2012
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!
09.01.2012
Prof. Dr. Andreas Schmietendorf
4
Verkettete Listen
09.01.2012
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
09.01.2012
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
09.01.2012
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
09.01.2012
Prof. Dr. Andreas Schmietendorf
8
Verkettete Listen
Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4
09.01.2012
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;
}
09.01.2012
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;
}
}
09.01.2012
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
09.01.2012
Prof. Dr. Andreas Schmietendorf
12
Verkettete Listen
Quelle: Sanchez, J.; Canton, M.P.: Java 2 – Wochenend Crashkurs, mitip-Verlag, ISBN 3-8266-0769-4
09.01.2012
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(){..}
}
09.01.2012
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
}
09.01.2012
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;
}
09.01.2012
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();
}
09.01.2012
Prof. Dr. Andreas Schmietendorf
17
Übung - Verkettete Listen
§ 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
09.01.2012
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!
09.01.2012
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
09.01.2012
Prof. Dr. Andreas Schmietendorf
20
Verwendung von Binärbäumen
09.01.2012
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
09.01.2012
Prof. Dr. Andreas Schmietendorf
22
Binärbaum
09.01.2012
Prof. Dr. Andreas Schmietendorf
23
Binärbaum
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.
09.01.2012
Prof. Dr. Andreas Schmietendorf
24
Binärbaum – Begriffe I
§ Die Wurzel eines Baumes ist
der Knoten, der als einziger
keinen Vorgänger besitzt.
§ Ein Blatt ist ein Knoten, der
keinen Nachfolger hat. Alle
anderen Knoten heißen auch
innere Knoten.
09.01.2012
Prof. Dr. Andreas Schmietendorf
25
Binärbaum – Begriffe II
§
Die Knoten eines Baums können
in Ebenen unterteilt werden:
§
Ein Binärbaum heißt voll, wenn
Ebene 0
außer der letzten alle seine
Ebenen „voll besetzt sind“, d.h.
Ebene 1
wenn die Ebenen k genau 2k
Ebene 2
Knoten enthält.
§
Ein Binärbaum heißt komplett,
wenn er voll ist und die Knoten auf
Ebene 3
der letzten Ebene alle „linksbündig
und dicht“ angeordnet sind.
09.01.2012
Prof. Dr. Andreas Schmietendorf
26
Binärbaum – 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.
Ebene 0
Pfadlänge = 3
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.
09.01.2012
Prof. Dr. Andreas Schmietendorf
Ebene 1
Ebene 2
Ebene 3
27
Binärbaum – 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:
09.01.2012
Prof. Dr. Andreas Schmietendorf
28
Binärbaum
Implementierung Binärbaums (Knoten als Objekt d. Klasse BTNode):
§ Benötigte Instanzvariablen:
- Knotendaten private int 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, wie z.B.:
public BTNode getLeft()
public void setLeft(BTNode child)
09.01.2012
Prof. Dr. Andreas Schmietendorf
29
Übung - Binärbäume
§ Realisieren Sie in einem Java-Programm eine Datenstruktur
„sortierter binärer Baum“. Füllen Sie die Datenstruktur mit
Datenwerten von 1 bis 10. Der Baum enthält somit 10 Knoten.
§ Wie viele Ebenen hat der von Ihnen programmierte Baum? Wie viele
Ebenen kann ein Baum dieser Art mit 10 Knoten maximal und
minimal haben?
§ Erweiterung: Realisieren Sie die iterativen oder rekursive Funktionen
maxSuche(BTNode root) bzw. minSuche(BTNode root), die in
einem durch seine Wurzel root gegebenen Binärbaum den größten
bzw. kleinsten Schlüssel sucht.
§ Optional: Realisieren Sie die Suche nach einem bestimmten Knoten
09.01.2012
Prof. Dr. Andreas Schmietendorf
30
Binärbaum – Klasse BTNode
09.01.2012
Prof. Dr. Andreas Schmietendorf
31
Binärbaum – Klasse BTContainer
09.01.2012
Prof. Dr. Andreas Schmietendorf
32
Binärbaum – Klasse BTContainer
09.01.2012
Prof. Dr. Andreas Schmietendorf
33
Binärbaum – Klasse BTTest
09.01.2012
Prof. Dr. Andreas Schmietendorf
34
Binärbaum
Übung - Bemerkungen:
§ Das kleinste Element eines binären Suchbaumes findet man, wenn
man dem linken Teilbaum solange folgt, bis ein Knoten mit einem
leeren linken Teilbaum angetroffen wird.
- minSuche(BTNode root)
§ Das größte Element eines binären Suchbaumes findet man, wenn
man dem rechten Teilbaum solange folgt, bis ein Knoten mit einem
leeren rechten Teilbaum angetroffen wird.
- maxSuche(BTNode root)
09.01.2012
Prof. Dr. Andreas Schmietendorf
35
Binärbaum
Lösungsansatz zur min- bzw. max-Suche:
09.01.2012
Prof. Dr. Andreas Schmietendorf
36
Binärbaum
Basisoperationen auf Binärbäume:
§ 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.
09.01.2012
Prof. Dr. Andreas Schmietendorf
37
Binärbaum
Weitere Operationen auf Binärbäume:
§ Durchlaufen aller Knoten in bestimmter Reihenfolge (Traversieren)
- inorder: linker Teilbaum, Wurzel, rechter Teilbaum
- preorder: Wurzel, linker Teilbaum, rechter Teilbaum
- postorder: linker Teilbaum, rechter Teilbaum, Wurzel
§ Aufspalten eines Baums in mehrere Bäume
§ Zusammenfügen mehrerer Bäume zu einem Baum
§ Konstruieren eines Baums mit bestimmten Eigenschaften
09.01.2012
Prof. Dr. Andreas Schmietendorf
38
INORDER - LWR
Ausgabereihenfolge: 2, 6, 7, 9, 12, 15, 18, 25
09.01.2012
Prof. Dr. Andreas Schmietendorf
39
PREORDER - WLR
Ausgabereihenfolge: 12, 6, 2, 7, 9, 18, 15, 25
09.01.2012
Prof. Dr. Andreas Schmietendorf
40
POSTORDER - LRW
Ausgabereihenfolge: 2, 9, 7, 6, 15, 25, 18, 12
09.01.2012
Prof. Dr. Andreas Schmietendorf
41
Balancierter binärer Suchbaum
(AVL-Baum)
09.01.2012
Prof. Dr. Andreas Schmietendorf
42
AVL-Bäume
§ Wachsender Aufwand zur Suche eines Elementes in einem
Suchbaum mit zunehmender Tiefe T des gefundenen Knoten.
- Bei einem Suchbaum mit 1000 Knoten können bis zu 1000 Vergleiche
benötigt werden!
- Bei Speicherung der Daten in einem „gut“ balancierten Baum könnten
jedoch maximal 10 Vergleiche zum Auffinden des gesuchten Elements
ausreichen! à O(log n)
à Ziel: Vermeidung schlecht balancierter Bäume (Ursachen liegen in
Einfüge- und Löschoperationen begründet)
- Bedarf einer Reorganisation der Baumstruktur nach Einfüge- und
Löschoperationen. Rebalancierung durch Rotation bzw. Doppelrotation
- Problem des mit der Reorganisation verbundenen Aufwandes, weshalb
man sich mit einer schwächeren Form (den so genannten AVL-Bäumen)
der Balance begnügt.
09.01.2012
Prof. Dr. Andreas Schmietendorf
43
AVL-Bäume
AVL-Baum nach Adelson-Velsky und Landis - 1962:
Ein binärer Suchbaum ist ein AVL-Baum, wenn für jeden Knoten
Folgendes gilt:
Die Tiefen des linken und rechten Teilbaums unterscheiden sich
höchstens um 1.
A
G
E
D
09.01.2012
F
B
F
B
C
A
C
AVL-Baum
Prof. Dr. Andreas Schmietendorf
E
D
kein AVL-Baum
44
Animation binärer Suchbäume
Quelle: http://www.cs.umd.edu/class/spring2002/cmsc420-0401/demo/avltree/
09.01.2012
Prof. Dr. Andreas Schmietendorf
45
Animation binärer Suchbäume
Quelle: http://fbim.fh-regensburg.de/~saj39122/bruhi
09.01.2012
Prof. Dr. Andreas Schmietendorf
46
Animation binärer Suchbäume
Quelle: http://alfi.ira.uka.de/lehre/sommer2002/AVLTreeApplet/avl.html
09.01.2012
Prof. Dr. Andreas Schmietendorf
47
Übung – AVL-Bäume
§ Führen Sie die Animation eines binären Suchbaums mit Hilfe der
vorgegebenen Lösungen im Internet aus.
- Bauen Sie einen Binärbaum mit folgenden Knoten auf (Papier und
anschließend Simulation): 5, 3, 8, 4, 1, 10
- Bauen Sie einen Binärbaum mit folgenden Knoten auf (Papier und
anschließend Simulation): 5, 3, 1, 4, 8, 10
- Beobachten Sie die Auswirkungen des AVL-Verhaltens und vergleichen
Sie den Prozess zum Aufbau beider Binärbäume
§ Optional: Welche 4 Möglichkeiten der Rotation von Binärbäumen
werden zur Gewährleistung des AVL-Verhaltens benötigt?
§ Optional: Welche Information müssen Knoten eines AVL-Baums
enthalten, um benötigte Rotationen auszulösen?
09.01.2012
Prof. Dr. Andreas Schmietendorf
48
Herunterladen