【问题标题】:Time complexity when j+=sqrt(i)j+=sqrt(i) 时的时间复杂度
【发布时间】:2012-04-13 20:57:58
【问题描述】:

我需要找出这个函数的时间复杂度(以 theta 为单位):

int x = 0; 
for (int i=1; i < n ; i++) { 
  for (double j=i; j <= n ; j+=sqrt(i)) { 
    ++x; 
  } 
}

我知道外循环进行 n-1 次迭代,而内循环进行 (n-i)/sqrt(i) 迭代,所以我需要计算 i=1 的 sigma 到 (n-i)/sqrt(i) 的 n-1 )。知道该怎么做吗?

编辑: 假设 sqrt() 在 O(1) 中运行。

【问题讨论】:

  • “在 theta 方面”是什么意思?
  • 参考这个页面:en.wikipedia.org/wiki/… - 上面写着 Big Theta。
  • "in terms of theta" 意味着您想要找到复杂度作为 theta 的函数,但没有变量 theta。我假设您的意思是说您想以“n”的形式找到 Big Theta 时间复杂度

标签: nested complexity-theory sqrt


【解决方案1】:

我不知道 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。其中 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 为界,其中随着 n 接近无穷大,k 变为 1,但一个好的逻辑论证通常更好。 〜本

【讨论】:

  • 西格玛是指总和(一系列的)。无论如何,即使 n 很大,i 仍然会从 1 变为 n,因此必须考虑到这一点。 j 以这种方式改变值: i, i+sqrt(i), i+2sqrt(i)+...+i+ksqrt(i) 直到 i+ksqrt(i) > n .这与外部循环一起形成了这个系列:wolframalpha.com/input/?i=sum+i%3D1+to+n+of+(n-i)%2Fsqrt(i)
  • 你如何得出 sqrt 是一个常数时间运算的结论?
  • sqrt 不会随着 n 的增长而改变执行所需的时间,因此它是恒定的时间 wrt n。即 sqrt(2) 和 sqrt(1000000);都是一个操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-06-09
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多