9 Finden der i-kleinsten Zahl

Werbung
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
Herunterladen