Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:sortieren:landau_revisited:start [31.01.2022 17:16] – [Die Landau Notation im Detail] sbel | faecher:informatik:oberstufe:algorithmen:sortieren:landau_revisited:start [31.01.2024 15:48] (aktuell) – [Quicksort] Marco Kuemmel | ||
---|---|---|---|
Zeile 22: | Zeile 22: | ||
Eine Besonderheit des Quicksort-Algorithmus ist, dass er Aufwand von der Wahl des Pivotelement abhängt. | Eine Besonderheit des Quicksort-Algorithmus ist, dass er Aufwand von der Wahl des Pivotelement abhängt. | ||
- | Das hast du vielleicht bei deinen Übungen bereits bemerkt: Wenn man das Element stets sehr ungünstig wählt, gewinnt man bei Aufteilen des Problem | + | Das hast du vielleicht bei deinen Übungen bereits bemerkt: Wenn man das Element stets sehr ungünstig wählt, gewinnt man beim Aufteilen des Problems |
<WRAP center round info 95%> | <WRAP center round info 95%> | ||
Zeile 28: | Zeile 28: | ||
</ | </ | ||
- | Aber was bedeutet **Worst Case** und **Avergae | + | Aber was bedeutet **Worst Case** und **Average |
===== Die Landau Notation im Detail ===== | ===== Die Landau Notation im Detail ===== | ||
+ | |||
+ | ==== Faktoren spielen keine Rolle? ==== | ||
+ | |||
Die Landau Notation unterschlägt Konstanten - wenn man schreibt O(n) meint man eigentlich O(c*n). Das kann man sich am Beispiel eine Methode klar machen, die die Elemente eines Arrays ausgibt: | Die Landau Notation unterschlägt Konstanten - wenn man schreibt O(n) meint man eigentlich O(c*n). Das kann man sich am Beispiel eine Methode klar machen, die die Elemente eines Arrays ausgibt: | ||
Zeile 54: | Zeile 57: | ||
Darf man das? | Darf man das? | ||
+ | |||
+ | ==== Suchvergleich mit Faktoren ==== | ||
+ | |||
Dazu vergleichen wir nochmal gedanklich die **einfache Suche** und die **binäre Suche** und ergänzen die Laufzeiten mit realen Zeitfaktoren: | Dazu vergleichen wir nochmal gedanklich die **einfache Suche** und die **binäre Suche** und ergänzen die Laufzeiten mit realen Zeitfaktoren: | ||
Zeile 79: | Zeile 85: | ||
++++ | ++++ | ||
+ | <WRAP center round important 95%> | ||
+ | Wenn die **Anzahl der Elemente veränderlich** ist, spielen Faktoren bei der Landau Notation keine Rolle. Jeder Vorteil eines Faktors wird bei einem Algorithmus mit besserer Laufzeit bei genügend großer Anzahl der Elemente wieder eingeholt. | ||
+ | </ | ||
+ | ==== Faktoren spielen doch eine Rolle? ==== | ||
+ | Manchmal spielen Faktoren aber eben doch eine Rollen - nämlich dann, wenn die Anzahl der Elemente beim Vergleich zweier Algorithmen vorgegeben ist. Das ist beispielsweise dann der Fall, wenn wir ein und dasselbe Array mit zwei unterschiedlichen Sortierverfahren sortieren wollen: Wenn die Laufzeit von Quicksort sich in Abhängigkeit des gewählten Pivotelements verändert, spielt der Faktor eine Rolle. | ||
+ | Die Konstante von Quicksort ist kleiner als die von Mergesort. Wenn beide Algorithmen eine Laufzeit von O(n log n) benötigen, ist Quicksort also schneller, wenn sich bei einer festen Anzahl von Elementen aber die Laufzeit von Quicksort hin zu O(n< | ||
+ | ===== Average Case und Worst Case bei Quicksort ===== | ||
+ | |||
+ | Wie oben bereits angedeutet, ist es besonders ungünstig, wenn die Partitionireung bei Quicksort immer so ausfällt, dass das größte zu sortierende " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ==== Worst Case ==== | ||
+ | |||
+ | |||
+ | Wenn man den Sortiervorgang nachvollzieht, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Auf jeder Ebene des des Call Stacks muss man alle Elemente betrachten um zu partitionieren - unabhängig vom gewählten Pivotelement. Das bedeutet, die Bearbeitung jeder Ebene des Call Stacks benötigt den Aufwand O(n). | ||
+ | |||
+ | Im **Worst Case** haben wir also n Ebenen, die jeweils mit dem Aufwand O(n) bearbeitet werden müssen - im schlechtesten Fall hat Quicksort also die Laufzeit O(n*n) also O(n< | ||
+ | |||
+ | ==== Best Case/ | ||
+ | |||
+ | Wir wählen bei unserem sortierten Beispielarray jetzt immer das mittlere Element als Privotelement und schauen, was dann passiert: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Die Größe des Call Stacks ist hier nur 4 -- oder allgemein (analog zur binären Suche) von der Ordnung '' | ||
+ | |||
+ | Da es aber nur log n Ebenen gibt, ist der Aufwand von Quicksort im Best Case O(n * log n) also O(n log n) | ||
+ | |||
+ | Wenn du immer ein zufälliges Element des Arrays als Pivotelement auswählst, beträgt die Laufzeit von Quicksort auch im | ||
+ | Durchschnitt O(n log n): Der **Average Case** ist der **Best Case**. | ||
+ | ---- | ||
+ | {{: | ||
+ | === (A2) === | ||
+ | Welche Laufzeiten haben die folgenden Operationen? | ||
+ | * Ausgabe der Werte aller Elemente in einem Array. | ||
+ | * Verdoppeln der Werte aller Elemente in einem Array. | ||
+ | * Verdoppeln des Werts des ersten Elements in einem Array. | ||
+ | * Erzeugen einer Multiplikationstabelle mit allen Elementen in einem Array. Es soll jedes Array-Element mit jedem anderen multipliziert werden. |