关于for循环的时间复杂度

Posted linchongatfirst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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;

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

 

以上是关于关于for循环的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

for 循环的大 O 表示法简单问题

以下代码片段的算法复杂度

算法 关于算法的时间复杂度

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

是否会以O(n ^ 2)复杂度运行循环中的变量?

遇见的题目——关于时间复杂度