Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
Datenstrukturen und Algorithm Skript
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Unger, Florian Fedor Fridolin
Datenstrukturen und Algorithm Skript
Commits
b99d3914
Commit
b99d3914
authored
4 years ago
by
Florian Unger
Browse files
Options
Downloads
Patches
Plain Diff
fixed several off-by-one-errors in randomized quicksort runtime proof
parent
feaa9471
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
202_quicksort.tex
+58
-88
58 additions, 88 deletions
202_quicksort.tex
with
58 additions
and
88 deletions
202_quicksort.tex
+
58
−
88
View file @
b99d3914
...
...
@@ -17,7 +17,7 @@ Vorerst nehmen wir als Pivotelement einfach das letzte Arrayelement.
$
p
\leftarrow
\mathcal
{
A
}
[
n
-
1
]
$
\;
$
i
\leftarrow
-
1
$
\;
\For
{$
j
\leftarrow
0
$
\KwTo
$
n
-
2
$}{
\If
{$
\mathcal
{
A
}
[
j
]
\leq
p
$}{
\If
{$
\mathcal
{
A
}
[
j
]
≤
p
$}{
$
\texttt
{
swap
}
(
\mathcal
{
A
}
[
i
+
1
]
,
\mathcal
{
A
}
[
j
])
$
\;
$
i
\leftarrow
i
+
1
$
\;
}
...
...
@@ -49,14 +49,14 @@ vertauscht([5]). Dabei wird eine Sortierung innerhalb einer Partition zwar viell
Korrektheit des Algorithmus nicht relevant.
Man kann also feststellen: Das Array ist stets in vier (möglicherweise leere) Teilbereiche unterteilt. Der
Speicherort von
$
p
$
(Anfangs
$
n
-
1
$
), die noch nicht verglichenen Elemente
$
j <
\text
{
index
}
\leq
n
-
2
$
, die kleiner als
$
p
$
eingestuften Elemente
$
0
\leq
\text
{
index
}
\leq
i
$
und die als größer als
$
p
$
eingestuften Elemente
$
i <
\text
{
index
}
\leq
j
$
.
Speicherort von
$
p
$
(Anfangs
$
n
-
1
$
), die noch nicht verglichenen Elemente
$
j <
\text
{
index
}
≤
n
-
2
$
, die kleiner als
$
p
$
eingestuften Elemente
$
0
≤
\text
{
index
}
≤
i
$
und die als größer als
$
p
$
eingestuften Elemente
$
i <
\text
{
index
}
≤
j
$
.
Da ein Schleifendurchlauf die Schleifeninvarianten (also der Programmzustand exakt vor dem Inkrementieren von
$
j
$
)
\begin{itemize}
\item
Elemente mit Index
$
x
$
, wobei
$
x
\leq
i
$
, sind kleiner oder gleich
$
p
$
,
\item
Elemente mit Index
$
x
$
, wobei
$
i < x
$
und
$
x
\leq
j
$
, sind größer
$
p
$
,
\item
Elemente mit Index
$
x
$
, wobei
$
x
≤
i
$
, sind kleiner oder gleich
$
p
$
,
\item
Elemente mit Index
$
x
$
, wobei
$
i < x
$
und
$
x
≤
j
$
, sind größer
$
p
$
,
\item
Elemente mit Index
$
x
$
, wobei
$
j < x
$
, sind noch nicht überprüft,
\end{itemize}
erhält, aber die Anzahl der nicht überprüften Elemente pro Schleifendurchlauf um eins schrumpft, terminiert der
...
...
@@ -102,47 +102,20 @@ Algorithmus $\texttt{quicksort}$ terminiert als spätestens nach $n$ rekursiven
\subsubsection
{
Laufzeit:
}
Die allgemeine Rekusionsgleichung für
$
T
_{
\text
{
qs
}}
=
T
_{
\texttt
{
quicksort
}}$
lautet
\[
T
_{
\text
{
qs
}}
(
n
)
=
T
_{
\text
{
qs
}}
(
m
)
+
T
_{
\text
{
qs
}}
(
n
-
m
)
+
T
_
p
(
n
)
+
f
(
n
)
,
\text
{
wobei
}
f
\in
\mathcal
{
O
}
(
1
)
.
T
_{
\text
{
qs
}}
(
n
)
=
T
_{
\text
{
qs
}}
(
m
)
+
T
_{
\text
{
qs
}}
(
n
-
m
-
1
)
+
T
_
p
(
n
)
+
f
(
n
)
,
\text
{
wobei
}
f
\in
\mathcal
{
O
}
(
1
)
.
\]
Dabei verschwindet
$
f
$
völlig unter
$
T
_
p
\in
\mathcal
{
O
}
(
n
)
$
.
Anders als bei
$
\texttt
{
partition
}$
gibt es hier aber Unterschiede im best/worst case.
Der Parameter
$
m
\in
\{
0
,
\dots
,n
-
1
\}
$
beschreibt dabei die Position des Pivotelements. Die Laufzeit des Algorithmus
hängt nun stark von
$
m
$
ab:
\paragraph
{
Best case
}
Im besten Fall treffen wir mit dem Pivotelement
$
p
$
genau den Median von
$
\mathcal
{
A
}$
. Dann haben wir durch
$
m
=
\frac
{
n
}{
2
}$
pro Rekursionsschritt eine balancierte Aufteilung des Rekursionsbaums. Dann haben wir nach dem Hauptsatz
der Laufzeitfunktionen also
$
a
=
2
, b
=
2
$
,
$
f
\in
\mathcal
{
O
}
(
n
)
$
und damit eine best-case-Laufzeit von
$
\mathcal
{
O
}
(
n
\log
(
n
))
$
. Wir rechnen aber noch einmal per Hand nach: Einerseits um zu sehen wie das geschieht,
andererseits, da der worst-case nicht mit dem Satz berechnet werden kann.
Sei der Einfachheit halber
$
n
=
2
^{
k'
}$
für ein
$
k'
\in
\mathbb
{
N
}$
.
\begin{align*}
T
_{
\texttt
{
qs
}}^{
\text
{
best
}}
(n)
&
= T
_{
\text
{
qs
}}^{
\text
{
best
}}
\left
(
\frac
{
n
}{
2
}
\right
) + T
_{
\text
{
qs
}}^{
\text
{
best
}}
\left
(
\frac
{
n
}{
2
}
\right
) + T
_{
\text
{
p
}}
(n)
\\
&
= 2T
_{
\text
{
qs
}}^{
\text
{
best
}}
\left
(
\frac
{
n
}{
2
}
\right
) + T
_{
\text
{
p
}}
(n)
\\
&
= 4T
_{
\text
{
qs
}}^{
\text
{
best
}}
\left
(
\frac
{
n
}{
4
}
\right
) + 2T
_{
\text
{
p
}}
\left
(
\frac
{
n
}{
2
}
\right
) + T
_{
\text
{
p
}}
(n)
\\
&
= 8T
_{
\text
{
qs
}}^{
\text
{
best
}}
\left
(
\frac
{
n
}{
8
}
\right
) + 4T
_{
\text
{
p
}}
\left
(
\frac
{
n
}{
4
}
\right
) + 2T
_{
\text
{
p
}}
\left
(
\frac
{
n
}{
2
}
\right
) + T
_{
\text
{
p
}}
(n)
\\
&
=
\ldots
\\
&
= nT
_{
\text
{
qs
}}^{
\text
{
best
}}
(1) +
\sum
_{
k=0
}^{
\log
_
2(n)
}
2
^
k T
_{
\text
{
p
}}
\left
(
\frac
{
n
}{
2
^
k
}
\right
)
\\
\end{align*}
Wir sehen nun in einer Nebenrechnung, dass
$
n
\mapsto
2
^
k T
_{
\text
{
p
}}
(
\frac
{
n
}{
2
^
k
}
)
\in
\Theta
(
n
)
$
für alle
$
k
\in
\mathbb
{
N
}$
.
Sei also
$
k
$
fixiert. Dann gilt
$
c
_
1
\floor
*
{
\frac
{
n
}{
2
^
k
}}
\leq
T
_{
\text
{
p
}}
(
\floor
*
{
\frac
{
n
}{
2
^
k
}}
)
\leq
c
_
2
\ceil
*
{
\frac
{
n
}{
2
^
k
}}$
für alle
$
n
\geq
n
_
0
2
^
k
$
, wobei
$
n
_
0
$
durch
$
T
_{
\text
{
p
}}
\in
\Theta
(
n
)
$
gegeben ist. Wir
multiplizieren die Ungleichung mit
$
2
^
k
$
, erhalten damit
$
2
^
k c
_
1
\floor
*
{
\frac
{
n
}{
2
^
k
}}
\leq
2
^
k
T
_{
\text
{
p
}}
(
\floor
*
{
\frac
{
n
}{
2
^
k
}}
)
\leq
2
^
k c
_
2
\ceil
*
{
\frac
{
n
}{
2
^
k
}}$
, was wieder für alle
$
n
\geq
n
_
0
2
^
k
$
gültig ist.
Da
$
2
^
k
\floor
*
{
\frac
{
n
}{
2
^
k
}}
\leq
n
$
und
$
2
^
k
\ceil
*
{
\frac
{
n
}{
2
^
k
}}
\geq
n
$
gilt, können wir die Ungleichung zu
$
c
_
1
n
\leq
2
^
k T
_{
\text
{
p
}}
(
\floor
*
{
\frac
{
n
}{
2
^
k
}}
)
\leq
c
_
2
n
$
vereinfachen. Damit gilt mit
$
c
_
1
, c
_
2
$
und
$
n
_
0
'
=
2
^
k
n
_
0
$
:
Im besten Fall treffen wir mit dem Pivotelement
$
p
$
genau den Median von
$
\mathcal
{
A
}$
. Dann haben wir durch
$
m
\simeq
\frac
{
n
}{
2
}$
pro Rekursionsschritt eine balancierte Aufteilung des Rekursionsbaums, die Rekursionsgleichung wird zu
\[
n
\mapsto
2
^
k
T
_{
\text
{
p
}}
\left
(
\floor
*
{
\frac
{
n
}{
2
^
k
}
}
\right
)
\in
\Theta
(
n
)
.
T
_{
\text
{
qs
}}
(
n
)
=
2
T
_{
\text
{
qs
}}
\left
(
\frac
{
n
}{
2
}
\right
)
+
T
_
p
(
n
)
.
\]
Damit haben wir
\begin{align*}
T
_{
\text
{
qs
}}^{
\text
{
best
}}
(n)
&
= nT
_{
\text
{
qs
}}^{
\text
{
best
}}
(1) +
\sum
_{
k=0
}^{
\log
_
2(n)
}
2
^
k T
_{
\text
{
p
}}
\left
(
\frac
{
n
}{
2
^
k
}
\right
)
\\
&
\in
\mathcal
{
O
}
(n) +
\log
_
2(n)
\mathcal
{
O
}
(n)
\\
&
=
\mathcal
{
O
}
(n
\log
(n)).
\\
\end{align*}
Nach dem Hauptsatz der Laufzeitfunktionen ist mit
$
a
=
2
, b
=
2
$
,
$
f
\in
\mathcal
{
O
}
(
n
)
$
die Laufzeit im best-case damit in
$
\mathcal
{
O
}
(
n
\log
n
)
$
.
\paragraph
{
Worst case
}
Im schlechtesten Fall teilen wir das Array sehr ungünstig: Das Pivotelement ist immer das Maximum oder das Minimum,
...
...
@@ -162,11 +135,11 @@ Aufwandsklasse der Summenterm liegen könnte. Wir fomalisieren jetzt also die Id
oben und
$
c
_
1
n
$
von unten abschätzen können, sobald die
$
n
$
groß genug werden.
Betrachten wir also
$
\sum
_{
i
=
1
}^
k T
_
\text
{
p
}
(
i
)
$
. Mit
$
T
_
\text
{
p
}
\in
Θ
(
n
)
$
wissen wir, dass
$
n
_
0
,c
_
1
,c
_
2
$
existieren, sodass
$
c
_
1
n'
\leq
T
_
\text
{
p
}
(
n'
)
\leq
c
_
2
n'
$
für alle
$
n' > n
_
0
$
. Dieses
$
n
_
0
$
ist aber fix, d.h. für ein groß genuges
$
k
$
(und
$
c
_
1
n'
≤
T
_
\text
{
p
}
(
n'
)
≤
c
_
2
n'
$
für alle
$
n' > n
_
0
$
. Dieses
$
n
_
0
$
ist aber fix, d.h. für ein groß genuges
$
k
$
(und
$
k
$
soll später gegen unendlich gehen) betrachten wir also
$
\sum
_{
i
=
n
_
0
}^
k T
_
p
(
i
)
$
. Hier gilt:
\[
\underbrace
{
c
_
1
\sum
_{
i
=
n
_
0
}^
k i
}_{
\text
{
$
\in
Ω
(
k
^
2
)
$
}}
\leq
\sum
_{
i
=
n
_
0
}^
k T
_
p
(
i
)
\leq
≤
\sum
_{
i
=
n
_
0
}^
k T
_
p
(
i
)
≤
\underbrace
{
c
_
2
\sum
_{
i
=
n
_
0
}^
k i
}_{
\text
{
$
\in
\mathcal
{
O
}
(
k
^
2
)
$
}}
\]
wie uns die Eulersche Summenformel verrät.
...
...
@@ -200,23 +173,13 @@ Definieren wir zuerst die randomisierte Partition:
\KwOut
{
The partition of
$
\mathcal
{
A
}$
wrt. the randomized pivot
$
p
$
and its post-partitioning-index
$
k
$}
$
i
\leftarrow
\texttt
{
random
\_
uniform
}
(
n
-
1
)
$
\;
$
\texttt
{
swap
}
(
\mathcal
{
A
}
[
0
]
,
\mathcal
{
A
}
[
i
])
$
\;
$
p
\leftarrow
\mathcal
{
A
}
[
n
-
1
]
$
\;
$
i
\leftarrow
-
1
$
\;
\For
{$
j
\leftarrow
0
$
\KwTo
$
n
-
2
$}{
\If
{$
\mathcal
{
A
}
[
j
]
\leq
p
$}{
$
\texttt
{
swap
}
(
\mathcal
{
A
}
[
i
+
1
]
,
\mathcal
{
A
}
[
j
])
$
\;
$
i
\leftarrow
i
+
1
$
\;
}
}
$
\texttt
{
swap
}
(
\mathcal
{
A
}
[
i
+
1
]
,
\mathcal
{
A
}
[
n
-
1
])
$
\;
$
i
\leftarrow
i
+
1
$
\;
\KwRet
$
(
\mathcal
{
A
}
, i
)
$
\KwRet
$
\texttt
{
partition
}
(
\mathcal
{
A
}
)
$
\end{algorithm}
Neu ist also nur das Vertauschen des ersten Elements von
$
\mathcal
{
A
}$
mit
d
em durch
$
\texttt
{
random
\_
uniform
}$
zufällig (gleichverteilt) e
r
wählten
anderen
Elements des Arrays, der Rest ist wie bei
$
\texttt
{
partition
}$
.
Neu ist also nur das Vertauschen des ersten Elements von
$
\mathcal
{
A
}$
mit e
in
m durch
$
\texttt
{
random
\_
uniform
}$
zufällig (gleichverteilt)
g
ewählten Elements des Arrays, der Rest ist wie bei
$
\texttt
{
partition
}$
.
Dabei hat
$
\texttt
{
random
\_
partition
}$
die gleichbleibende Laufzeit
$
T
_{
\text
{
rp
}}
\in
Θ
(
n
)
$
mit
$
n
=
\texttt
{
len
}
(
\mathcal
{
A
}
)
$
.
\texttt
{
len
}
(
\mathcal
{
A
}
)
$
.
Es ist auch nicht schwer einzusehen, das hier
$
n
_
0
=
2
$
gewählt werden kann.
Der Algorithmus
$
\texttt
{
randomized
\_
quicksort
}$
hat dabei genau den gleichen Pseudocode wie
$
\texttt
{
quicksort
}$
, nur
dass
$
\texttt
{
randomized
\_
partition
}$
statt
$
\texttt
{
partition
}$
in Zeile
$
[
2
]
$
gerufen wird. Die Laufzeit von
...
...
@@ -226,63 +189,70 @@ dass $T_{\text{rqs}} \in \mathcal{O}(n \log n)$ liegt.
\subsubsection
{
Herleitung der average case Laufzeit von
\texttt
{
randomized
\_
quicksort
}
:
}
Für die erwartete Laufzeit gilt
\begin{displaymath}
T
_{
\text
{
rqs
}}
(n) =
\sum
_{
k=1
}^{
n-1
}
P(k)
\left
( T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k) + T
_{
\text
{
rp
}}
(n)
\right
),
T
_{
\text
{
rqs
}}
(n) =
\sum
_{
k=1
}^{
n-1
}
P(k)
\left
( T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k
-1
) + T
_{
\text
{
rp
}}
(n)
\right
),
\end{displaymath}
wobei
$
P
(
k
)
$
die Wahrscheinlichkeit ist, dass
$
\texttt
{
randomized
\_
partition
}
(
\mathcal
{
A
}
)
$
den Index
$
k
$
liefert.
Wir nehmen mit
$
k
\in
\{
1
,
\dots
, n
-
1
\}
$
eine Gleichverteilung
$
P
(
k
)
=
\frac
{
1
}{
n
-
1
}$
an.
Wir nehmen mit
$
k
\in
\{
0
,
\dots
, n
-
1
\}
$
eine Gleichverteilung
$
P
(
k
)
=
\frac
{
1
}{
n
}$
an.
% TODO: Mehr Details
\begin{align*}
T
_{
\text
{
rqs
}}
&
=
\sum
_{
k=1
}^{
n-1
}
\left
(
\frac
{
1
}{
n-1
}
\left
( T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k) + T
_{
\text
{
rp
}}
(n)
\right
)
\right
)
\\
&
=
\frac
{
1
}{
n-1
}
\sum
_{
k=1
}^{
n-1
}
\left
( T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k)
\right
) +
\frac
{
n-1
}{
n-1
}
T
_{
\text
{
rp
}}
(n)
\\
&
=
\frac
{
2
}{
n-1
}
\sum
_{
k=1
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rp
}}
(n).
T
_{
\text
{
rqs
}}
&
=
\sum
_{
k=0
}^{
n-1
}
\left
(
\frac
{
1
}{
n
}
\left
( T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k-1) + T
_{
\text
{
rp
}}
(n)
\right
)
\right
)
\\
&
=
\frac
{
n
}{
n
}
T
_{
\text
{
rp
}}
(n) +
\frac
{
1
}{
n
}
\sum
_{
k=0
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rqs
}}
(n-k-1)
\\
&
= T
_
\text
{
rp
}
(n) +
\frac
{
2
}{
n
}
\sum
_{
k=0
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k)
\\
&
≤ T
_
\text
{
rp
}
(n) + d +
\frac
{
2
}{
n
}
\sum
_{
k=2
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k).
\end{align*}
Wir zeigen nun vermöge einer vollständiger Induktion, dass mit
$
c
=
\max\{
T
_{
\text
{
rqs
}}
(
1
)
+
T
_{
\text
{
rp
}}
(
2
)
,
8
c
_{
\text
{
rp
}}
\}
$
gilt:
Wobei
$
d :
=
2
T
_
\text
{
rqs
}
(
0
)
+
2
T
_
\text
{
rqs
}
(
1
)
≤
\frac
{
2
}{
n
}
(
T
_
\text
{
rqs
}
(
0
)
+
T
_
\text
{
rqs
}
(
1
))
$
ist für
$
n ≥
1
$
.
Wir zeigen nun vermöge einer vollständigen Induktion, dass mit
$
c
=
\max\{
T
_{
\text
{
rq
}}
(
2
)
+
d,
8
(
d
+
c
_{
\text
{
rp
}}
)
\}
$
gilt:
\[
T
_{
\text
{
rqs
}}
(
n
)
\leq
c
\cdot
n
\log
_
2
n
\text
{
für alle
}
n
>
2
.
T
_{
\text
{
rqs
}}
(
n
)
≤
c
\cdot
n
\log
_
2
n
\text
{
für alle
}
n
≥
2
.
\]
Hierbei ist
$
c
_{
\text
{
rp
}}$
die Konstante mit welcher
$
T
_
\text
{
rp
}
(
n
)
\leq
c
_{
\text
{
rp
}}
n
$
gilt. Streng genommen
Hierbei ist
$
c
_{
\text
{
rp
}}$
die Konstante mit welcher
$
T
_
\text
{
rp
}
(
n
)
≤
c
_{
\text
{
rp
}}
n
$
gilt. Streng genommen
gilt das erst ab irgendeinem
$
n
_
0
$
, aber den Aspekt vernachlässigen wir hier, um die Beweisstruktur etwas
übersichtlicher zu gestalten. Es ist bei
\texttt
{
randomized
\_
partition
}
aber auch leicht ersichtlich, dass
$
n
_
0
=
2
$
gewählt werden kann.
Induktionsanfang
$
n
=
2
$
:
\begin{align*}
T
_{
\text
{
rqs
}}
(
n
)
&
\leq
2 T
_{
\text
{
rqs
}}
(1)
+ T
_{
\text
{
rp
}}
(
n
)
\\
&
\leq
c n
\log
_
2 2
T
_{
\text
{
rqs
}}
(
2
)
&
≤ d
+ T
_{
\text
{
rp
}}
(
2
)
\\
&
≤
c n
\log
_
2 2
\end{align*}
Für
$
c
=
\max
(
T
_{
\text
{
rqs
}}
(
1
)
+
T
_{
\text
{
rp
}}
(
2
)
,
8
c
_{
\text
{
rp
}}
)
\geq
T
_{
\text
{
rqs
}}
(
1
)
+
T
_{
\text
{
rp
}}
(
2
)
$
ist die
Abschätzung definitiv erfüllt.
Induktionsschritt
$
n
-
1
\mapsto
n
$
: Zu zeigen ist, dass mit mit der Aussage wahr für alle
$
n
\in
\{
2
,
\dots
, n
-
1
\}
$
gilt:
$
T
_{
\text
{
rqs
}}
(
n
)
\leq
c n
\log
_
2
n
$
. Wir rechnen:
\begin{align*}
T
_{
\text
{
rqs
}}
(n)
&
=
\frac
{
2
}{
n-1
}
\sum
_{
k=1
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k) + T
_{
\text
{
rp
}}
(n)
\\
&
\overset
{{
\scriptscriptstyle
\text
{
IV
}}}{
\leq
}
\frac
{
2
}{
n-1
}
\sum
_{
k=1
}^{
n-1
}
c
\cdot
k
\log
_
2 k + T
_{
\text
{
rp
}}
(n)
\\
&
=
\frac
{
2c
}{
n-1
}
\sum
_{
k=1
}^{
n-1
}
k
\log
_
2 k + T
_{
\text
{
rp
}}
(n)
\\
&
\overset
{
\scriptscriptstyle
(*)
}{
\leq
}
\frac
{
2c
}{
n-1
}
\left
( (
\log
_
2 n)
\left
(
\frac
{
n(n-1)
}{
2
}
\right
) -
\frac
{
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
-1)
}{
2
}
\right
) + T
_{
\text
{
rp
}}
(n)
\\
&
= c
\cdot
n
\log
_
2 n - c
\left
(
\frac
{
n
}{
4
}
-
\frac
{
1
}{
2
}
\right
) +
\underbrace
{
T
_{
\text
{
rp
}}
(n)
}_{
\leq
c
_{
\text
{
rp
}}
\cdot
n
}
\\
&
\leq
c
\cdot
n
\log
_
2 n -
\left
(
\frac
{
2c
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
- 1)
}{
(n-1)2
}
\right
) + c
_{
\text
{
rp
}}
\cdot
n
\\
&
\leq
c
\cdot
n
\log
_
2 n - c
\cdot
\left
(
\frac
{
n
}{
4
}
\frac
{
(n-2)
}{
(n-1)
}
\right
) + c
_{
\text
{
rp
}}
\cdot
n
\\
&
\leq
c
\cdot
n
\log
_
2 n.
\end{align*}
Damit der letzte Schritt geht, muss
$
T
_{
\text
{
rqs
}}
(
n
)
≤ c n
\log
_
2
n
$
. Wir rechnen:
\begin{align*}
c
&
\leq
\frac
{
c
_{
\text
{
rp
}}}{
\frac
{
n
}{
4
}
\frac
{
n-2
}{
n-1
}}
\\
&
= 4 c
_{
\text
{
rp
}}
\underbrace
{
\frac
{
(n-1)
}{
(n-2)
}}_{
\text
{$
\leq
2
$
für
$
n >
2
$}}
\\
&
\leq
8c
_{
\text
{
rp
}}
T
_{
\text
{
rqs
}}
(n)
&
≤ T
_{
\text
{
rp
}}
(n) + d +
\frac
{
2
}{
n
}
\sum
_{
k=2
}^{
n-1
}
T
_{
\text
{
rqs
}}
(k)
\\
&
\overset
{{
\scriptscriptstyle
\text
{
IV
}}}{
≤
}
T
_{
\text
{
rp
}}
(n) + d
\frac
{
2c
}{
n
}
\sum
_{
k=2
}^{
n-1
}
\cdot
k
\log
_
2 k
\\
&
\overset
{
\scriptscriptstyle
(*)
}{
≤
}
T
_{
\text
{
rp
}}
(n) + d +
\frac
{
2c
}{
n
}
\left
( (
\log
_
2 n)
\left
(
\frac
{
n(n-1)
}{
2
}
\right
) -
\frac
{
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
-1)
}{
2
}
\right
)
\\
&
= c(n-1)
\log
_
2 n - c
\left
(
\frac
{
n
}{
4
}
-
\frac
{
1
}{
2
}
\right
) + T
_{
\text
{
rp
}}
(n) + d
\\
&
\overset
{
\scriptscriptstyle
(**)
}{
≤
}
c
\cdot
n
\log
_
2 n.
\end{align*}
sein. Durch unsere Wahl von
$
c
=
\max\{
T
_{
\text
{
rqs
}}
(
1
)
+
T
_{
\text
{
rp
}}
(
2
)
,
8
c
_{
\text
{
rp
}}
\}
$
ist das der Fall.
Betrachten wir zuerst
$
(**)
$
genauer: Das gilt genau dann, wenn
\[
T
_
\text
{
rp
}
(
n
)
+
d ≤ c
\left
(
\frac
{
n
}{
4
}
-
\frac
{
1
}{
2
}
\right
)
+
\log
_
2
n.
\]
Mit
$
n ≥
2
$
ist
$
\log
_
2
n >
\frac
{
1
}{
2
}$
und
$
T
_
\text
{
rp
}
(
n
)
$
lässt sich nach Annahme von oben durch
$
c
_
\text
{
rp
}
n
$
abschätzen.
Damit vereinfacht sich die Ungleichung auf
\[
4
(
c
_
\text
{
rp
}
n
+
d
)
≤ c n,
\]
was mit obigen
$
c
$
ab
$
n ≥
2
$
erfüllt ist.
Jetzt gilt es nurnoch, die in Schritt
$
(*)
$
getroffene Abschätzung der Summe
$
\sum
_{
k
=
1
}^{
n
-
1
}
k
\log
_
2
k
$
zu beweisen:
\begin{align*}
\sum
_{
k=1
}^{
n-1
}
k
\log
_
2 k
&
=
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k
\underbrace
{
\log
_
2 k
}_{
\leq
\log
_
2
\frac
{
n
}{
2
}}
+
\sum
_{
k=
\ceil*
{
\frac
{
n
}{
2
}}}^{
n-1
}
k
\underbrace
{
\log
_
2 k
}_{
\leq
\log
_
2 n
}
\\
&
\leq
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k (
\log
_
2 n - 1) +
\sum
_{
k=
\ceil*
{
\frac
{
n
}{
2
}}}^{
n-1
}
k
\log
_
2 n
\\
\sum
_{
k=2
}^{
n-2
}
k
\log
_
2 k
&
≤
\sum
_{
k=1
}^{
n-1
}
k
\log
_
2 k
\\
&
=
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k
\underbrace
{
\log
_
2 k
}_{
≤
\log
_
2
\frac
{
n
}{
2
}}
+
\sum
_{
k=
\ceil*
{
\frac
{
n
}{
2
}}}^{
n-1
}
k
\underbrace
{
\log
_
2 k
}_{
≤
\log
_
2 n
}
\\
&
≤
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k (
\log
_
2 n - 1) +
\sum
_{
k=
\ceil*
{
\frac
{
n
}{
2
}}}^{
n-1
}
k
\log
_
2 n
\\
&
=
\log
_
2 n
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k -
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k +
\log
_
2 n
\sum
_{
k =
\ceil*
{
\frac
{
n
}{
2
}}}^{
n-1
}
k
\\
&
=
\log
_
2 n
\underbrace
{
\sum
_{
k=1
}^{
n-1
}
k
}_{
=
\frac
{
n(n-1)
}{
2
}}
-
\underbrace
{
\sum
_{
k=1
}^{
\ceil*
{
\frac
{
n
}{
2
}}
-1
}
k
}_{
\geq
\frac
{
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
-1)
}{
2
}}
\\
&
\leq
(
\log
_
2 n)
\left
(
\frac
{
n(n-1)
}{
2
}
\right
) -
\frac
{
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
-1)
}{
2
}
&
≤
(
\log
_
2 n)
\left
(
\frac
{
n(n-1)
}{
2
}
\right
) -
\frac
{
\frac
{
n
}{
2
}
(
\frac
{
n
}{
2
}
-1)
}{
2
}
\end{align*}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment