9 Finden der i-kleinsten Zahl Das Finden der i-kleinsten Zahl in einer Inputfolge A[1..n] von n Zahlen kann man bewerkstelligen, indem man zunächst die Zahlen sortiert und dann das Element an der Stelle i, A[i], nimmt. Dieses Verfahren benötigt O(1) = O(n log n) T (n) = O(n log n)+ Ω(n log n) Zeit benötigt. Es Zeit, da Sortieren mindestens stellt sich die Frage, ob es ein schnelleres Verfahren gibt. 9.1 Minimum und Maximum Im Fall von Minimum (i = 1) und Maximum (i = n) kommen wir mit n−1 Vergleichen aus, da wir in einer Schleife die Elemente der Inputfolge durchgehen können und dabei nur das Maximum/Minimum der bisher betrachteten Zahlen mitspeichern müssen. In diesen Fällen ist daher 9.2 T (n) = O(n) Allgemeiner Fall Im allgemeinen Fall 1<i<n können wir das Finden der i-kleinsten Zahl in einem linearen Feld mittels Partition (Zerlegen von Feldern) lösen, das bereits bei QuickSort verwendet wurde. Partition teilt das Feld in Teilfelder der Länge k und n − k, wobei alle Elemente im linken Teilfeld kleiner als die Elemente im i ≤ k , suche daher weiter im linken Teilfeld (i − k)-kleinste Zahl im rechten Teilfeld A[k+1..n]. rechten Teilfeld sind. Wenn sonst suche die A[1..k], SELECT(A, l, r, i) 1: IF l = r THEN RETURN A[l] 2: k = PARTITION (A, l, r) 3: x = k - l + 1 4: IF i<=x THEN SELECT(A, l, k, i) 5: ELSE SELECT(A, k+1, r, i-x) Die Laufzeit hängt wieder vom Index k ab, der von Partition geliefert wird, und beträgt T (n) ≤ T (max{k, n − k}) + O(n) Wieder kann man den besten und schlechtesten Fall unterscheiden. Im besten 1 Fall ist in jedem Rekursionsschritt k= n 2: n T (n) ≤ T ( ) + O(n) 2 n n ≤ T ( ) + O( ) + O(n) 4 2 n n n ≤ T ( ) + O( ) + O( ) + O(n) 8 4 2 ! k−1 X 1 n ≤ T( k ) + O n 2 2i i=0 ! ldn−1 X 1 k=ldn = O(1) + O n = O(n). 2i i=0 Im schlechtesten Fall ist in jedem Rekursionsschritt k=1 (bzw k = n − 1): T (n) ≤ T (n − 1) + O(n) ≤ T (n − 2) + O(n − 1) + O(n) ≤ T (n − 3) + O(n − 2) + O(n − 1) + O(n) ≤ T (n − k) + k−1 X O(n − i) i=0 k=n−1 = O(1) + O n−2 X ! (n − i) = O(1) + O(n2 ) = O(n2 ). i=0 Im mittleren Fall ergibt sich nach einer ähnlichen Analyse wie bei Quicksort eine Laufzeit von T (n) = O(n). Herleitung der average case Laufzeit: T (n) = n−1 X Für die erwartete Laufzeit gilt P (k) [T (max{k, n − k}) + O(n)] , k=1 wobei P (k) die Wahrscheinlichkeit ist, dass PARTITION(A,1,n) den Index k liefert. Bei randomisierter Pivotwahl ist es gerechtfertigt, eine Gleichverteilung P (k) = 1 n−1 anzunehmen (k T (n) = = 1, . . . , n − 1). n−1 1 X [T (max{k, n − k})] + O(n) n−1 k=1 = ≤ bn 2c n−1 X k=1 k=b n 2 c+1 1 X 1 T (n − k) + n−1 n−1 n−1 X 2 T (k) + O(n). n−1 n k=b 2 c 2 T (k) + O(n) Wir zeigen nun mit vollständiger Induktion, dass T (n) = O(n) ⇒ ∃c > 0 : T (n) ≤ c · n. • Induktionsanfang n = 2: T (2) ≤ 2 · T (1) + c1 · 2 ≤ 2 · c2 + c1 · 2 ≤ c · 2 Für jeden Wert von c1 und c2 gibt es eine Konstante c, sodass die Ungleichung erfüllt ist (z.B.: c ≥ c1 + c2 ). • zu zeigen: wenn ∃c > 0 : T (k) ≤ c · k für k = 1, . . . , n − 1, dann ∃c > 0 : T (n) ≤ c · n: T (n) ≤ n−1 X 2 T (k) + d · n n−1 n k=b 2 c n−1 X 2 c·k+d·n n−1 c k=b n 2 bn n−1 2 c−1 X 2c X = k− k + d · n n−1 ≤ k=1 k=1 Für die beiden Summen gilt: n−1 X k= n(n − 1) 2 k= b n2 c(b n2 c − 1) 2 k=1 bn 2 c−1 X k=1 ≥ n−1 n 2 (2 − 2) 2 Diese Abschätzung können wir in die ursprüngliche Formel einsetzen: n−1 n 2c n(n − 1) 2 ( 2 − 2) T (n) ≤ − +d·n n−1 2 2 n =c·n−c −1 +d·n 4 ≤ c · n. Im letzten Schritt können wir für jedes beliebige d eine Konstante c wählen, sodass für genügend groÿes n gilt Im mittleren Fall ist die Laufzeit also c n 4 − 1 ≥ d · n. T (n) = O(n). 3 9.3 Allgemeiner Fall in linearer Zeit im worst-case Durch deterministische Wahl (Berechnung) des Pivotelementes für Partition kann sogar die Laufzeit im schlechtesten Fall von O(n2 ) auf O(n) reduziert werden. Dabei geht man folgendermaÿen vor: 1. Teile A[1..n] in Gruppen zu je 5 Elementen: A[1..5], A[6..10], ... 2. Bestimme für jeden dieser n/5 Gruppen ihren Median 3. Rufe SELECT rekursiv auf, um den Median dieser n/5 Zahlen zu bestimmen (i = b n2 c) 4. Dieser Median ist das Pivotelement Schritte 1 und 2 brauchen O(n) h fur Pärtition Zeit, da pro Gruppe der Median in O(1) Zeit bestimmt werden kann (konstante Gruppengröÿe). Die Zeit für Schritt 3 beträgt T ( n5 ). 3n Beobachtung: Mindestens 10 Elemente sind gröÿer (bzw. kleiner) als h, denn 1 n n die Hälfte der lokalen Gruppenmediane ist gröÿer (kleiner) als h ( 2 · 5 = 10 n 2n 3n Elemente), sowie mindestens zwei weitere Elemente pro Gruppe ( 10 + 10 = 10 Elemente). Mit dieser Pivotwahl teilt Partition das Feld also in zwei Teilfelder, dessen Gröÿenverhältnis zwischen 3:7 und 7:3 liegt, es muss also im schlimmsten 7n Fall auf einem Telfeld der Gröÿe 10 weitergesucht werden. Die Rekursiongleichung lautet also T (n) ≤ T ( Wir zeigen 7n n ) + T ( ) + O(n) 10 5 T (n) = O(n) ⇔ ∃c > 0, ∃n0 ∈ N : T (n) ≤ c · n ∀n ≥ n0 : n 7n +c· +d·n 10 5 9 =c·n· +d·n 10 9c =n· +d 10 c ≤ c · n für d ≤ 10 T (n) ≤ c · d gibt es also eine Konstante c (mit c ≥ 10d), sodass T (n) ≥ T (n) = O(n) in jedem Fall. Für jede Konstante c · n, also 4