Queues:
Spezifikation
Versuch: Queue als zyklisches (lin.)Array:
Lösungsansatz: "zyklisches Array"
Eigenschaften:
(Priority Queue):
Bäume:
Für einen Binärbaum $𝑡𝑡$ der Höhe $ℎ$ gilt:
i. 𝑡 hat maximal 2ℎ+1 − 1 Knoten.
ii. 𝑡 hat mindestens ℎ + 1 Knoten
iii. 𝑡 hat maximal 2ℎ − 1 innere Knoten.
iv. 𝑡 hat maximal 2ℎ Blätter
Beweis durch Induktion (siehe Material)
Baumtraversierung:
Tiefendurchlauf, Preorder/Präfix, Postorder/Postfix, Inorder/Infix, Breitendurchlauf
Infix nur auf BinTree gebräuchlich.
Zusammenfassung:
Analyse des Ressourcenverbrauchs von Algorithmen (Laufzeit, Speicherbedarf) nicht im Detail, sondern als Kopmlexitätsklasse
Dazu O-Notation als obere Schranke
Analyse von Algorithmen geht direkt für einfache Anweisungen und Schleifen
Für rekursive Funktionen schwieriger:
Effektivität
Effizienz
Komplexität
Problem | $T(n)$ |
---|---|
Suchen einer $n$-elementiger Menge | Vergleiche zu durchlaufeneder Knoten |
Sortieren einer $𝑛$-elementigen Liste | Vertauschungen/Vergleiche |
Auswertung einer rekursiven Funktion $𝑓(𝑛)$ | Funktionsaufrufe |
Finden aller Primzahlen bis $𝑛$ | Rechenoperationen |
Matrixmultiplikation $ℝ^𝑚×𝑘 ⋅ ℝ^𝑘×𝑛$ | Skalare Multiplikationen |
üblicherweise Asymptotische Betrachtung
Laufzeiten-Verhalten $T(n)$ für sehr große Eingaben $𝑛 ∈ ℕ$:
Formal:
Informatik: diskrete Eingaben aus ℕ: $𝑂(𝑓 ) = { 𝑔 : ℕ → ℝ ∣ ∃𝑐 > 0: ∃𝑛~0~ > 0: \forall𝑛 ≥ 𝑛~0~: |𝑔(𝑛 )| ≤ 𝑐 ⋅ |𝑓(𝑛)| }$
O-Notation Rechenregeln:
Konstanten:
Skalare Multiplikation:
Addition:
Multiplikation:-
Komplexitätsklassen
sei n die Länge der Eingabe (z.B. Arraylänge/stringl)
Beziehungen zwischen Komplexitätsklassen:
Anwendung auf Algorithmen:
(int i = j+1)
, Vergleiche (if j == 3)..
x = 0; y = 0; z = 0
if(a%2 == 0) a = /2; else a++
switch(n) case: … break
for(int i…){for(int j…){…} }
$\rightarrow O(n) * O(n) = O(n^{2})$Iteration vs. Rekursion
Zusammenfassung Kopmlexität