我目前正在观看关于算法的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而且上述证据不正确,但为什么呢?
答案 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+1
或n → 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)
中,但它不是一个紧密的上限。为了证明更好的复杂性,你必须使用比感应更好的方法。
因此,这是通过使用归纳来抵消复杂性的更多示例。
总的来说,我不会说,没有可以通过归纳证明的复杂性,但在大多数情况下会有更好的方法来证明它。