我对作业有这个问题。
确定嵌套循环的时间复杂度
for(int i=1; i<=n; i=2*i){
for(int j=1; j<=i; i=2*j){
stuff
}
}
我明白,随着i和j增加2倍,复杂性将成为log2(n)* log2(n)的行,但是内部循环运行到i而不是n我完全丢失了
我需要知道嵌套循环的复杂性以及如何解决它的一步一步。
答案 0 :(得分:2)
内部循环运行log(i) + 1
次(日志库2)。
添加外部循环,将上面的内容加到i = 1, 2, 4, ... n
。
所以:(log(1) + 1) + (log(2) + 1) + (log(4) + 1) + ... + (log(n) + 1)
是:1 + 2 + 3 + ... + log(n)
使用算术系列的总和是:(log(n) + 1) * (log(n) + 2) / 2 = (log(n)*log(n) + 3log(n) + 2) / 2 = O(log(n) * log(n))
答案 1 :(得分:0)
我们假设n = 16,例如,我将得到值i = 1, 2, 4, 8, 16
。
所以:我基本上把值作为log(n),即log(16),即五次迭代。
现在对于j的值,它的值为log(1) + log(2) + log(4) + log(8) + log(16)
。它基本上等于每次迭代中的log(i)。
因此,结合我们从上述两个语句中得到的值,我们可以说上面代码的时间复杂度为O(log(n) * log(i))
。
这是我对代码的理解。