条件变化时嵌套的时间复杂度

时间:2018-11-07 12:13:11

标签: algorithm time-complexity

我正在尝试解决此循环的复杂性

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次,而会重复我无法提出的多次,所以我不知道如何解决。

1 个答案:

答案 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))