根据今天的讲座,第一个循环具有订单O(n)
的运行时,而第二个循环具有订单O(log(n))
的运行时。
for (int i = 0; i < n; i++) { // O(n)
stuff(); // O(1)
}
for (int i = 1; i < n; i*=4) { // O(log(n))
stuff(); // O(1)
}
有人可以详细说明原因吗?
答案 0 :(得分:5)
第一个循环将完成n
次的恒定时间操作。因此它是O(n)
。
第二个循环(从i = 1
而不是i = 0
开始,你有一个我修复的拼写错误)执行i
的正文设置为1,4,16,64,..即4 ^ 0,4 ^ 1,4 ^ 2,4 ^ 3,......直到n
。
4^k < n
时{p> k < log_4(n)
。因此,第二个循环的主体执行O(log(n))
次,因为log base 4和log base e仅相差恒定系数。
答案 1 :(得分:0)
时间复杂度是根据代码中所有单位时间语句作为n的函数执行的次数计算的(输入大小。)
Input size = n
for循环在O(N)
中运行,并且运行O(N)*O(1)
因此整体O(N)
for循环运行到4^k-1 < n
,其中k
是迭代次数。在不平等的两边取log
,我们得到(k-1)*log4 < logn, k < logn/log4 +1, k=O(logn)
,因为log4
是不变的。材料在O(logn)*O(1)
中运行,因此整体O(logn)