は、古典的マージの要旨は、以下の再帰であることを証明:
- スプリット半分に順不同リスト。 部分リストの限界オフセットを計算すれば十分です。
- 部分リストのそれぞれにマージソートを適用します。
この手順を実行すると、部分リストがソートされます。
- ソートされた部分リストをマージするには、両方のリストの要素をそれぞれの順序で検査し、より小さい要素を持つリストからコイピングし、進行します。
を古典的なmergesortの複雑さとします。前述の手順は、それぞれO(1)
(*)、2*O(TC(ceil(n/2)))
、およびO(n)
となります。これは再帰に役立ちますTC(n) = cc_0 + cc_1 * n + 2 * TC(ceil(n/2))
。
リストが不均等に分割されている一般化されたマージソートを考えてみましょう。分割およびマージの複雑さは、(TG(x+1)
代わりにTG(ceil(x))
を使用して、ca_0
、ca_1
はO(_)
表記に隠された定数である。mergesort_1/3
用a=3
)一般マージするための再帰TG(n) = ca_0 + ca_1 * n + TG(1/a * n + 1) + TG((a-1)/a * n + 1))
への融資、同じままです。
この再発は、Akra-Bazzi-Methodを使用して解決できます。この目的のために は、再発は
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.
はAkra-Bazzi定理が必要です...設定することによって行うことができます
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)
で
TG(x) = g(x) + \sum_i=1..k (a_i * TG(b_i * x + h_i(x)) ; x >= x_0.
として書き込まれる必要があります指数p
は\sum_i=1..k (a_i * (b_i)^p) = 1
にあります。そして、以下が成り立つ:
TG(x) = Θ (x^p \integral_(1, x) (g(u)/(u^(p+1)) du))
具体的には、
a_1 * b_1^p + a_2 * b_2^p = 1
=> (1/a)^p + ((a-1)/a)^p = 1
<=> p = 1
...とこれを...
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))
(*)厳密にバイナリ表現とメモリアクセスの基本的な算術演算がO(log n)
あるので、これは間違っている話します。しかしながら、これは複雑さに関して漸近的に差を生じさせない。