我正在查看一个代码示例,该代码示例遍历大小为N的数组。
这一直持续到我必须经历的数组大小达到1。
这个运行时会是O(N)吗?还是O(NlogN)?
我以为它会是O(NlogN),但书中说这只是O(N)。
答案 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的幂,你必须对公式进行一些小的调整,但复杂性保持不变。