循环在n个项目(如数组)上然后在(n-1)然后(n-2)上循环的算法的复杂性等等:
Loop(int[] array) {
for (int i=0; i<array.Length; i++) {
//do some thing
}
}
Main() {
Loop({1, 2, 3, 4});
Loop({1, 2, 3});
Loop({1, 2});
Loop({1});
//What the complexity of this code.
}
以前的计划有多复杂?
答案 0 :(得分:3)
假设您在循环中执行的操作是O(1)
,其复杂性为O(n+(n-1)+(n-2)+...+1) = O(n(n+1)/2) = O(0.5n^2 + 0.5n) = O(n^2)
=
是算术序列和。=
是打开乘法的。=
是由于O()
中的多项式给定,您只需将其替换为x^highest_power
答案 1 :(得分:2)
<强>式强>:
n*(n+1)
n + ... + 1 = ─────────
2
<强>证明强>:
n + ... + 1 = S
2*(n + ... + 1) = 2*S
n + n-1 + ... + 2 + 1 +
1 + 2 + ... + n-1 + n = 2*S
n+1 + (n-1)+2 + ... + 2+(n-1) + 1+n = 2*S
n+1 + n+1 + ... + n+1 = 2*S
n*(n+1) = 2*S
S = n*(n+1)/2 = (n*n+n)/2
可是:
n*n n*n + n n*n
───── < ───────── = S < ─────── < n*n
2 2 2
n*n
(对于每个n
,但对于每个n > n0
来说都足够了<)n*n
位于 O(n 2 ) 从(1)和(2)=&gt;我们的总和是 O(n 2 )。
如果我们使用下限(n*n/2
),我们也可以说它是Ω(n 2 )然后是 Θ(N 2 )强>
正式定义
你也可以根据形式定义来证明这一点,但我发现上面的解释比较直观。
f(n)= O(g(n))表示存在正常数c和n0,因此对于所有n≥n0,0≤f(n)≤cg(n)。对于函数f,c和n0的值必须是固定的,并且不能取决于n。
f(n) = (n*n+n)/2
g(n) = n*n
只需选择n0 = 1
和c = 2
即可获得:
0 ≤ (n*n+n)/2 ≤ 2*n*n
0 ≤ n*n+n ≤ 4*n*n
0 ≤ n ≤ 3*n*n
对于每个n ≥ n0=1
来说显然都是正确的。
通常,如果在选择常量时遇到问题,请使用更大的值。例如:n0=10
,c=100
。有时它会更明显。