为什么感应始终不适用于Big-O?

时间:2014-08-23 07:24:05

标签: algorithm big-o

我目前正在观看关于算法的ocw视频课程,在第二讲课中我坚持认为教授通过归纳证明以下陈述: -

N = O(1)

proof:-    

For base case    
1=O(1)    
suppose n-1 = O(1)    
=> 1+(n-1)=O(1)+O(1)     
=> n=O(1).    
hence it is proved.    

但教授告诉我们,我们不能引导Big-O而且上述证据不正确,但为什么呢?

3 个答案:

答案 0 :(得分:4)

可以导入Big-O,但当n是变量而不是常量时,给定的归纳过程不正确。

当你写1 = O(1)时,解释将是

if f_1(n) = 1 for all n then f_1(n) = O(1)

这是正确的。

现在,如果我们为所有f_a(n) = a定义n,那么通过归纳,我们可以证明f_a(n) = O(1)适用于所有a,这也是正确的。

但如果n不是常数而是变量,则由于您的归纳而无法获得n = O(1),因为k没有f_k(n) = n n对于所有{{1}}。

答案 1 :(得分:3)

数学归纳是一种证明由整数参数化的语句的工具。它不能应用于这种情况,因为你正在研究的语句改变了一半:你以常数1作为基本情况,然后假设一个关于函数的声明 f(n)= n- 1。

证明任何常数 n在O(1)中都是正确的。

答案 2 :(得分:0)

基本上,数学归纳是一种工具,可以从众所周知的位置进一步获得可控制的步骤。这不一定是n → n+1n → 2⋅n之类的步骤,但很可能就是这样。在大多数情况下,问题是,可控制的步骤具有恒定的大小,因此在Big-O中它只会丢失。

但在某些情况下,您可以在计算复杂性时使用Big-O进行简化,例如

(n+a+1)(n-2⋅b)(n2-3) = n4+O(n3)                (for constants a and b)

还有一些情况,您可以看到感应步骤中的复杂性。

示例:
找出f(n) = f(n-1) + f(n-2)的复杂度,其中n≥2且f(0) = f(1) = 1 步骤n → n+1产生

2⋅f(n-1) ≤ f(n+1) ≤ 2⋅f(n)  

基本上,+1的大小加倍。您需要n +1来总结n,这会使第一个值加倍n次。开头(f(1))位于O(1),因此2n ⋅ O(1)位于O(2n)

最后,在某些情况下,您可以通过归纳来证明复杂性。

示例:
找出n!的复杂性。
证明:1在O(1)。假设(n-1)!位于O(1)。然后

n! = n⋅(n-1)! = n * O(1) = O(n). 

该死的,n!不能在O(1),因为(n+1)!必须也在O(1),但事实并非如此。接下来尝试:
假设(n-1)!位于O(nk)

n! = n⋅(n-1)! = n ⋅ O(nk) = O(nk+1)
该死的,又失败了。如果n!位于O(nk),则(n+1)!应该在

O((n+1)k) = O(nk + k⋅nk-1 + ...[smaller monomials]) = O(nk)

但对于k = n,这可行,因为对于n!中的O(nn)(n+1)!应该位于O((n+1)n+1)中,实际上n!在} O(nn)中,但它不是一个紧密的上限。为了证明更好的复杂性,你必须使用比感应更好的方法。

因此,这是通过使用归纳来抵消复杂性的更多示例。

总的来说,我不会说,没有可以通过归纳证明的复杂性,但在大多数情况下会有更好的方法来证明它。