zoukankan      html  css  js  c++  java
  • 关于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;

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

    好好生活,天天向上
  • 相关阅读:
    二项式定理与组合恒等式
    「CEOI2020」象棋世界 题解
    矩阵 题解
    研一总结
    你明白transform中的skew属性是何如变换的吗?
    pip安装包
    Yaml中特殊符号"| > |+ |-"的作用
    使用ROOT用户运行Jenkins
    检查MySQL主从复制运行状态
    powerdesigner 怎么逆向生成 pdm文件
  • 原文地址:https://www.cnblogs.com/linchongatfirst/p/9249090.html
Copyright © 2011-2022 走看看