【问题标题】:Recurrence for Merge Sort vs time complexity [closed]合并排序与时间复杂度的重复[关闭]
【发布时间】:2013-12-22 21:38:19
【问题描述】:

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

我正在学习递归关系,我正在尝试做的一个例子是归并排序。我已经做了好几次递归关系,我一直得到的结果是 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

任何指导将不胜感激!

【问题讨论】:

标签: algorithm sorting recursion mergesort recurrence


【解决方案1】:

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

看这个图:

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

你有logN 层。所以整体复杂度是O(NlogN)

【讨论】:

    【解决方案2】:

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

    正确的归并排序循环是:

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

    最后一个 N 因素来自线性时间的合并步骤。

    试试这个重复。您应该从额外的合并步骤中获得 O(N logN)

    【讨论】:

    • 啊,一定是这样。谢谢
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多