Der Kern des klassischen mergesort ist die folgende Rekursion:
- Split eine ungeordnete Liste in zwei Hälften. Es genügt, die Limit-Offsets der Teillisten zu berechnen.
- Wenden Sie den Mergesort auf jede der Teillisten an.
Nach diesem Schritt werden die Teillisten sortiert.
- Fügen Sie die sortierten Teillisten zusammen, indem Sie die Elemente beider Listen in ihrer jeweiligen Reihenfolge untersuchen, indem Sie in der Liste mit dem kleineren Element abgleichen und fortfahren.
Lassen Sie TC(n)
die Zeit Komplexität des klassischen Mergesort sein. Die zuvor erwähnten Schritte nehmen O(1)
(*), 2*O(TC(ceil(n/2)))
bzw. O(n)
. Dies führt zu der Rekursion TC(n) = cc_0 + cc_1 * n + 2 * TC(ceil(n/2))
.
Betrachten Sie den verallgemeinerten Mergesort, bei dem Listen ungleichmäßig aufgeteilt sind, jedoch immer mit demselben Verhältnis. Die Komplexität der Aufspaltung und Zusammenführung bleibt die gleiche, an die Rekursion verleihen TG(n) = ca_0 + ca_1 * n + TG(1/a * n + 1) + TG((a-1)/a * n + 1))
für die generali mergesort (unter Verwendung von TG(x+1)
anstelle von TG(ceil(x))
; ca_0
, ca_1
wobei die Konstanten in der Notation O(_)
hidden; a=3
für mergesort_1/3
).
Diese Wiederholung kann mit der Akra-Bazzi-Method gelöst werden. Zu diesem Zweck muss die Wiederholung
TG(x) = g(x) + \sum_i=1..k (a_i * TG(b_i * x + h_i(x)) ; x >= x_0.
mit
a_i, b_i const.
a_i > 0
0 < b_i < 1
|g(x)| = O(x^c); c const.
|h(x)| = O(x/(log(x))^2)
als
geschrieben werden, die durch das Setzen getan werden kann ...
k = 2
a_1 = 1
a_2 = 1
b_1 = 1/a
b_2 = (a-1)/a
g(x) = ca_0 + ca_1 * x
h_1(x) = 1
h_2(x) = 1
x_0 = 2
-> TG(x) = ca_0 + ca_1 * n + 1 * TG(1/a * x + 1) + 1 * TG((a-1)/a * x + 1) ; x >= x_0.
Das Akra-Bazzi-Theorem erfordert der Exponent ist in \sum_i=1..k (a_i * (b_i)^p) = 1
zu finden. Dann gilt:
TG(x) = Θ (x^p \integral_(1, x) (g(u)/(u^(p+1)) du))
Insbesondere
a_1 * b_1^p + a_2 * b_2^p = 1
=> (1/a)^p + ((a-1)/a)^p = 1
<=> p = 1
... und so ...
TG(x) = Θ (x \integral_(1, x) ((ca_0 + ca_1 * u)/u^2 du))
= Θ (x [ - ca_0/u + ca_1 * log(u) ]_(1,x))
= Θ (- ca_0 + ca_1 * x * log(x) + ca_0 * x - ca_1 * x * log(1))
= Θ (x * log(x))
(*) Genau genommen dies nicht korrekt ist, da Grundrechenarten auf binäre Darstellungen und Speicherzugriff O(log n)
sind. Dies macht jedoch asymptotisch für Θ(n log n)
Komplexität keinen Unterschied.