1. Laufzeitanalyse & Mathematische Grundlagen

  • Asymptotische Notation
    • Definitionen von  (Obere Schranke),  (Untere Schranke) und  (Exakte Schranke).
    • Verständnis, dass Konstanten bei -Notation wegfallen.
    • Wachstum von Logarithmen:
      • Basiswechsel verändert die Komplexitätklasse nicht (konstanter Faktor).
      • Achtung bei Exponenten im Logarithmus (z.B.  ist ).
    • Stirling-Formel: Näherung für .
  • Rekursion & Master Theorem
    • Auflösen von Rekursionen der Form .
    • Die 3 Fälle des Master Theorems (abhängig vom Verhältnis  zu ).
    • Herleitung der Laufzeit durch rekursives Einsetzen (warum  zu  führt).
  • Beweistechniken
    • Invariante: Aussage, die vor und nach jeder Iteration einer Schleife wahr bleibt (z.B. bei Sortieralgorithmen).
    • Untere Schranke für vergleichsbasiertes Suchen/Sortieren:
      • Entscheidungsbaum-Modell (Höhe des Baumes = Anzahl Vergleiche).
      • Beweis, dass Suchen  und Sortieren  benötigt.

2. Suchen & Sortieren

  • Suchalgorithmen
    • Linear Search: .
    • Binary Search: Auf sortierten Arrays, .
      • Anwendung: Index Search in fast sortiertem Array.
    • Star-Suche (Problem): Finden eines “Stars” (kennt niemanden, alle kennen ihn).
      • Ansätze: Naiv (), Rekursiv, Optimiert ( Fragen).
    • Maximum Subarray Sum: Finden der größten Summe eines Teilarrays.
      • Varianten: Brute Force ( oder ), Divide & Conquer (), Dynamisch/Kadane ().
  • Sortieralgorithmen
    • Einfache Verfahren ():
      • Bubble Sort, Selection Sort, Insertion Sort.
      • Laufzeiten für Vergleiche vs. Vertauschungen/Bewegungen unterscheiden.
    • Effiziente Verfahren ():
      • Merge Sort: Divide & Conquer, stabil, benötigt  Zusatzspeicher.
      • Quicksort: Pivot-Wahl, Partitionierung, In-place, Best Case , Worst Case .
      • Heapsort: Basiert auf Max-Heap, In-place, nicht stabil.
      • Bucket Sort: Wenn Wertebereich bekannt,  möglich.

3. Datenstrukturen

  • Vergleichstabelle: Laufzeiten für Insert, Get, Delete bei Array, Listen (1-fach/2-fach), Heaps, Suchbäumen.
  • Heap (Vorzugsweiseschlange/Priority Queue)
    • Struktur (Binärbaum im Array), Max-Heap vs. Min-Heap Eigenschaft.
    • Operationen: InsertExtractMax/MinHeapify (Array zu Heap in ), DecreaseKey.
    • Index-Berechnung: Kinder von  sind bei  und .
  • Union-Find (Disjoint Set)
    • Verwaltung von disjunkten Mengen (z.B. für Kruskal MST).
    • Operationen: makefind (same), union.
    • Laufzeit: Amortisiert fast konstant  bzw. mit Pfadkompression noch schneller.
  • Graphendarstellung
    • Adjazenzmatrix: Gut für dichte Graphen, Kanten-Test , Speicher .
    • Adjazenzliste: Gut für dünne Graphen, Speicher , Nachfolger iterieren effizient.

4. Graphentheorie Grundlagen

  • Begriffe: Vertex (Knoten), Edge (Kante), Grad (Degree), Pfad (keine Wdh. Knoten), Weg (Walk), Zyklus (Kreis), Zusammenhangskomponente.
  • Spezielle Graphen/Wege:
    • Eulerweg/Zyklus: Jede Kante genau einmal. Existiert  alle Knotengrade gerade (Zyklus) oder max. 2 ungerade (Weg). Laufzeit .
    • Hamiltonpfad/Kreis: Jeder Knoten genau einmal. NP-schwer (polynomiell unmöglich).
    • Bipartite Graphen: 2-färbbar, keine Zyklen ungerader Länge.
    • Bäume: Zusammenhängend & kreisfrei.  / .
  • Gerichtete Graphen:
    • Topologische Sortierung (nur bei DAG - Directed Acyclic Graph).
    • Quellen (in-degree 0) und Senken (out-degree 0).

5. Graphenalgorithmen (Traversierung & Pfade)

  • Breitensuche (BFS)
    • Verwendung: Kürzeste Wege in ungewichteten Graphen, Bipartition-Test, Zusammenhang prüfen.
    • Datenstruktur: Queue (FIFO).
    • Laufzeit: .
  • Tiefensuche (DFS)
    • Verwendung: Topologische Sortierung, Zykluserkennung, Zusammenhangskomponenten.
    • Datenstruktur: Stack (LIFO) oder Rekursion.
    • Pre- & Post-Order: Wichtig für Topologische Sortierung (umgekehrte Post-Order).
    • Kantenklassifizierung: Tree edges, Forward edges, Back edges (Indikator für Zyklus!), Cross edges.
  • Kürzeste Wege (Gewichtet)
    • Dijkstra:
      • Voraussetzung: Keine negativen Kantengewichte.
      • Funktionsweise: Greedy mit Priority Queue (Relaxation der Kanten).
      • Laufzeit: .
    • Bellman-Ford:
      • Erlaubt negative Kanten, erkennt negative Zyklen.
      • Funktionsweise:  Runden Relaxation aller Kanten..
      • Laufzeit: .

6. Minimale Spannbäume (MST)

  • Konzepte:
    • Schnittprinzip (Cut Property): Die leichteste Kante, die aus einem Schnitt (Subset) herausführt, ist sicher im MST.
    • Unterschied zu kürzesten Wegen (Dijkstra).
  • Algorithmen:
    • Kruskal: Sortiert Kanten aufsteigend, fügt hinzu, wenn kein Zyklus entsteht (nutzt Union-Find). Laufzeit .
    • Prim: Wächst von einem Startknoten aus (wie Dijkstra, aber Distanz ist nur Kantenlänge, nicht Pfadsumme). Laufzeit .
    • Boruvka: Verbindet Zusammenhangskomponenten, indem für jede ZHK die billigste ausgehende Kante gewählt wird. Halbiert Anzahl ZHKs pro Runde. Laufzeit .

7. Dynamische Programmierung (DP)

  • Das 5-Schritte-Schema:
    1. Dimension/Parametrisierung definieren.
    2. Teilproblem definieren (-Tabelle Bedeutung).
    3. Rekursionsformel (Übergang) aufstellen.
    4. Berechnungsreihenfolge & Base Case festlegen.
    5. Lösung extrahieren und Laufzeit bestimmen.
  • Konzepte: Memoization vs. Bottom-Up, Rückverfolgung für Lösungskonstruktion.
  • Wichtige Beispiel-Probleme (Muster kennen!):
    • Jump-Game: Min. Sprünge zum Ziel ( Array).
    • Längste gemeinsame Teilfolge (LCS):  Tabelle, Vergleich von zwei Strings.
    • Editierdistanz: Min. Operationen um Strings umzuwandeln (Einfügen, Löschen, Ersetzen).
    • Teilsummenproblem: Kann Summe  mit gegebenen Zahlen erreicht werden? (Boolesche Tabelle).
    • Ticket Shop / Coffee & Tea: Varianten von Optimierungsproblemen.