加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 具有log n复杂度的外部循环的两个依赖循环的复杂度

发布时间:2020-12-14 05:46:39 所属栏目:Java 来源:网络整理
导读:问题 计算这个算法的复杂性: for(i=n; i1;i=i/2) for(j=i;jn;j++){ statement; } 以前我对此主题做了些什么: 第一个循环运行logn时间. 第二个循环运行n-i次,i从n开始,并在每个外循环迭代中改变为i / 2.所以内循环运行如下: n-n 0 timesn - n/2 n/2 timesn
问题

计算这个算法的复杂性:

for(i=n; i>1;i=i/2)
   for(j=i;j<n;j++){
         statement;
   }

以前我对此主题做了些什么:

第一个循环运行logn时间.
第二个循环运行n-i次,i从n开始,并在每个外循环迭代中改变为i / 2.所以内循环运行如下:

n-n                             0 times

n - n/2                        n/2 times

n - n/4                        3n/4 times

n - n/8                        7n/8 times

n - n/16                     15n/16 times

等等

n – 1次

所以一般的术语是n *((2 ^ n)-1)/(2 ^ n)

现在这个序列不是算术和几何.因此,n / 2 *(a l)的公式不能应用于它.如何进一步处理此解决方案或错误,那么正确的方法是什么.

注意:如果应用n / 2 *(a l),则得到的复杂度为-n /(2 ^ n)= O(2 ^ n).

解决方法

你在正确的轨道上.正如你所说,内循环将运行日志n次.所以,它运行的总次数是:
(n - n/2) + (n - n/4) + ... (log n) times
  = n*(log n) - (n/2 + n/4 + n/8 + ... up to 1)
  = n*(log n) - n*(1/2 + 1/4 + ...)
 <= n*(log n) - n because (1/2 + 1/4 + ...) is 1 even if we take all terms till infinity (G.P)
  = n(log n - 1),which is O(n*log(n))

记住,当计算复杂性时,你总是在寻找上限,而不是精确的数字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读