关于for循环的时间复杂度

  今天在看算法时,遇见了一些问题,想了很久,现总结如下,关于for循环的时间复杂度。我们知道当一重for循环时

package Suanfa;

public class Fortest {
  public static void main(String[] args) {
      int n=100,count=0;
    for(int i=0;i<n;i++) {
        if(true) {
            count++;
        }
    }
}
}

这是最简单的for循环,count执行n次,时间复杂度是N;

如果是for的二重循环呢

package Suanfa;

public class Fortest {
    public static void main(String[] args) {
        int k=100 ,count=0;
        for(int i=0;i<k;i++)
            for(int j=i+1;j<k;j++)
                {
                    if(true)
                        count++;
                }
        System.out.println("k值为:"+k);
        System.out.println("count值为    :"+count);
    }
}

 可以看见count输出4950;一般刚接触时,就会觉得这事件复杂度是n的平方,当然一般这样说也没错,但是你有没想过,为什么k输入是100时,count输出是4950,如果k是其他值呢,

count又会是什么,两者之间有什么关系?如果for是三重循环又会是怎样呢?

三重循环的情况如下:

package Suanfa;

public class Test {
    public static void main(String[] args) {
        int k=100 ,count=0;
        for(int i=0;i<k;i++)
            for(int j=i+1;j<k;j++)
                for(int x=j+1;x<k;x++)
                {
                    if(true)
                        count++;
                }
        System.out.println("k值为:"+k);
        System.out.println("count值为    :"+count);
        
    }

}

 

可以看见count输出为161700,当然你也可以试着把k改小一点,当然你要试着探究k和count的关系,在二重for循环、三重for循环、甚至

更多for的情况下,现在我们先讨论二重for循环下 的情况:假定k值为n;那么要使if语句能够执行;需满足

i    0   1  2  3  ...... n-2  n-1

j   1   2        3       4      ......   n-1.     

当i为0时,j可取1到n-1,使得if语句能够有效执行;同理i=1时,j可取2到n-1;

i=0;  j = 1,2,3,4.....n-1;(if语句执行 (n-1)-1+1 次  即 n-1次)

i =1 ,j =2,3,4....n-1;  (if语句执行 (n-1)-2+1 次  即n-2次)

i=2 , j =3,4,5...n-1;

...

i=n-2,j =n-1  (if语句执行一次)

可得if语句执行的总次数为:  (n-1+1)(n-1-1+1)/2 = (n-1)*n/2,你也可以理解为C(2 n)(姑且这样表示吧),这个东东不知道怎么表示,就是和二项式系数有关的那个,2是上角标,n是下角标;

C(2 n)=n*(n-1)/(2*1);

三重循环时:假定k值为n;那么要使if语句能够执行;需满足:

i    0   1  2  3  ......         n-3  

j   1   2        3       4      ......          n-2.     

x   2  3  4  5  ........        n-1

经过如上推算,可得 if语句执行总次数为  C(3 n) = n*(n-1)*(n-2)/(3*2*1)=n*(n-1)*(n-2)/6;

四重for循环 , 可得 if语句执行总次数为    C(3 n) = n*(n-1)*(n-2)*(n-4)/(4*3*2*1)=n*(n-1)*(n-2)/24;

如果你觉得哪里不对,可以指出,欢迎评论,本文将不定期更新。

 

转载于:https://www.cnblogs.com/linchongatfirst/p/9249090.html

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值