michael.eichberg@dhbw.de, Raum 149B
1.1
Die Spezifikation eines Algorithmus kann erfolgen...
in einer Programmiersprache (z. B. Java, Python)
in einer formalen Sprache (z. B. Z3, Alloy)
in einer natürlichen Sprache (z. B. Deutsch, Englisch)
in einer graphischen Sprache (Diagramme, z. B. UML)
Algorithmus - natürlich sprachlich
Nehme an, das erste Element ist das Maximum
Vergleiche das nächste Element des Arrays mit dem bisherigen Maximum.
Wenn es größer ist, aktualisiere das Maximum auf dieses Element
Wiederhole 2 und 3 bis wir am Ende des Arrays angelangt sind
Algorithmus
1public int max(int[] x) {
2int max = x[0];
3for (int i = 1; i < x.length; i++) {
4if (x[i] > max) {
5max = x[i];
6}
7}
8return max;
9}
Algorithmus
1def max(x):
2max = x[0]
3for i in range(1, len(x)):
4if x[i] > max:
5max = x[i]
6return max
Analyse (aller drei Implementierungen)
hängt direkt von der Anzahl der Elemente ab
eine Variable für das Maximum
ja
ja
Mehrheitselement finden
Schreiben Sie einen Algorithmus, um das Mehrheitselement in einem unsortierten Array von Integer Werten zu finden. Das Mehrheitselement ist das Element, das mehr als \(\lfloor n/2\rfloor \) mal vorkommt. Sie können davon ausgehen, dass das Mehrheitselement immer vorhanden ist.
Wie schnell ist Ihr Algorithmus? Wovon hängt dies maßgeblich ab? (Best- und Worst-Case)
Wie viel Speicherplatz benötigt Ihr Algorithmus?
Doppelt verkettete Liste
Implementieren Sie eine generische, doppelt verkettete Liste in Java.
Orientieren Sie sich ggf. an der Implementierung für eine einfach verkettete Liste.
Implementieren Sie die folgenden Methoden. Bestimmen Sie das worst-case verhalten der Operationen (Laufzeit) in Abhängigkeit von der Anzahl der Elemente N, die bereits in der Liste gespeichert sind.
Einfügen eines neuen Wertes
Löschen eines Wertes
Überprüfen ob ein Wert vorhanden ist
eine Funktion (forEachReverse), um von hinten nach vorne durch die Liste zu iterieren