Behandelte Sortieralgorithmen Algorithmen und Datenstrukturen 7. Vorlesung • insertion-sort(A[1..n]) mit worst-case und average-case Laufzeit O(n2) Karl-Heinz Niggl • merge-sort(A, p, r) mit worst-case Laufzeit O(n · log n), n := r − p + 1 die Anzahl der zu sortierenden Elemente 16. Mai 2006 • heap-sort(A[1..n]) mit worst-case Laufzeit O(n · log n), basierend auf der Datenstruktur Heap Heute: • Datenstruktur Priority Queue (Vorrangswarteschlange) • quicksort(A[1..n]) mit Laufzeit O(n2) im worst-case, aber O(n · log n) im average-case FG KTuEA, TU Ilmenau AuD – 16.5.2006 FG KTuEA, TU Ilmenau AuD – 16.5.2006 1 Erinnerung an die Datenstruktur Heap – 1 Erinnerung an die Datenstruktur Heap – 2 Ein Max-Heap ist ein Array A[1..len(A)] mit Einträgen aus einer totalen Ordnung (U, ≤) und Attribut heap-size(A) =: n, so daß für j = 2, . . . , n gilt: Ein Binärbaum T mit Knotenbeschriftungen l(v) aus (U, ≤) heißt max-heapgeordnet, falls für je zwei Knoten v, v ′ gilt: v ist Vater von v ′ =⇒ l(v) ≥ l(v ′) A[parent(j)] ≥ A[j] Ein Binärbaum T der Tiefe d heißt linksvollständig, falls alle Schichten i ≤ d vollständig aufgefüllt sind, bis auf eventuell Schicht d; diese ist von links her aufgefüllt. oder explizit ausgedrückt: 1 ≤ left(i) ≤ n =⇒ A[i] ≥ A[left(i)] 1 ≤ right(i) ≤ n =⇒ A[i] ≥ A[right(i)] Gesehen: Jeder n-elementige Max-Heap A entspricht genau einem max-heapgeordneten, linksvollständigen Binärbaum TA der Tiefe (Höhe) ⌊log n⌋. Dabei: • parent(i) := ⌊i/2⌋ • left(i) := 2i und right(i) := 2i + 1 FG KTuEA, TU Ilmenau AuD – 16.5.2006 2 FG KTuEA, TU Ilmenau AuD – 16.5.2006 3 Erinnerung an die Datenstruktur Heap – 3 Erinnerung an heap-sort – 1 Bsp. Max-Heap als Binärbaum und als Array Zentral in max-heapsort ist die Prozedur max-heapify(A, i). Eingabe: Ein Array A und ein Index i, so daß die zugehörigen (binären) Teilbäume mit Wurzel left(i) bzw. right(i) maxheapgeordnet sind, aber die Max-Heap-Eigenschaft A[i] ≥ A[left(i)], A[right(i)] eventuell verletzt ist. 1 16 2 14 4 8 8 9 10 2 4 1 1 2 3 4 3 5 6 7 9 10 7 3 Ausgabe: Array A, so daß der zugehörige Teilbaum mit Wurzel i max-heapgeordnet ist. 5 6 7 8 9 10 Idee: Vertausche rekursiv A[i] mit Maximum von A[left(i)] und A[right(i)], bis Max-Heap-Eigenschaft erfüllt ist. 16 14 10 8 7 9 3 2 4 1 =⇒ worst-case Laufzeit O(log n) FG KTuEA, TU Ilmenau AuD – 16.5.2006 4 FG KTuEA, TU Ilmenau Erinnerung an heap-sort – 2 Insgesamt ergibt dies: Wissen: Die Elemente mit Indizes ⌊n/2⌋+1, ⌊n/2⌋+2, . . . , n sind genau die Blätter des gesuchten n-elementigen Heaps A. Diese bilden die Basis für build-max-heap. Die restlichen Elemente werden mittels max-heapify in A einsortiert. 2: 3: 4: 2: 3: 4: 6: procedure max-heapsort(A) build-max-heap(A) for i ← len(A) downto 2 do Vertausche A[1] mit A[i] heap-size(A) ← heap-size(A) − 1 max-heapify(A, 1) Laufzeit: O(n·log n) Denn: build-max-heap(A) benötigt Zeit O(n) und jeder der n − 1 Aufrufe von max-heapify(A, 1) benötigt Zeit O(log n). Laufzeit: O(n) AuD – 16.5.2006 1: 5: procedure build-max-heap(A) heap-size(A) ← len(A) for i ← ⌊len(A)/2⌋ downto 1 do max-heapify(A, i) FG KTuEA, TU Ilmenau 5 Erinnerung an heap-sort – 3 Weiterer Baustein: Prozedur build-max-heap(A) 1: AuD – 16.5.2006 6 FG KTuEA, TU Ilmenau AuD – 16.5.2006 7 Priority Queues – 1 Priority Queues – 2 Def. Eine Max-Priority Queue (und analog für Min-Priority Queue) ist eine Datenstruktur zur Verwaltung einer (dynamischen) Menge S, wobei jedem Element x ein Schlüssel key(x) aus (U, ≤) zugeordnet ist (Schlüssel = b Priorität), die folgende Operationen unterstützt: • insert(S, x) fügt das Element x in S ein. • maximum(S) liefert das Element mit größtem Schlüssel. • extract-max(S) liefert und entfernt das Element von S mit größtem Schlüssel. • increase-key(S, x, k) aktualisiert den Schlüssel von Element x mit k, falls k > key(x). FG KTuEA, TU Ilmenau AuD – 16.5.2006 8 Anwendungen: 1) Prozessverwaltung in Multitask-Systemen Jeder Prozess hat einen Namen (eine ID“) und eine Priorität ” (Zahl in N). Üblich: kleinere Zahlen bedeuten höhere Prioritäten. Aktuell ausführbare Prozesse befinden sich in einer Queue. Bei Freiwerden eines Prozessors (z.B. durch Unterbrechen eines Prozesses) wird einer der Prozesse mit höchster Priorität aus der Queue entnommen und weitergeführt. FG KTuEA, TU Ilmenau AuD – 16.5.2006 9 Priority Queues – 3 Priority Queues – 4 2) Discrete Event Simulation“ ” System von Aktionen soll auf dem Rechner simuliert werden. Jeder Aktion A ist ein Zeitpunkt tA ∈ [0, ∞) zugeordnet. Vereinfachungen: 1) Die zugrundeliegende Schlüsselmenge ist N. 2) Wir identifizieren die eigentlichen Datenelemente mit ihren Schlüsseln. Die Ausführung eines A kann neue Aktionen A′ erzeugen oder ausführbar machen, mit neuen Zeitpunkten tA′ > tA. Ein Schritt: Wähle diejenige noch nicht ausgeführte Aktion mit dem frühesten Ausführungszeitpunkt und führe sie aus. 3) Behandeln (o.E.) nur Datenstruktur Max-Priority Queue. Diese kann mittels Datenstruktur Heap effizient implementiert werden: Die Prozedur heap-maximum(A) implementiert die Operation maximum in konstanter Zeit Θ(1). 1: 3) Innerhalb von Algorithmen (Beispiele später). 2: FG KTuEA, TU Ilmenau AuD – 16.5.2006 10 procedure heap-maximum(A) return A[1] FG KTuEA, TU Ilmenau AuD – 16.5.2006 11 Priority Queues – 5 Priority Queues – 6 Die Prozedur heap-extract-max(A) implementiert die Operation extract-max in Zeit O(log n). Die Prozedur heap-increase-key(A, i, key) implementiert die Operation heap-increase-key in Zeit O(log n). 1: 2: 3: 4: 5: 6: 7: 8: procedure heap-extract-max(A) if heap-size[A] < 1 then error heap underflow“ ” max ← A[1] ⊲ max buffern A[1] ← A[heap-size[A]] ⊲ A[1] geeignet überschreiben heap-size[A] ← heap-size[A]]−1 max-heapify(A, 1) ⊲ Heap wiederherstellen return max FG KTuEA, TU Ilmenau AuD – 16.5.2006 12 1: 2: 3: 4: 5: 6: 7: procedure heap-increase-key(A, i, key) if key < A[i] then error key ist kleiner als akt. Schlüssel“ ” A[i] ← key ⊲ Schlüssel aktualisieren while (i > 1 und A[parent(i)] < A[i]) do Vertausche A[i] mit A[parent(i)] i ← parent(i) Idee: (für While-Schleife) Durchlaufe den Pfad von Knoten i in Richtung Wurzel, bis Platz für key gefunden ist. FG KTuEA, TU Ilmenau Priority Queues – 7 AuD – 16.5.2006 13 Priority Queues – 8 Bsp. heap-increase-key(A, 9, 15) mit TA: Bsp. heap-increase-key(A, 9, 15) fortgesetzt 16 16 14 10 8 2 i 7 4 9 14 3 10 15 1 2 i 7 8 16 14 2 i 15 FG KTuEA, TU Ilmenau AuD – 16.5.2006 i 10 7 3 1 16 8 9 9 3 15 10 14 1 2 14 FG KTuEA, TU Ilmenau 7 8 AuD – 16.5.2006 9 3 1 15 Priority Queues – 9 Quicksort – 1 Die Prozedur max-heap-insert(A, key) implementiert die Operation insert in Zeit O(log n). quicksort(A[p..r]) ist ein Divide-and-Conquer Algorithmus. Idee: Erzeuge zunächst ein neues Heap-Element mit kleinstem Schlüssel (−∞). Dazu wird heap-size[A] um eins vergrößert. Mittels heap-increase-key wird damit key richtig eingefügt. 1: 2: 3: 4: procedure max-heap-insert(A, key) heap-size[A] ← heap-size[A]+1 A[heap-size[A]] ← −∞ heap-increase-key(A, heap-size[A], key) FG KTuEA, TU Ilmenau AuD – 16.5.2006 Im folgenden sei (U, ≤) eine total geordnete Menge. Def. Für eine Teilmenge T ⊆ U und x ∈ U schreiben wir T ≤ x (sprich x ist obere Schranke von T ) für die Aussage: ∀t ∈ T : t ≤ x Analog seien T < x und x ≤ T (u. Schranke), x < T definiert. Folg (Leere Menge). Es gilt x < ∅ ≤ x für jedes x ∈ U . Ferner identifizieren wir einen Array-Abschnitt A[p..r] mit der Menge {A[p], A[p + 1], . . . , A[r]} seiner Elemente. 16 FG KTuEA, TU Ilmenau Quicksort – 2 Divide: Teile (i.a. mit Umarrangieren) A[p..r] in zwei Teilarrays A[p..q−1] und A[q+1..r] auf, so daß gilt: A[p..q−1] ≤ A[q] ≤ A[q+1..r] Die Berechnung von q ist Bestandteil dieses Schrittes; A[q] heißt Pivotelement mit Pivotindex q. Conquer: Sortiere nun (in-place) rekursiv mittels quicksort die Teilarrays A[p..q−1] und A[q+1..r]. Combine: Entfällt, da der resultierende Array A[p..r] bereits sortiert ist. AuD – 16.5.2006 17 Quicksort – 3 quicksort(A[p..r]) (Array über (U, ≤)) arbeitet wie folgt: FG KTuEA, TU Ilmenau AuD – 16.5.2006 18 Die Prozedur quicksort lautet damit wie folgt: 1: procedure quicksort(A,p,r) 2: if p < r then q ← partition(A, p, r) 3: 4: quicksort(A, p, q−1) 5: quicksort(A, q+1, r) Aus der Korrektheit von partition(A, p, r) folgt dann die Korrektheit von quicksort(A, p, r). Der Aufruf quicksort(A, 1, len(A)) sortiert einen Input-Array A[1..len(A)]. Frage: Wie lautet partition(A, p, r)? FG KTuEA, TU Ilmenau AuD – 16.5.2006 19 Quicksort – 4 Quicksort – 5 Die Prozedur partition(A, p, r) nach N. Lomuto (ursprüngl. Fassung: C. Hoare): Ein in-place Algorithmus zur Berechnung des Pivotelementes 1: procedure partition(A,p,r) x ← A[r] ⊲ das Pivotelement! 2: i ← p−1 ⊲ grüner Bereich 3: 4: for j ← p to r−1 do 5: if A[j] ≤ x then 6: i ← i+1 7: Vertausche A[i] mit A[j] 8: 9: Bsp. i i p, i j i 2 8 7 1 3 5 6 4 p, i i i j r j i AuD – 16.5.2006 r FG KTuEA, TU Ilmenau AuD – 16.5.2006 21 A[j] ≤ x Dann wird A[j] mit A[i+1] vertauscht. Nach I.V. bzw. Fall-Annahme gilt dann: r A[p..i+1] = A[p..i] :: A[j] ≤ x A[i+2..j] = A[i+2..j−1] :: A[i+1] > x r 2 1 3 4 7 5 6 8 FG KTuEA, TU Ilmenau j Beweis. j = p Klar, da ∅ ≤ x < ∅. j → j + 1 Betrachte die zwei Fälle in Runde j: r 2 1 3 8 7 5 6 4 p r Vor Ausführung von Runde j (Schleifenrumpf (5-7) mit Laufindex j) gilt: A[p..i] ≤ x = A[r] < A[i+1..j−1] 2 1 3 8 7 5 6 4 p j 2 8 7 1 3 5 6 4 Korrektheit(partition(A, p, r)). Zeige Schleifen-Invariante: r 2 1 3 8 7 5 6 4 p r Quicksort – 7 2 1 7 8 3 5 6 4 p j 2 8 7 1 3 5 6 4 20 i r 2 8 7 1 3 5 6 4 Quicksort – 6 p p, j p, i AuD – 16.5.2006 Bsp. fortgesetzt r 2 8 7 1 3 5 6 4 Vertausche A[i+1] mit x return i+1 FG KTuEA, TU Ilmenau p, j Fertig, da i := i+1 in Runde j gesetzt wird. 22 FG KTuEA, TU Ilmenau AuD – 16.5.2006 23 Quicksort – 8 Quicksort – 9 A[j] > x Dann bleibt i unverändert, also gilt A[p..i] ≤ x nach I.V., und nach I.V. bzw. Fall-Annahme gilt: Laufzeitanalyse: partition(A, p, r) benötigt Zeit Θ(n), wobei n := r − p + 1. A[i+1..j] = A[i+1..j−1] :: A[j] > x Korrektheit: Nach Runde r − 1, d.h. vor Ausführung von Runde j = r, gilt aufgrund der Schleifen-Invariante: A[p..i] ≤ x = A[r] < A[i+1..r−1] Nach Vertauschen von A[i+1] mit x = A[r] gilt wie gewünscht: Die worst-case Laufzeit T (n) von quicksort hängt stark davon ab, wie balanciert oder unbalanciert die von partition erzeugten Aufteilungen ausfallen. Worst-case Aufteilung: In jedem rek. Aufruf von partition bzgl. Problemgröße n entstehen Teilarrays der Größe n − 1 und 0. Wegen T (0) = Θ(1) erhalten wir die Rekursion: T (n) = T (n − 1) + Θ(n) A[p..i] :: x ≤ x < A[i+2..r−1] :: A[i+1] Hierfür gilt (Übungsaufgabe!): T (n) = Θ(n2) FG KTuEA, TU Ilmenau AuD – 16.5.2006 24 FG KTuEA, TU Ilmenau AuD – 16.5.2006 25 Quicksort – 10 Quicksort – 11 Best-case Aufteilung: In jedem rek. Aufruf von partition bzgl. Problemgröße n entstehen Teilarrays der Größe ⌊n/2⌋ und ⌈n/2⌉ − 1. Aufteilung mit konstanter Proportionalität: Jeder rek. Aufruf von partition bzgl. Problemgröße n erzeugt Teilarrays mit konstanter Proportionalität, z.B. eine 9-zu-1-Aufteilung (sehr unbalanciert!) In diesem Fall erhalten wir die Rekursionsungleichung: In diesem Fall erhalten wir die Rekursionsungleichung: T (n) ≤ 2·T (n/2) + Θ(n) Hierfür ergibt das Master-Theorem eine ungleich viel bessere asymptotische Lösung der Rekursion: T (n) ≤ T (9n/10) + T (n/10) + c·n Die Rekursionsbaum-Methode ergibt hierfür ebenfalls: T (n) = O(n·log n) T (n) = O(n·log n) Fazit: Bei der best-case Aufteilung arbeitet quicksort so schnell wie merge-sort – mit wesentlich kleinerer Konstante! Fazit: Selbst bei Aufteilung mit konstanter Proportionalität arbeitet quicksort so schnell wie merge-sort. FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau AuD – 16.5.2006 26 AuD – 16.5.2006 27 Quicksort – 12 Quicksort – 13 Rekursionbaum für konstante 9-zu-1-Aufteilung: n 9 10 n log 109 n 9 100 n 1 100 n T (n) ≤ T (n′) + T (n′′) + c·n mit n′ + n′′ = n − 1 cn 1 10 n log10 n Worst-Case Laufzeit T (n) von quicksort: Wissen nur cn für n ≥ 1 und c > 0 geeignet. 81 100 n cn Beh. T (n) ≤ d·n2 für ein d > 0 geeignet und n ≥ 1 81 729 1000 n 1000 n cn Beweis. Wertverlaufsinduktion. Sei n ≥ 1 beliebig. 9 100 n 1 n = 1 Dann gilt T (1) ≤ 2·T (0) + c ≤ d, für d geeignet. ≤ cn 1 n > 1 Dann gilt nach I.V. für n′, n′′ mit n′ + n′′ = n − 1: ≤ cn T (n) ≤ d·(n′)2 + d·(n′′)2 + c·n ≤ d·(n − 1)2 + c·n (Binomische Formel) ≤ d·n2 für 2·T (0) + c ≤ d O(n log n) Bem. Das gleiche Argument ergibt sich für beliebige Aufteilungen konstanter Proportionalität! FG KTuEA, TU Ilmenau AuD – 16.5.2006 28 FG KTuEA, TU Ilmenau Quicksort – 14 AuD – 16.5.2006 29 Quicksort – 15 Average-Case Laufzeit T (n) von quicksort(A, p, r), wobei n := r − p + 1. Gleichverteilungsannahme: Alle Permutationen der n Einträge eines Input-Arrays A[p..r] sind gleichwahrscheinlich. 1: 2: 3: 4: Einfachere Analyse: Randomisierung von quicksort: Anstelle stets A[r] als Pivotelement zu wählen, wählen wir zufällig ein Pivotelement aus A[p..r]. 2: Effekt: Die erwartete Aufteilung ist gut balanciert! 4: 1: 3: 5: procedure randomized-partition(A,p,r) i ← random(p, r) Vertausche A[r] mit A[i] partition(A, p, r) procedure randomized-quicksort(A,p,r) if p < r then q ← randomized-partition(A, p, r) randomized-quicksort(A, p, q−1) randomized-quicksort(A, q+1, r) Im folgenden sei random(a, b) ein Zufallsgenerator, der zufällig eine Zahl m ∈ [a, b] erzeugt, d.h. jede dieser Zahlen ist gleichwahrscheinlich. Für erwartete Laufzeit von randomized-quicksort: Einschub Wahrscheinlichkeitstheorie FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau AuD – 16.5.2006 30 AuD – 16.5.2006 31 Wahrscheinlichkeit: Grundbegriffe – 1 Wahrscheinlichkeit: Grundbegriffe – 2 Wahrscheinlichkeitstheorie ist ein wesentliches Werkzeug bei der Laufzeitanalyse im average-case oder bei der Analyse von randomisierten Algorithmen. Def. Eine Ereignis ist eine Teilmenge A eines Stichprobenraums S. Def. Ein Stichprobenraum ist eine endliche (i.a. abzählbar unendliche) Menge S von Elementarereignissen. Intuition: Ein Elementarereignis ist ein möglicher Ausgang eines Zufallsexperiments. Bsp. Für das Experiment, zwei Münzen zu werfen, gibt es vier mögliche Ausgänge, dargestellt als Strings der Länge 2 über H (head: Kopf) und T (tail: Zahl). Bsp. Das Ereignis, beim Werfen zweier Münzen Kopf“ und ” Zahl“ zu erhalten, ist die Menge A = {HT, TH}. ” Das Ereignis S heißt sicher und ∅ heißt Nullereignis. Elementarereignisse s ∈ S werden oft mit dem Ereignis {s} identifiziert. Def. Zwei Ereignisse A, B heißen disjunkt, falls A ∩ B = ∅ gilt. =⇒ S = {HH, HT, TH, TT} FG KTuEA, TU Ilmenau AuD – 16.5.2006 32 Wahrscheinlichkeit: Grundbegriffe – 3 FG KTuEA, TU Ilmenau AuD – 16.5.2006 33 Wahrscheinlichkeit: Grundbegriffe – 4 Folg (W-Raum). Def. Eine Wahrscheinlichkeitsverteilung auf einem Stichprobenraum S ist eine Abbildung Pr{·} : Ereignisse(S) → R, die die folgenden Axiome erfüllt: Sei (Pr{·}, S) ein W-Raum und A, B Ereignisse von S. Dann gilt: (P1) Pr{A} ≥ 0 für alle Ereignisse von S 1. Pr{∅} = 0 (P2) Pr{S} = 1 2. A ⊆ B =⇒ Pr{A} ≤ Pr{B} (P3) Für paarweise disjunkte Ereignisse A1, . . . , An gilt: n P Pr{Ai} Pr{A1 ∪ . . . ∪ An} = 3. Pr{A} = 1 − Pr{A}, wobei A := S \A i=1 Ein solches Paar (Pr{·}, S) heißt Wahrscheinlichkeitsraum, kurz W-Raum. 4. Pr{A ∪ B} = Pr{A} + Pr{B} − Pr{A ∩ B} (Siebformel) P Pr{s} 5. Pr{A} = s∈A FG KTuEA, TU Ilmenau AuD – 16.5.2006 34 FG KTuEA, TU Ilmenau AuD – 16.5.2006 35 Wahrscheinlichkeit: Grundbegriffe – 5 P2 Wahrscheinlichkeit: Grundbegriffe – 6 P3, P2 Beweis. Zu 1). 1 = Pr{S} = Pr{S ⊎ ∅} = 1 + Pr{∅} Def. Ist S endlich und sind alle s ∈ S gleichwahrscheinlich, d.h. Pr{s} = 1/|S|, so spricht man von Gleichverteilung. Zu 2). Gelte A ⊆ B. Dann gilt B = A ⊎ B \A und somit: P1 P3 Pr{B} = Pr{A} + Pr{B \A} ≥ Pr{A} Bsp. Experiment, eine faire Münze n-mal zu werfen. Dann erhalten wir eine Gleichverteilung auf S := {H, T}n vermöge Pr{s} = 1/2n für alle s ∈ S. P3 P2 Zu 3). 1 = Pr{S} = Pr{A ⊎ S \A} = Pr{A} + Pr{S \A} Zu 4). Es gilt A = (A ∩ B) ⊎ A\B und somit: Das Ereignis A := {k-mal Kopf und (n − k)-mal Zahl} hat damit Wahrscheinlichkeit: Folg 5) P Pr{A} = Pr{s} = |A| · 21n = nk · 21n P3 Pr{A} = Pr{A ∩ B} + Pr{A\B} (∗) =⇒ Pr{A ∪ B} = Pr{B ⊎ A\B} P3 = Pr{B} + Pr{A\B} (∗) = Pr{B} + Pr{A} − Pr{A ∩ B} s∈A Denn: A = {s ∈ S | #Kopf(s) = k} Zu 5). Folgt direkt aus P3. FG KTuEA, TU Ilmenau AuD – 16.5.2006 36 Wahrscheinlichkeit: Grundbegriffe – 7 • Eine Zufallsvariable auf S ist eine Abbildung X : S → R. • Ist X eine Zufallsvariable auf S und x ∈ R, so bezeichne X = x das Ereignis: {s ∈ S | X(s) = x} = X AuD – 16.5.2006 37 Wahrscheinlichkeit: Grundbegriffe – 8 Def. Sei (Pr{·}, S) ein W-Raum. −1 FG KTuEA, TU Ilmenau (x) Analog seien X ≥ x, X > x, und X ≤ x, X < x definiert. Def. Sei (Pr{·}, S) ein W-Raum und X eine Zufallsvariable auf S. Der Erwartungswert von X ist definiert durch: P E[X] := x · Pr{X = x} x∈R Intuition: E[X] gibt die durchschnittliche Verteilung der Werte von X relativ zu Pr{·} an. P P P X(s) · Pr{s} x·( Bem. E[X] = Pr{s}) = x∈R s∈X −1(x) Bei Gleichverteilung gilt also: E[X] = s∈S 1 |S| · P X(s) Bsp. Experiment, zwei faire Würfel zu werfen. Wir erhalten eine Gleichverteilung auf S := {1, 2, 3, 4, 5, 6}2 mit Pr{s} = 1/36 für s ∈ S. Für die Zufallsvariable auf S, X((z, z ′)) := max{z, z ′} gilt dann: Pr{X = 3} = 5/36 Vorsicht: Ist S abzählbar unendlich, so ist E[X] i.a. nicht definiert, jedoch dann, falls die Reihe absolut konvergiert. FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau AuD – 16.5.2006 38 AuD – 16.5.2006 s∈S 39 Wahrscheinlichkeit: Grundbegriffe – 9 Wahrscheinlichkeit: Grundbegriffe – 10 Bsp. Betrachte das Experiment, zwei faire Münzen zu werfen. Dann erhalten wir eine Gleichverteilung auf S := {HH, HT, TH, TT} vermöge Pr{s} = 1/4 für s ∈ S. Für die Zufallsvariable X, Lemma (Einfache Eigenschaften). Sei (Pr{·}, S) ein W-Raum, seien X, Y Zufallsvariablen auf S und α, β ∈ R Konstanten, sowie g : R → R. Dann gilt: 1. E[α·X + β ·Y ] = α·E[X] + β ·E[Y ] P g(x)·Pr{X = x} 2. E[g ◦ X] = X(s) := 3·#Kopf(s) −2·#Zahl(s) für s ∈ S, ergibt sich dann der folgende Erwartungswert: (Linearität) x∈R 3. Für X(S) ⊆ N gilt: E[X] = E[X] = 3·2·Pr{HH} + Pr{HT} + Pr{TH} −2·2·Pr{TT} = 6/4 + 2/4 −4/4 =1 ∞ P Pr{X ≥ i} i=1 Beweis. 1) ergibt sich einfach aus der üblichen Definition: (α·X + β ·Y )(s) = α·X(s) + β ·Y (s) FG KTuEA, TU Ilmenau AuD – 16.5.2006 40 Wahrscheinlichkeit: Grundbegriffe – 11 P Zu 2). E[g ◦ X] = y∈R P = y∈R P = y∈R P = y∈R P = x∈R 41 Zusatz (Einfache Eigenschaften). Wenn X, Y unabhängig sind, d.h. für alle x, y ∈ R gilt y · Pr{g ◦ X = y} y · Pr{{s ∈ S | g(X(s)) = y}} U y · Pr{ X = x} x∈g −1(y) P y· Pr{X = x} Pr{X = x und Y = y} = Pr{X = x} · Pr{Y = y}, dann gilt E[X ·Y ] = E[X]·E[Y ]. Beweis. Nach Definition und Unabhängigkeit erhält man: PP x·y·Pr{X = x und Y = y} E[X ·Y ] = x y P P x·y·Pr{X = x} · Pr{Y = y} = ! x y P P y·Pr{Y = y} x·Pr{X = x} · = x∈g −1(y) g(x) · Pr{X = x} x da 1 · (a1−a2) + 2 · (a2 − a3) . . . = a1 + a2 + a3 + . . . AuD – 16.5.2006 AuD – 16.5.2006 Wahrscheinlichkeit: Grundbegriffe – 12 P∞ Zu 3). E[X] = i=1 i · Pr{X = i} da X(S) ⊆ N P∞ = i=1 i · (Pr{X ≥ i} − Pr{X ≥ i + 1}) P∞ = i=1 Pr{X ≥ i} FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau y = E[X]·E[Y ] 42 FG KTuEA, TU Ilmenau AuD – 16.5.2006 43 Wahrscheinlichkeit: Grundbegriffe – 13 Wahrscheinlichkeit: Grundbegriffe – 14 Konzept Indikator-Zufallsvariable: Erleichtert Berechnung des Erwartungswertes einer Zufallsvariable. Bsp. Erwartete Anzahl von Kopf“ nach n-maligem Werfen ” einer fairen Münze. Erinnerung: Gleichverteilung auf S := {H, T}n vermöge Pr{s} = 1/2n für s ∈ S. Def. Sei (Pr{·}, S) ein W-Raum und A ⊆ S. Die IndikatorZufallsvariable I{A} bzgl. A (auch XA) ist definiert durch 1 falls A eintrifft I{A} := 0 sonst, d.h. IA(s) := 1, falls s ∈ A, und IA(s) := 0, falls s ∈ / A. Folg (Indikator-Zufallsvariable). E[X{A}] = Pr{A} P Denn: E[XA] = x · Pr{XA = x} = Pr{XA = 1} = Pr{A}. x∈R FG KTuEA, TU Ilmenau AuD – 16.5.2006 Betrachte Zufallsvariable X(s) := #Kopf(s) für s ∈ S, sowie für i = 1, . . . , n die Indikator-Zufallsvariable Xi bzgl. Ereignis: i-ter Wurf liefert Kopf“, ” Folg =⇒ E[Xi] = Pr{ i-ter Wurf liefert Kopf“} = 1/2 ” X = X1 + . . . + Xn n n P Lin. P =⇒ E[X] = E[Xi] = 1/2 = n/2 i=1 44 FG KTuEA, TU Ilmenau i=1 AuD – 16.5.2006 45 Quicksort fortgesetzt – 16 Quicksort fortgesetzt – 17 Erwartete Zeit T (n) von randomized-quicksort(A, p, r), wobei n := r − p + 1. Beobachtung: Seien z1, z2, . . . , zn die Elemente des Eingabe-Arrays A[p..r] in aufsteigend sortierter Reihenfolge. Ferner sei 1) Es gibt maximal n Aufrufe von partition innerhalb einer Rechnung von quicksort bei Eingabegröße n. Zij := {zi, zi+1, . . . , zj }. 2) Ein Aufruf von partition benötigt Zeit O(1) plus eine Zeit, die proportional zur Anzahl der in der FOR-Schleife durchgeführten Schlüsselvergleiche (Zeile 4) ist. Lemma (Ansatz für Zufallsvariable). Sei X die Anzahl der von partition durchgeführten Schlüsselvergleiche in Zeile 4 innerhalb einer Rechnung von quicksort auf Eingaben der Größe n. Dann gilt T (n) = O(n + X). FG KTuEA, TU Ilmenau AuD – 16.5.2006 46 Frage: Wann vergleicht der Algorithmus zi mit zj ? Definiere die Indikator-Zufallsvariable (gemessen über die gesamte Rechnung von quicksort) Xij := I{zi wird mit zj verglichen}. Jedes Paar zi, zj wird höchstens einmal miteinander verglichen! n n−1 P P Xij =⇒ X = i=1 j=i+1 FG KTuEA, TU Ilmenau AuD – 16.5.2006 47 Quicksort fortgesetzt – 18 Quicksort fortgesetzt – 19 Linearität des Erwartungswertes und Folg. ergibt damit: # " n n−1 P P Xij E[X] = E =⇒ i=1 j=i+1 n−1 P = n P i=1 j=i+1 n n−1 P P = E[Xij ] Pr{zi = Pr{zi = Pr{zi Pr{zj 2 = j−i+1 =⇒ E[X] = Pr{zi wird mit zj verglichen} i=1 j=i+1 Nun gilt für i < j: zi und zj werden verglichen ⇐⇒ das erste aus Zij gewählte Pivotelement ist zi oder zj . = Wegen Randomisierung ist jedes aus Zij erstmals gewählte 1 Pivotelement gleichwahrscheinlich: j−i+1 = FG KTuEA, TU Ilmenau AuD – 16.5.2006 48 Quicksort fortgesetzt – 20 Die Aussage n P k=1 1 1 ≤ = 1 k + 12 + 31 + . . . + n1 1 20 + ( 211 + 221−1 ) + . . . + P 1 P i≤⌊log n⌋ j<2i ≤ P P i≤⌊log n⌋ j<2i ≤ ≤ (log n) + 1 = O(log n) erhält man so: P 2i+j 1 2⌊log n⌋ 1 + . . . + 2⌊log n⌋+1 −1 1 2i 1 i≤⌊log n⌋ ≤ (log n) + 1 FG KTuEA, TU Ilmenau AuD – 16.5.2006 50 n−1 P wird mit zj verglichen} oder zj ist erstes Pivotelement in Zij } ist erstes Pivotelement in Zij } + ist erstes Pivotelement in Zij } n P 2 j−i+1 i=1 j=i+1 n−1 n−1 n P 2 P n−i P P 2 < k+1 k i=1 k=1 i=1 k=1 n−1 P O(log n) (Harmonische Reihe) i=1 = O(n·log n) FG KTuEA, TU Ilmenau AuD – 16.5.2006 49