合并排序与时间复杂度的重复发生

时间:2013-12-22 21:38:19

标签: algorithm sorting recursion mergesort recurrence

我希望得到一些澄清......

我正在学习递归关系,我试图做的一个例子是mergesort。我已经多次完成了递归关系,我得到的结果是O(N),即使教科书说它是O(Log(N))。

Mergesort重现:

T(1)= 1 T(N)= 2 * T(N / 2)+ c

经过几次迭代后,我得到......

2 ^ k * T(N / 2 ^ k)+ C * sum(i = 0 - > k-1)2 ^ i

当我求解k时,我得到log2(N),所以我可以通过以下方式简化:

(2 ^ log2(N))* T(N / 2 ^ log2(n))+ C * sum(i = 0 - > k - log2(n)-1)2 ^ i =

N * T(N / N)+ C(N-1)= N * d + CN + N

归结为O(N)

无论其

根据我的教科书,Mergesort应为O(log(N))。

我的计算有问题吗?

我还发现有人在这里做了同样的关系并得到了完全相同的结果:http://courses.cs.washington.edu/courses/cse326/06su/lectures/lecture13_proofs.pdf

任何指导将不胜感激!

2 个答案:

答案 0 :(得分:3)

merge sort的时间复杂度既不是O(N)也不是O(logN),而是O(NlogN)

见图:

enter image description here

对于每个图层,您必须检查每个N元素以将其放在正确的位置。它需要O(N)

你有logN层。因此总体复杂度为O(NlogN)

答案 1 :(得分:2)

你的复发有点过了。您的重复(以及您发布的链接)描述的情况是,您可以检查您应该合并的两个子阵列是否已经正确排序,在这种情况下,您确实得到 O(N)因为合并步骤是恒定时间(你什么都不做)。

正确的mergesort重复是:

T(N)= 2 * T(N / 2)+ N

最后 N 因子来自合并步骤,即线性时间。

尝试重复这种情况。你应该从额外的合并步骤中获得 O(N logN)