c - 以下代码的复杂度是多少?

标签 c performance algorithm time-complexity

找出以下代码的时间复杂度。 给出的答案是 O(log(n)*n^1/2),但我不明白。 我希望有人对此进行解释。

i=n;
while(i>0)
{
  k=1;
  for(j=1;j<=n;j+=k)
    k++;
  i=i/2;
}

最佳答案

取这段代码:

k=1;
for(j=1;j<=n;j+=k)
  k++;

j 在各种迭代中的值将是 1, 3, 6, 10, 15, 21, 28, ...

请注意,这些数字具有封闭形式 (m+1)(m+2)/2,其中 m 是经过的迭代次数。如果我们想知道这个循环将运行多少次迭代,我们需要求解 (m+1)(m+2)/2 = n,它有解 m = (sqrt (8n + 1) - 3))/2 = O(sqrt(n))。所以这个循环将运行 O(sqrt(n)) 次。

外循环将运行 O(log(n)) 次(这很容易看出)。所以总的来说,我们有 O(log(n)sqrt(n))

编辑:或者可能比直接求解 (m+1)(m+2)/2 = n 更容易,只需注意 (m+1)(m+2 )/2 = O(m^2),所以 O(m^2) = n 意味着 m = O(sqrt(n))

关于c - 以下代码的复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921828/

相关文章:

c - 如何查找文件的行数?

c++ - 将通用文件包含在一个头文件中有什么好处?

除 Math.round() 之外,Javascript 避免使用 0.2 + 0.4 = 0.6000000000000001

c# - 如果一个方法在 linq 查询中,它会被多次调用吗?

javascript - 查找给定位置的最近餐厅

c - 什么是 putchar ('0' + num);做?

c++ - C 库链接到 C++

c# - SharpCompress & LZMA2 7z 存档 - 特定文件的提取速度非常慢。为什么?备择方案?

php - 俄罗斯方 block

c++ - 如何从球坐标数据中找到球体/半球上的插值点