【发布时间】:2014-10-16 12:41:25
【问题描述】:
我正在查看一个遍历大小为 N 的数组的代码示例。
- 第一次迭代,我正在遍历所有元素 -> N
- 下一次迭代,我只遍历数组的一半 -> N/2
- ...
这样一直持续到我必须经过的数组的大小达到 1。
运行时间会是 O(N) 吗?还是 O(NlogN)?
我以为是 O(NlogN),但书上说只有 O(N)。
【问题讨论】:
标签: time runtime iteration complexity-theory
我正在查看一个遍历大小为 N 的数组的代码示例。
这样一直持续到我必须经过的数组的大小达到 1。
运行时间会是 O(N) 吗?还是 O(NlogN)?
我以为是 O(NlogN),但书上说只有 O(N)。
【问题讨论】:
标签: time runtime iteration complexity-theory
#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 << v[i]) 会执行2N - 1 次 (O(N)):
N + N/2 + N/4 + ... + 2 + 1 = 2N - 1
如果N 不是 2 的幂,则必须对公式进行一些小的调整,但复杂度保持不变。
【讨论】: