(Suchen und Sortieren)

Suchalgorithmen

  • Linear Search (jedes Element einmal anschauen)

    • Laufzeit:
  • Binary Search (wenn sortiert)

    • Rekursiv, Liste halbieren, schauen, ob die Mitte das gesuchte Element ist. Wenn nein, dann schauen ob die Mitte größer oder kleiner als das gesuchte Element ist und dementsprechend alles von vorne mit nur der linken/rechten Seite.
    • Laufzeit

Jedes vergleichsbasierte Suchen braucht im schlechtesten Fall Vergleiche. Beweis, vergleichsbasiertes Suchen in log(n)

Für vergleichsbasiertes Sortieren ist es .

Warum folgt aus eine Laufzeit von ?

| Konstanten irrelevant

Entscheidungsbaum (Binärbaum)
  • Jeder Knoten ist ein Vergleich
  • jeder Knoten hat höchstens zwei Kinder, ja oder nein
  • Ganz oben “Wurzel”
  • Unteste Ebene: “Blätter” sind Rückgabewerte
  • Gesamtzahl der Blätter mindestens (jeder Outcome + nicht gefunden)
  • Anzahl der Vergleiche im schlechtesten Fall ist die Höhe des Baumes
  • Entscheidungsbaum mit Tiefe h, hat eine Anzahl von Blättern > n!, die maximale Anzahl an Blättern ist . Also gilt . Tiefe des Binärbaumes ist log die Anzahl der Knoten.

Sortieralgorithmen, Einführung

  • Bubble Sort

    • Wenn das Element größer als das darauffolgende ist, werden die beiden getauscht.
    • Nach einer Iteration ist also das größte Element ganz hinten.
    • Laufzeit
  • Selection Sort

    • größtes Element ans Ende, indem mit Element an richtiger Stelle getauscht (oder kleinstes Element an den Anfang)
    • Vertauschungen , aber Vergleiche
    • Also Laufzeit
  • Insertion Sort

    • jedes neue Element von rechts an die richtige Stelle im sortierten Array ganz links einfügen
    • Invariante: : nach Iterationen ist das Teilarray (also die ersten Elemente) sortiert. Das heißt nicht, dass sie an der richtigen Stelle sind (aber sie sind halt sortiert).
    • Vergleiche: Wir nehmen ein neues Element und suchen die richtige Stelle im sortierten Teilarray, um es einzusetzen. Da Binary Search in läuft, und wir hier alle Elemente außer das erste einmal einsortieren müssen, haben wir .
    • Vertauschungen: Sagen wir, das Array ist verkehrt sortiert, z.B. , dann wird im ersten Schritt 4 in das sortierte Teilarray hinzugefügt, und 5 muss 1 nach rechts verschoben werden. Dann kommt 3, und 4 und 5 müssen jew. 1 nach rechts verschoben werden, etc. Am Ende haben wir also Vertauschungen. Also:
    • Vergleiche , aber immer noch Vertauschungen
    • Also Laufzeit
  • Merge Sort

    • teile immer wieder in Hälften, sortiere rekursiv und kombiniere (divide and conquer)
    • Achtung, extra Space (Hilfsarray)
    • Rekursives Mergesort ist , das wird zwei mal ausgeführt (da links und rechts), also , und Merge ist in . Mit dem Master Theorem kommen wir zur Laufzeit.
  • Quicksort

  • Heap Sort

  • Bucket Sort

    • Bedingung: wir müssen die Anzahl der Buckets wissen
    • schreibe die Buckets sortiert auf
    • notiere in jedem Bucket wie oft das Element im Array vorkommt
    • gehe von links nach rechts alle Buckets durch

Übersicht

AlgorithmusVergleicheBewegungenExtr. PlatzLokalität
Bubble-Sortgut
Selection-Sortgut
Insertion-Sortgut
Mergesortgut
Quicksort (best/avg), (worst)gut
Heap-Sortschlecht

Achtung, bspw. die Laufzeit von Mergesort ist ja auch in

Was ist die Invariante?

Invariante