Informatik II (D-ITET)
Übungsstunde 2
simon.mayer@inf.ethz.ch
Distributed Systems Group, ETH Zürich
Ablauf
Besprechung der Vorlesung
Übungsbezogene Themen: Bäume, Rekursion, Sortieren
Zeit zum Programmieren / für Demos
Ablauf
Besprechung der Vorlesung
Übungsbezogene Themen: Bäume, Rekursion, Sortieren
Zeit zum Programmieren / für Demos
Übung 2
1. Wurzelbäume
Trennung von Struktur und Darstellung
Klammerdarstellung
Darstellung in eingerückter Form
2. Rekursives Sortieren
Ausgabe von Objekten mittels toString()
Rekursiver Sortieralgorithmus
3. Binärbäume als Arrays
Etwas schwierig: toString()
Wichtig: checkTree()
Übung 2 – Aufgaben 1 und 3
Bäume in der Informatik...
vs.
Images:
http://kitabundsunnah.wordpress.com/, http://www.cs.lmu.edu/courses
Übung 2 – Aufgaben 1 und 3
Übersicht: Verschiedene Arten von Bäumen (mit Demos!)
Allgemeiner Baum: Jeder Knoten hat x Kinder
Binärbaum: Jeder Knoten hat maximal 2 Kinder
Binärer/Triärer Suchbaum: Geordnetes Speichern von Knoten
Selbstbalancierender Suchbaum:
Verhindert Baum-Degeneration
(z.B. Rot-Schwarz Baum)
Trie (von «Retrieval»): Nicht Knoteninhalt, sondern
(z.B. Suffixbaum)
Knotenposition ist wichtig
d.h.: Kanten enthalten Information!
Image:
Wikipedia
Durchlaufen von Bäumen...
preOrder(node) {
print(node)
if left != null then preOrder(left)
if right != null then preOrder(right)
}
Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken
8, 3, 1, 6, 4, 7, 10, 14, 13
In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken
Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken
Durchlaufen von Bäumen...
inOrder(node) {
if left != null then preOrder(left)
print(node)
if right != null then preOrder(right)
}
Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken
8, 3, 1, 6, 4, 7, 10, 14, 13
In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken
1, 3, 4, 6, 7, 8, 10, 13, 14
Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken
Durchlaufen von Bäumen...
postOrder(node) {
if left != null then preOrder(left)
if right != null then preOrder(right)
print(node)
}
Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken
8, 3, 1, 6, 4, 7, 10, 14, 13
In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken
1, 3, 4, 6, 7, 8, 10, 13, 14
Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken
1, 4, 7, 6, 3, 10, 13, 14, 8
Übung 2 – Aufgabe 3
Speichern von Binaerbaeumen als Arrays
[ 2 4 1 6 _ 3 4 9 5 4 ]
Geht das auch mit allgemeinen (=nicht-binaeren) Baeumen?
Ueberpruefung der «Baumeigenschaft» eines Arrays:
[ 2 _ 1 6 _ 3 4 9 5 4 ] ist kein Baum!
Warum?
Wie stellt man das programmatisch fest?
Übung 2 – Aufgabe 2
Kernidee der Rekursion:
Reduzieren einer Probleminstanz
auf eine kleinere Probleminstanz.
Gegeben:
Um eine
brauche
...
...
...
Liste mit n Elementen
Teilliste mit i Elementen absteigend zu sortieren,
ich nur...
die ersten (i – 1) Elemente absteigend sortieren
das grösste Element im Rest der Liste suchen
und an die erste Stelle des Restes der Liste setzen
Die leere Liste ist selbstverständlich schon sortiert... ;-)
[
[
[
[
[
[
[
[
[
[
[
[
[
5
5
5
5
5
5
5
9
9
9
9
9
9
1
1
1
1
1
1
1
1
1
5
5
5
5
9
9
9
9
9
9
9
5
5
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
1
1
]
]
]
]
]
]
]
]
]
]
]
]
]
recursiveSort(4)
recursiveSort(3)
recursiveSort(2)
recursiveSort(1)
recursiveSort(0)
Ist sortiert!
2 <- findLargest(0,3)
swap(0,2)
2 <- findLargest(1,3)
swap(1,2)
3 <- findLargest(2,3)
swap(2,3)
Kein swap mehr noetig...
Liste absteigend sortiert!
Zufallszahlengeneratoren
Random rng = new Random(System.currentTimeMillis());
rng.nextInt(555);
Ablauf
Besprechung der Vorlesung
Übungsbezogene Themen: Bäume, Rekursion, Sortieren
Zeit zum Programmieren / für Demos
Projekt: Bäume und Rekursion
Idee: Um eine Liste von Zahlen zu sortieren, könnten wir sie in einen
binären Suchbaum einfügen und dann in-order auslesen...
Archiv mit Programmgerüst habt ihr im Posteingang...
Eingeführte Java Konzepte:
Interfaces: Kurzeinführung
Generics: java.util.List, java.util.ArrayList
Informatik II (D-ITET)
Übungsstunde 2
simon.mayer@inf.ethz.ch
Distributed Systems Group, ETH Zürich