Igo*_*sky 2 algorithm complexity-theory big-o
我试图获取以下代码片段的正确Big-O:
s = 0
for x in seq:
for y in seq:
s += x*y
for z in seq:
for w in seq:
s += x-w
Run Code Online (Sandbox Code Playgroud)
根据我从(Python算法)得到这个例子的书,他们解释如下:
z循环运行一系列线性迭代,并且它包含一个线性循环,因此总复杂度为二次方或Θ(n 2).y环显然是Θ(n).这意味着x循环内的代码块是Θ(n + n 2).整个块执行x循环的每一轮,运行n次.我们使用乘法规则得到Θ(n(n + n 2))=Θ(n 2 + n 3)=Θ(n 3),即立方.
我不明白的是:O(n(n + n 2))怎么会变成O(n 3)?数学是否正确?
这里完成的数学运算如下.当你说O(n(n + n 2))时,这相当于通过简单地在整个产品中分配n 来说O(n 2 + n 3).
O(n 2 + n 3)= O(n 3)的原因来自big-O表示法的正式定义,如下所示:
函数f(N)= O(G(N))当且仅当存在常数n 0和c,使得对于任意的n≥Ñ 0,| F(N)| ≤c| g(n)|.
非正式地说,这表示当n变得任意大时,f(n)从上面以g(n)的常数倍为界.
为了正式证明n 2 + n 3是O(n 3),考虑任何n≥1.然后我们得到
Ñ 2 + N 3 ≤Ñ 3 + N 3 = 2 3
所以我们得到n 2 + n 3 = O(n 3),其中n 0 = 1且c = 2.因此,我们有
O(n(n + n 2))= O(n 2 + n 3)= O(n 3).
为了真正形式化,我们需要证明,如果f(n)= O(g(n))和g(n)= O(h(n)),那么f(n)= O(h( N)).让我们来看看这个证明.如果F(N)= O(G(N)),有常数n 0和c,使得对于n≥Ñ 0,| F(N)| ≤c| g(n)|.类似地,由于G(N)= O(H(N)),有常数n ' 0,C',使得对于n≥N ' 0,G(N)≤C' | H(N)|.所以这意味着对于任何n≥max(c,c'),我们都有
| F(N)| ≤c| g(n)| ≤c| c'h(n)| = cxc'| h(n)|
所以f(n)= O(h(n)).
为了更精确一些 - 在这里描述的算法的情况下,作者说运行时是Θ(n 3),这比运行时为O(n 3)的结果更强.Θ符号表示紧密的渐近界,意味着运行时以与n 3相同的速率增长,而不仅仅是它从上面以n 3的某个倍数为界.为了证明这一点,你还需要证明n 3是O(n 2 + n 3).我会将此作为练习留给读者.:-)
更一般地说,如果你有任何 k阶多项式,那么多项式是O(n k),使用类似的参数.为了看到这一点,设P(n)=Σi = 0 k(a i n i).那么,对于任何n≥1,我们都有
Σi = 0 k(a i n i)≤Σi = 0 k(a i n k)=(Σi = 0 k(a i))n k
所以P(n)= O(n k).
希望这可以帮助!
O(n(n+n^2)) = O(n^2 + n^3)
Run Code Online (Sandbox Code Playgroud)
由于该n^3术语在该术语中占主导地位n^2,因此该n^2术语可以忽略不计,因此可以忽略不计O(n^3).