{{1}}
我试图为上述算法建立大复杂性。外循环从 1 开始并运行到 n , i 中的计数器每次迭代加倍,因此这是 log(n )行为。内部循环从 0 运行到 n ,具有 O(n)行为。我很困惑是否 O(n * log(n)),订单是否重要? j 也从0开始,而不是1,所以这不能是 O(n * log(n))?
答案 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;
对我来说,行为看起来像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开始没有任何区别。