我需要找到此函数的时间复杂度(以theta表示):
int x = 0;
for (int i=1; i < n ; i++) {
for (double j=i; j <= n ; j+=sqrt(i)) {
++x;
}
}
我知道外循环执行n-1次迭代,内循环执行(ni)/ sqrt(i)迭代,所以我需要计算i = 1到(ni)/ sqrt(i的n-1)的sigma )。知道怎么做吗?
编辑: 假设sqrt()在O(1)中运行。
答案 0 :(得分:0)
我不知道sigma和theta是什么意思,但是sqrt是一个恒定时间操作,所以它在大O符号中基本无关紧要,即j + = sqrt(i);与j + = i相同;与j + = 1相同;而且(n-k)〜= n对于k远小于n。这意味着当n变大时,n-i只是n。所以(n-i)* sqrt()= n * 1 = n。你为外循环做了n次这样n ^ 2.
<强>增加:强> 至于你复杂的系列,我确信这是准确的,但它不是我们关心的,我们关心操作的顺序。所以我们需要显示你的系列是O(n ^ 2)或K * n ^ 2。所以你有i + 2 * i + ...(n-1)* i + n * i。在我不变的情况下,我们可以将其分解并将其包装在K中,并留下1 + ... + n。该陈述由n支配,即当n变大n =(n-1),并且(n-1)〜=(n-2),这意味着(n-2)〜= n。现在这不成立,因为我们逼近零,但是n是如此之大,我们可以放弃第一个百万条。所以我们留下了一些看起来像的功能 C *(n-k)* n + c。其中C,k和c都是常数。由于我们不关心常数,我们只关心增长随着n的增长我们可以删除所有这些常量并且只保存n ^ 2。或者,你可以证明你的系列是由n ^ k * n限制的,其中k在n接近无穷大时变为1,但是一个好的逻辑参数通常更好。 〜奔