与log(n)行为混淆

时间:2018-06-03 17:40:26

标签: algorithm data-structures time-complexity big-o

{{1}}

我试图为上述算法建立大复杂性。外循环从 1 开始并运行到 n i 中的计数器每次迭代加倍,因此这是 log(n )行为。内部循环从 0 运行到 n ,具有 O(n)行为。我很困惑是否 O(n * log(n)),订单是否重要? j 也从0开始,而不是1,所以这不能是 O(n * log(n))

3 个答案:

答案 0 :(得分:3)

在这种情况下,内环独立于外环。因此,我们可以计算外循环运行的次数,然后将其乘以内循环运行的次数,这将是复杂性。

没有。外循环运行的次数为log2(n),因为每次都会将数字乘以2

没有。内循环运行的次数总是n

因此,复杂性将为O(nlog2(n))

答案 1 :(得分:3)

实际上,您可以在这样的简单情况下计算内循环运行的次数。它将为n更改提供渐近行为的良好指示。这是一个快速的javascript示例:



function count(n) {
    let count=0; 
    for(i=1; i<n; i=i*2) 
    { 
        for(j=0;j<n;j++)
        {
            count++
        } 
       
    }    
    return count
}
let n = 1024
console.log("n:", n, "iterations:", count(n),"nlog(n):", Math.log2(n) * n)

n = 32768
console.log("n:", n, "iterations:", count(n),"nlog(n):", Math.log2(n) * n)

n = 1048576
console.log("n:", n, "iterations:", count(n),"nlog(n):", Math.log2(n) * n)
&#13;
&#13;
&#13;

对我来说,行为看起来像O(nlog(n))。此外,由于log(n)

,每次执行n次迭代的O(nlog(n))循环执行n * log(n) === log(n) * n是合理的。

答案 2 :(得分:2)

  

我很困惑它是否是O(n * log(n))

是的,你是对的。就像你已经解释过的那样,外循环的 log(n)迭代和内循环的 n 迭代,所以 O(log(n)* n)总复杂性。

  

订单是否重要?

这里没关系。例如O(log(n)* n)== O(n * log(n))

  

j也从0开始,而不是1,所以这不能是O(n * log(n))

不会影响复杂性。当N变为无穷大时,从0开始或从1开始没有任何区别。