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?
Einfach verkettete Liste
Modellieren Sie die Klassen und Ihre Beziehungen mit Hilfe eines UML Klassendiagramms.
Implementieren Sie eine generische, einfach verkettete Liste in Java.
Implementieren Sie die Klasse für die Knoten als innere Klasse, der Klasse LinkedList.
Implementieren Sie folgende Methoden: isEmpty(), prepend(..), head() und deleteHead().
Achten Sie darauf, dass Ihr Programm immer aussagekräftige Ausnahmen wirft.
Implementieren Sie die notwendigen Interfaces, um eine foreach Schleife nutzen zu können, um über die Liste zu iterieren.
Doppelt verkettete Liste
Implementieren Sie eine generische, doppelt verkettete Liste in Java. Der generische Typparameter sei T.
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 (am Ende der Liste; d. h. append)
Einfügen eines neuen Wertes (am Anfang der Liste; d. h. prepend)
Löschen eines Wertes (d. h. remove(T value))
Überprüfen ob ein Wert vorhanden ist
eine Funktion (forEachReverse), um von hinten nach vorne durch die Liste zu iterieren