N + N / 2 + N / 4 ...迭代运行时

时间:2014-10-16 12:41:26

标签: time runtime iteration complexity-theory

我正在查看一个代码示例,该代码示例遍历大小为N的数组。

  • 第一次迭代,我将浏览所有元素 - > Ñ
  • 下一次迭代,我只会通过数组的一半 - > N / 2
  • ...

这一直持续到我必须经历的数组大小达到1。

这个运行时会是O(N)吗?还是O(NlogN)?

我以为它会是O(NlogN),但书中说这只是O(N)。

1 个答案:

答案 0 :(得分:0)

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3};

  for (unsigned n(v.size()); n; n /= 2)
  {
    for (unsigned i(0); i < n; ++i)
      std::cout << v[i];

    std::cout << std::endl;
  }
}

此程序在每一行打印部分π(第一行n数字,......,最后一行1数字):

  

3141592653589793

     

31415926

     

3141

     

31

     

3

它打印的总位数是31 = v.size() * 2 - 1

通常,给定大小为N(N = 2 k )的向量,内部指令(std::cout << v[i])执行2N - 1次({ {1}}):

O(N)

如果N + N/2 + N/4 + ... + 2 + 1 = 2N - 1 不是2的幂,你必须对公式进行一些小的调整,但复杂性保持不变。