public static void complexityexample(int n) {
int count = 0;
int k = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
count++;
}
k *= 2;
for (int t = 0; t < n; t++) {
count++;
}
System.out.println(count);
}
}
有人能给我答案吗?
例如,我知道for循环中的nuber操作是2N + 2,
和count ++中的操作次数;是N
但是其他部分呢。
答案 0 :(得分:9)
时间复杂度为O(2n)
。瓶颈是:
for(int j = 0; j < k; j++){
count++;
}
由于k
i
每次迭代都会呈指数增长。
在i
'次迭代中,k = 2i-1
。这意味着将j
到k
的所有值都迭代为O(k) = O(2i)
。
现在,对所有迭代进行总结:
20 + 21 + 22 + ... + 2n-1 = 2n - 1
最后一次平等来自sum of geometric series
请注意下一个内循环:
for (int t = 0; t < n; t++) {
不影响时间复杂度(就渐近符号而言),因为它为O(n)
的每次迭代增加i
时间,并且这会被第一个内循环的指数行为快速抑制
如果你想在最后计算count
的值,它是第一个内部循环的总和,如上所述是(2n)-1
,第二个内部循环是{{ 1}}。
答案 1 :(得分:0)
<强>(2 ^ N)+(N * N)强>
因为它们的主循环是
for (int i = 0; i < n; i++) {
2 ^ n来自:
for (int j = 0; j < k; j++) {
count++;
}
和n * n来自:
for (int t = 0; t < n; t++) {
count++;
}
答案 2 :(得分:0)
第1行)1次操作。
第2行)2次操作。
第3行)1 + n + 1 + n = 2N + 2。
4)2N + 2
5)N
7)N
9)2 N + 2
10)N
13)1
这是对的。
在所有数学计算之后,最终结果是:14N ^ 2 + 22N + 11 - 操作。
答案 3 :(得分:0)
使用Sigma表示法的精确方法是:
经验证实:
当n = 10时,整体迭代次数为1123次。
当n = 25时,整体迭代次数为33555056。
当n = 50时,执行必须花费(我必须将变量类型从int更改为long)。
实际上,这种非多项式算法很昂贵。