- terminiert wenn er nach endlich vielen Schritten zu einem Ende kommt
- determiniert wenn er für die gleiche Eingabe immer die gleiche Ausgabe produziert
==
=!=
≠<
<<=
≤>
>>=
≥!
¬
[], ., ()
i++, i--
++i, --i, !b, +1, -1
(long), new
*, /, %
+, -
<, >, <=, >=
==, !=
&&
||
?:
- Assignment (
=, +=, ...
)
String Character.toString(char c)
String String.valueOf(char c)
In Java ist %
eigentlich der "remainder" operator...
9 % 4 = 1
3 % 4 = 3
-9 % 4 = -1
-9 mod 4
sollte eigentlich3
sein...
for (Object o: objectArray) {...}
Rest ist trivial. ∎
Math.random()
↦ double ∈ [0,1)
int[] integerArray = new int[10];
int[] integerArray = new int[]{1, 2, 3};
integerArray[0] = 3;
Bei der Übergabe eines Arrays als Parameter einer Funktion wird ein Pointer zu diesem Array übergeben und nicht eine Kopie dieses Arrays.
O(1) < O(log n) < O(√n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!) < O(nⁿ)
Dieses Mechanismus wird standardmäßig von Java verwendet. Dabei wird bei einem Funktionsaufruf von jedem Parameter eine Kopie erzeugt, die in der Funktion sichtbar ist. Ändern dieses Parameters innerhalb der Funktion hat keine Auswirkungen auf den Wert außerhalb der Funktion.
Achtung: Anderes Verhalten bei Arrays und Objekten.
Hierbei wird ein Pointer auf den jeweiligen Parameter übergeben. Zugriffe darauf innerhalb der Funktion greifen auf den gleichen Speicherbereich zu wie Zugriffe von außerhalb der Funktion.
Wenn bereits verstanden: Gut.
Wenn nicht: Siehe "Rekursion".
Rekursiver Aufruf am Anfang der Funktion.
static String headRekursion(int i) {
if (i == 0) return "";
return headRekursion(i - 1) + i;
}
Rückgabe: 12345
Rekursiver Aufruf am Ende der Funktion.
static String tailRekursion(int i) {
return tailRekursion(i, "");
}
static String tailRekursion(int i, String s) {
if (i == 0) return s;
return tailRekursion(i - 1, s + i);
}
Rückgabe: 54321
Iterieren über die gesamte Datenmenge bis das gewümschte Element gefunden wurde
Bei sortierten Datenmengen kann der Suchbereich schnell eingeschränkt werden, da der Suchbereich durch Vergleich mit dem mittleren Element bei jeder Iteration halbiert wird.
Prinzip des Aufteilens eines Problems in viele kleinere Teilprobleme ("divide") und späteres Zusammenfügen der Lösungen zu einer Gesamtlösung ("conquer")
Tauschen eines Elements mit dem nachfolgendem, sodass diese beiden Elemente in richtiger Reihenfolge stehen. Dies wird über die Ganze Liste ausgeführt und dann wiederholt bis die Menge sortiert ist. Dies hat den Effekt dass in der ersten Iteration das größte Element "zum Ende der Liste aufsteigt" wie eine Luftblase, bei der Zweiten Iteration das Zweitgrößte und so weiter.
Laufzeit: O(n)-O(n²)
Abwechselndes Ausführen von Bubblesort in alternierende Richtungen
In jeder Iteration wird das erste unsortierte Element an der richtigen Stelle im sortierten Bereich eingefügt.
Das entspricht dem manuellen Sortieren von Spielkarten bei enem Kartenspiel.
In jeder Iteration wird das kleinste unsortierte Element gewählt und an das Ende des sortierten Bereichs getauscht.
"Hard Split Easy Join"
- Wählen eines Pivot-Elements
p
(üblicherweise das letzte Element der Liste) - Tauschen des Elements
e > p
an linkester Stelle mit dem Elementf <= p
an rechtester Stelle - Wiederholen von
2
bis alle Elemente<= p
links von allen Elementen> p
sind - Ansführen von Quicksort auf den Bereich
<= p
- Ausführen von Quicksort auf den Bereich
> p
- Einsortieren von
p
zwischen beide Bereiche
Einordnen der Elemente in einen Binärbaum sodass der parent
node immer größer als beide child
nodes ist
- Element wird am Ende des heaps ("rechts unten", Ebenen vollständig füllen) eingefügt
heapify()
Solange child > parent
: Tauschen von child
mit parent
node
- Entnehmen des Wurzelknotens
- Ersetzen der Wurzel mit letztem node im heap
heapify()
"Easy Split Hard Join"
- Aufteilen der Menge in 2 Hälften
- Anwenden von Mergesort auf beide Hälften
- Zusamenfügen beider sortierten Hälften
Ein Sortieralgorithmus ist stabil, wenn Elemente mit gleichem Suchschlüssel nicht getauscht werden und in gleicher Anordnung wie vor dem Sortieren bleiben.
Algorithmus | Best Case | Average | Worst Case |
---|---|---|---|
Insertionsort | O(n) | O(n²) | O(n²) |
Selectionsort | O(n²) | O(n²) | O(n²) |
Bubblesort | O(n) | O(n²) | O(n²) |
Quicksort | O(n log n) | O(n log n) | O(n²) |
Mergesort | O(n log n) | O(n log n) | O(n log n) |
Heapsort | O(n log n) | O(n log n) | O(n log n) |
Lösen eines Problems in Schritten. Sobald keine Lösung mehr möglich ist, wird zum letzten Schritt zurückgekehrt, an dem eine Entscheidung anders getroffen werden kann. Somit werden viele Wege zur Lösung probiert bis eine Lösung gefunden wird. Diese Lösung ist im Allgemeinen nicht die einzige oder beste Lösung.
public
- Zugriff von überall möglich
package
- Zugriff nur aus dem gleichen package möglich
protected
- Zugriff nur aus der eigenen Klasse und aus von der Klasse erbenden Unterklassen möglich
private
- Zugriff nur aus der eigenen Klasse möglich
Jedes Element der Liste enthält neben den Daten einen Zeiger auf das jeweils nächste Element. Die Liste besteht im Wesentlichen nur aus einem Zeiger auf das erste Element der Liste. Es kann sinnvoll sein, auch die aktuelle Länge oder einen Zeiger auf das aktuell letzte Element zu speichern.
Bei der Ringliste zeigt das "letzte" Element wieder auf das erste. Die Ringliste enthält daher nur einen Zeiger auf ein beliebiges Element der Liste.
Die doubly linked list erweitert das Element aus der single linked list um einen Zeiger auf das jeweils vorherige Element.
Ein Node des Baumes zeigt auf maximal 2 Child-Nodes.
Reihenfolge: this
, left
, right
Analog: "links vorbei"
Reihenfolge: left
, this
, right
Analog: "unten durch"
Reihenfolge: left
, right
, this
Analog: "rechts vorbei"
Ein Sortierter Baum wird dadurch erzeugt, dass Elemente abhängig von einem Wert im Baum einsortiert werden. Beispiel: Das kleinere Element wird links einsortiert.
Klassen können von maximal einer anderen Klasse oder abstrakten Klasse erben. Dabei werden Parameter und Methoden übernommen. Zugriff auf public
oder protected
Member der Oberklasse möglich, Zugriff auf private
Member nicht möglich.
- Kann nicht instanziiert werden
- Kann nicht static deklariert werden
- Kann nicht abstrakte Methoden enthalten
- Kann nicht final deklariert werden
- Definiert nur Signatur
- Muss in Unterklassen überschrieben werden
- Können wie Datentypen verwendet werden
- Kann nicht instanziiert werden
- Vererbung wie bei Klassen Möglich
- Kann nicht static deklariert werden
- Kann nicht final deklariert werden
So Klassen Diagramme malen und hoffen dass man evtl dem Standard entspricht...
First In, Last Out
First In, First Out