3

我需要找到这个函数的时间复杂度(以 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) 中运行。

4

1 回答 1

0

我不知道 sigma 和 theta 是什么意思,但是 sqrt 是一个常数时间运算,所以它在大 O 表示法中基本上没有关系,即 j+=sqrt(i); 与 j+=i 相同;与 j+=1; 相同。另外 (nk) ~= n 代表 k 远小于 n。这意味着当 n 变大时,ni 就是 n。所以 (ni) * sqrt() = n * 1 = n。你为外循环做了 n 次,所以 n^2。

添加: 至于你的复杂系列,我相信这是准确的,但这不是我们关心的,我们关心的是操作的顺序。所以我们需要证明你的系列是 O(n^2) 或 K*n^2。所以你有 i + 2*i + ... (n-1)*i + n*i。其中 i 是常数,因此我们可以将其分解并包含在 K 中,并留下 1 + ... + n。该语句由 n 主导,即当 n 变大时 n ~= (n-1) 和 (n-1) ~= (n-2),这意味着 (n-2) ~= n。现在,当我们接近零时,这并不成立,但是 n 太大了,我们可以删除第一个说百万项。所以我们留下了一些看起来像 C*(nk)*n + c 的函数。其中 C、k 和 c 都是常数。由于我们不关心常量,我们只关心随着 n 的增长而增长,我们可以删除所有这些常量并只保存 n^2。或者,您可以证明您的系列以 n^k*n 为界,其中随着 n 接近无穷大,k 变为 1,但一个好的逻辑论证通常更好。〜本

于 2012-04-13T21:17:31.397 回答