基于比较的排序是 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) 。
答案 0 :(得分:6)
比较线性搜索为O(1)的“证明”。
这里的问题是,为了使归纳起作用,必须有一个大O常数,它既适用于假设,也适用于结论。这在这里是不可能的,你的证据是不可能的。
答案 1 :(得分:4)
“证明”仅涵盖单次传递,但不包括 log n 传球次数。
重复次数仅显示通过的成本与上一次通过的成本相比。为了正确,递归关系应该具有累积成本而不是增量成本。
处的示例合并排序,您可以查看证明所在的位置答案 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()的常数因子:这个常数因素直接影响你的分而治之的复发!