我正在尝试解决此循环的复杂性
for(int i= 0; i < n; i++) {
c = i;
while(c > 1){
O(1);
c = c / 2;
}
}
随着while条件在每个循环中的变化,我不知道如何计算这个奇怪的序列。
我的意思是,如果循环在哪里
for(int i= 0; i < n; i++) {
c = n;
while(c > 1){
O(1);
c = c / 2;
}
}
我知道while的复杂度为O(logn),并且自身重复n次,因此复杂度为O(nlogn)。
我上一个循环遇到的问题是“ c = i”。当c = i时,第一次(c = 0)循环将重现0次,当c = 1时,循环将重现0次,当c = 2时,循环将重现1次,然后序列将为0, 0、1、2、2、3、3 ...(每次for循环都进行复制)
O(logn)不会重复n次,而会重复我无法提出的多次,所以我不知道如何解决。
答案 0 :(得分:4)
这需要一些数学运算。鉴于为a和b定义了正确的日志:
log(a) + log(b) = log(ab)
这里有
log(1) + log(2) +....+ log(n) = log(1*....*n) = log(n!)
日志(n!)有一个mathematical approximation,即
log(n!) ~ nlog(n) - n + 1
其中显示O(log(n!)= O(nlog(n))