假设运行时分析简单,需要解释

时间:2014-01-23 20:06:07

标签: algorithm code-analysis

根据今天的讲座,第一个循环具有订单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)
} 

有人可以详细说明原因吗?

2 个答案:

答案 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的函数执行的次数计算的(输入大小。)

  1. Input size = n for循环在O(N)中运行,并且运行O(N)*O(1)因此整体O(N)

  2. 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)