Informatik II – Übung 2 Gruppe 3

Werbung
Informatik II – Übung 2
Gruppe 3
Leyna Sadamori
[email protected]
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
1
Debriefing
Übung 1
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
2
Lösung U1.A1
f(a,b) = a ∙ b =
a) Induktionsbeweis über a möglich?
Induktion über a ist nicht möglich.
Der Induktionsanfang schlägt bereits für b > 1 fehl!
a ist eine stetig wachsende Grösse à kein Rückschluss auf bereits
bewiesene Fälle möglich und keine Induktionsannahme formulierbar.
b) Terminiert der Algorithmus?
Ja, wenn man b auf 1 zurückführen kann
Ist das der Fall?
Ja! Weil b immer halbiert wird gilt: Nach ⎣log2(b)⎦ Schritten wird b = 1 sein!
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
3
Lösung U1.A1
c) Wie ändert sich der Beweis, wenn der kleinste Fall b = 0 ist?
Die Definition der Funktion sieht wie folgt aus:
f(a,b) = a ∙ b =
Die Induktionsannahme lautet dann:
Der Induktionsschritt ist ähnlich wie im Original, da
Die Ganzzahldivision von 1 durch 2 ergibt 0. In 1b) haben wir gezeigt, dass es
immer zu b = 1 kommt, also kommt es auch immer zu b = 0. Wir müssen den
Beweis also im wesentlichen nicht ändern.
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
4
Lösung U1.A2a
Anzahl rekursive Aufrufe (+1, wenn man den ursprünglichen Aufruf mitzählt):
static boolean gerade(int x) {
if (x == 0) return true;
return !gerade(x-1);
}
x (oder x+1)
static int verdopple(int x) {
if ( x == 0 ) return 0;
return 2 + verdopple(x-1);
}
x (oder x+1)
static int halbiere(int x) {
if (x == 0) return 0;
if (x == 1) return 0;
return 1 + halbiere(x-2);
}
⎣x/2⎦ (oder ⎣x/2⎦+1)
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
5
Lösung U1.A2b
Aufrufe der drei Methoden insgesamt in Abhängigkeit von a und b bei einem
Aufruf von f.
static int f(int a, int b) {
if (b == 0) return 0;
if (gerade(b))
return f(verdopple(a), halbiere(b));
return a + f(verdopple(a), halbiere(b));
}
In jedem Fall wird gerade(b), verdopple(a) und halbiere(b) aufgerufen.
Der Anzahl der Aufrufe (mit Ergebnissen aus Teil 2a) ist also höchstens:
b+1 + a+1 + ⎣b/2⎦+1 ≈ a + 3b/2 + 3
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
6
Lösung U1.A2c
Gesamtanzahl der Methodenaufrufe:
Es ist nicht (# Aufrufe von f) * (# Aufrufe von Teil 2b)!
Mit dem Ergebnis aus 2b) ergibt sich:
1. Aufruf + 2. Aufruf + …
… insgesamt k Aufrufe
Die Rekursion endet, wenn b = 0 ist. Das ist der Fall nach k = ⎣log2 b⎦ + 1
Aufrufen, da b in jedem Schritt halbiert wird. Dies ergibt ≈ 2ab - a + 3b
(s. Rechenweg in Übungsstunde).
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
7
Lösung U1.A3
public class Mult {
private static int f(int a, int b) {
if (b == 1) return a;
if (b%2 == 0) return f(2*a, b/2);
else return a + f(2*a, b/2);
}
/**
* This function implements the ancient Egyptian multiplication.
*
* @param a must be a positive integer
* @param b must be a positive integer
* @return the product of a and b
* @throws IllegalArgumentException if a or b is not positive
*/
public static int mult(int a, int b) throws IllegalArgumentException {
if (a < 1)
throw new IllegalArgumentException("Parameter a must be a positive integer but is " + a);
if (b < 1)
throw new IllegalArgumentException("Parameter b must be a positive integer but is " + b);
return f(a, b);
}
}
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
8
Theorie, Praxis, Tipps
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 |
9
Debugging in Eclipse
§ Breakpoints setzen
§ Step over, Step into, Resume
§ Values, Expressions
§ Conditional Breakpoints
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 10
Briefing
Übung 2
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 11
Hinweise U2.A1 Darstellung
§ Aufgabe:
§ Umgang mit verschiedenen Darstellungen
§ Klammerdarstellung, eingerückte Form, Graphen
§ Begriffe:
§ Wurzel, Knoten, Kanten, Blätter, (leere) Teilbäume...
A
B
C
Informatik II – Übung 2
E
D
Leyna Sadamori | 8. März 2017 | 12
Hinweise U2.A2 Sortieren
§
§
Beachtet die Kommentare im bereitgestellten Sourcecode!
Verwendung von java.util.Random: Java API konsultieren
§ (http://docs.oracle.com/javase/8/docs/api/)
// RandomGenerator erzeugen:
Random rg = new Random();
// Array erzeugen
…
// random number generieren
rg.nextInt(1000);
§
toString() (Format ist im Javadoc beschrieben)
String s = "";
for ( int i = 0; i < array.length; i++ ) {
...
}
return s;
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 13
Hinweise U2.A2 Sortieren
§ Grundidee der Rekursion:
§ Reduzieren einer Probleminstanz auf eine kleinere Probleminstanz
§ Gegeben:
Liste mit n Elementen
Um eine Teilliste mit i Elementen absteigend zu sortieren,
brauche 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...
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 14
[
[
[
[
[
[
[
[
[
[
[
[
[
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(0,3)
recursiveSort(0,2)
recursiveSort(0,1)
recursiveSort(0,0)
recursiveSort(0,-1)
Ist sortiert!
findLargest(0,3) -> 9
Swap(0,2)
findLargest(1,3) -> 5
Swap(1,2)
findLargest(2,3) -> 2
Swap(2,3)
Kein swap mehr nötig...
à Liste absteigend sortiert!
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 15
Hinweise U2.A3 Binärbaum als Array
§ Binärbäume kann man leicht in einem Array speichern,
wenn dieses geeignet interpretiert wird.
char[] tree = new char[7];
A
B
D
tree[0] = ’A’;
tree[1] = ’B’;
tree[2] = ’C’;
tree[3] = ’D’;
tree[4] = ’ ’;
tree[5] = ’F’;
tree[6] = ’E’;
C
F
E
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 16
Hinweise U2.A3
§ Wichtige Überlegungen
§ Jeder Knoten erhält einen eindeutigen Index i im Array
§ Die Wurzel hat den Index 0
§ Wie berechnet man die Indizes der Kindknoten eines Knotens mit
Index i?
§ Wie berechnet man den Index des Vaterknotens eines Knotens mit
Index i?
§ Wie berechnet man die Ebene für einen Knoten mit Index i?
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 17
Hinweise U2.A3
§ Überprüfung auf Korrektheit
§ Jeder gültige Knoten muss einen Vaterknoten haben (ausser
Wurzel)
§ Wie werden “leere” Knoten behandelt?
§ toString() Implementierung
§ Rekursive Implementierung (Ausgabe von Teilbäumen)
§ Idee: Gebe aktuellen Knoten aus, danach linken und rechten
Teilbaum. Abbruchkriterium?
§ Anzahl Einrückungen berechnen (s. vorherige Überlegungen)
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 18
…viel Spass!
Informatik II – Übung 2
Leyna Sadamori | 8. März 2017 | 19
Herunterladen