【问题标题】:N+N/2+N/4... iteration runtimeN+N/2+N/4... 迭代运行时间
【发布时间】:2014-10-16 12:41:25
【问题描述】:

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

  • 第一次迭代,我正在遍历所有元素 -> N
  • 下一次迭代,我只遍历数组的一半 -> N/2
  • ...

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

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

我以为是 O(NlogN),但书上说只有 O(N)。

【问题讨论】:

    标签: time runtime iteration complexity-theory


    【解决方案1】:
    #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 = 2k) 的向量,内部指令 (std::cout &lt;&lt; v[i]) 会执行2N - 1 次 (O(N)):

    N + N/2 + N/4 + ... + 2 + 1 = 2N - 1
    

    如果N 不是 2 的幂,则必须对公式进行一些小的调整,但复杂度保持不变。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多