这个归纳证明,mergesort是O(n)有什么问题?

时间:2011-11-14 20:26:32

标签: algorithm proof induction

基于比较的排序是 nlog(n) 的大o,所以我们知道mergesort不能 O(n) 即可。不过,我无法通过以下证据找到问题:

提案 P(n) :对于长度 n 的列表,mergesort需要 < em> O(n) 时间。

P(0) :空列表中的合并排序只返回空列表。

强烈归纳:假设 P(1),...,P(n-1) 并尝试证明 P(n) 即可。我们知道在递归mergesort的每一步,两个大约“半列表”被合并,然后“压缩”。通过归纳,每个半列表的合并排序采用 O(n / 2)时间 。压缩需要 O(n) 时间。因此该算法具有 M(n)= 2M(n / 2)+ O(n) 的递归关系,其 2O(n / 2)+ O(n) O(n)

3 个答案:

答案 0 :(得分:6)

比较线性搜索为O(1)的“证明”。

  1. 空数组的线性搜索是O(1)。
  2. 非空数组上的线性搜索比较第一个元素(O(1)),然后搜索数组的其余部分(O(1))。 O(1)+ O(1)= O(1)。
  3. 这里的问题是,为了使归纳起作用,必须有一个大O常数,它既适用于假设,也适用于结论。这在这里是不可能的,你的证据是不可能的。

答案 1 :(得分:4)

“证明”仅涵盖单次传递,但不包括 log n 传球次数。

重复次数仅显示通过的成本与上一次通过的成本相比。为了正确,递归关系应该具有累积成本而不是增量成本。

通过查看http://en.wikipedia.org/wiki/Merge_sort

处的示例合并排序,您可以查看证明所在的位置

答案 2 :(得分:3)

以下是关键:所有引用n的特定值的归纳步骤必须引用特定函数T(n),而不是O()表示法!

O(M(n))表示法是关于整个函数从问题大小到性能保证的行为的陈述(渐近地,n增加无限制)。您的归纳的目标是确定性能界限T(n),然后可以将其简化(通过将常数和低阶因子降低)到O(M(n))。

特别是,你的证明的一个问题是,你无法从你的陈述中纯粹地将O()回到关于给定n的T(n)的陈述。 O()表示法允许您忽略整个函数的常量因子;在递归构造相同的函数时,它不允许你一遍又一遍地忽略常量因子......

通过演示:

,您仍然可以使用O()表示法来简化证明
T(n) = F(n) + O(something less significant than F(n))

以通常的归纳方式传播这个谓词。但是你需要保持F()的常数因子:这个常数因素直接影响你的分而治之的复发!