说我有以下for循环:
for (int i = 1; i < n; i*=2) {
for (int j = 1; j < i; j*=2) {
//constant functions here
}
}
外循环将运行log(n)
次,我的问题是内循环将运行多少次。对于某些j
,我们可以将s
近似为2 s ,并且当2 s &lt;对于某些r
,我可以再次近似为2 r 。如果我们记录双方的日志,我们得到s&lt; r,这是第二个for循环停止的时候。基于此,我们可以说内循环运行不变吗?并且该函数运行的总次数仅为log(n)
?
答案 0 :(得分:0)
首先忽略外部循环,假设i = 4的值,内部循环将运行log(4)次,对于不同的i值,推广内部循环将运行log(i)次。现在考虑外部循环,i的值改变log(n)次。因此,复杂性是log(n)* log(i)或仅仅是(log(n))^ 2
答案 1 :(得分:0)
一句话答案是:记录 2 (n) 2
<强>证明强>
考虑 Log 2 (n)= k 所以我们在外循环的第一次迭代中,内部循环运行1
时因为i = 2
,在第二次迭代中,内部循环运行2
次因为i = 4
,并且......在第k次外循环迭代中,内部循环运行k
次,因为i = 2 k 所以你的迭代次数:
1 + 2 + ... + k = k(k+1)/2
所以答案是 O(Log 2 (n) 2 )