我希望得到一些澄清......
我正在学习递归关系,我试图做的一个例子是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
任何指导将不胜感激!
答案 0 :(得分:3)
merge sort的时间复杂度既不是O(N)
也不是O(logN)
,而是O(NlogN)
。
见图:
对于每个图层,您必须检查每个N元素以将其放在正确的位置。它需要O(N)
。
你有logN
层。因此总体复杂度为O(NlogN)
。
答案 1 :(得分:2)
你的复发有点过了。您的重复(以及您发布的链接)描述的情况是,您可以检查您应该合并的两个子阵列是否已经正确排序,在这种情况下,您确实得到 O(N)因为合并步骤是恒定时间(你什么都不做)。
正确的mergesort重复是:
T(N)= 2 * T(N / 2)+ N
最后 N 因子来自合并步骤,即线性时间。
尝试重复这种情况。你应该从额外的合并步骤中获得 O(N logN)。