Func(n)
{
i = n
while(i>=1)
g(i);
i = i/3;
}
这种算法的复杂性是什么? (而g(n)的复杂度是theta(n²)) 我假设更大的n你说复杂性是
n²+(n / 3)²+(n /3²)²+(n /3³)².....无穷大。
答案是theta(n²)。 这是真的吗?
答案 0 :(得分:3)
正如您所观察到的,循环运行如下。
Iteration 1: n^2 = n^2/3^0
Iteration 2: (n/3)^2 = n^2/3^2
Iteration 3: (n/3^2)^2 = n^2/3^4
Iteration 4: (n/3^3)^2 = n^2/3^6
...
Iteration k: (n/3^(k-1))^2 = n^2/3^(2*(k-1))
使用几何级数求和的公式,我们得到的总时间是
T(iteration1) + T(iteration2) + ... + T(Iterationk)
term 1 = n^2
ratio = 1/9
sum = 9 * n^2 / 8
当K是一个可以假定为无穷大的大数时。
由于Big O表示法忽略常量,
O( 9* n^2 /8) = O(n^2)
答案 1 :(得分:1)
让我们看一下我们手中的系列。
=> n² + (n²/3) + (n/3)² + (n/3²)² + (n/3³)².....
taking n² common
=> n² * [ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]
由于[ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]
是递减系列,它等于1
。
因此答案是O(n²)
<小时/> 编辑1:
证明系列[ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]
的总和,在下面。
答案 2 :(得分:1)
严格地说,i
是一个整数,很快就会变成0
(在floor(log3(n)
之后)迭代),所以没有理由去无限。
无论如何,考虑i
作为理性结果,近似的真实公式不会改变渐近行为,仍然是O(n²)。近似以两种方式出现
i / 3可能与楼层(i / 3)不同;
可以加入无穷大;小于1的条件只会增加到4/3,这是完全可以忽略的。