时间复杂度

1,546 阅读2分钟

是什么

  1. 是评估算法优劣的指标
  2. 是表示算法执行消耗的时间指标
  3. 是表示该算法执行时,随输入增长而执行次数增长的量级

有什么用

  1. 判断一个算法的优劣时,一般看执行结果是否精确,基础语句执行次数是否尽可能少,时间复杂度可以作为算法执行时间多少的评估指标,也就是说复杂度越低,算法越好

怎么算

时间复杂度定义: n称为问题的规模,当n不断变化时,时间频度T(n),也就是算法中的语句执行次数也会不断变化,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度
简单来说就是,输入的数据规模n越大,程序的基础语句执行次数越多,例:存在某个算法,当输入n=100,基础语句执行(n^2+2n+9次)次,保留与n有关的的最大数量级别,也就是n^2次,此时该算法的时间复杂度就是O(n^2)

还不懂?基础语句执行的次数是一棵树所有枝干,时间复杂度所表达的就是其中的所有主干,只关心其中的主干,其他的细枝末节全都抛弃不管。

时间复杂度的好坏次序

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

有哪些常见的时间复杂度

1. O(1)

Temp=i; i=j; j=temp;      

以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)

2. O(log2^n)也就是O(\log2^n)

while (i<=n)
       i=i*2; //语句1

设基础语句1的频度是f(n),则:2^f(n)<=n;f(n)<=log2n,取最大值f(n)=log2n,T(n)=O(log2n )

3. O(n)

for (i=1;i<=n;i++){
    console.log(i) //语句1
}

T(n)=2+n+3(n-1)=4n-1=O(n)

4. O(n^2)也就是O(n^2)

for(i=1;i<=n;i++){
    for(j=1;j<=n/2;j++){
        console.log(j)//语句1
    }
}    

因为语句1执行n * n/2=(1/2)n^2次,Θ((1/2)n^2)=n^2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)= =O(n^2);

5. O(n^3)也就是O(n^3)

for(i=1;i<=n;i++){
    for(j=1;j<=n;j++){
        for(k=1;k<=n;k++){
            console.log(k)//语句1
        }
    }
}   

因为语句1执行n * n * n=*n^3次,所以T(n)=O(n^3);

小作业

算出前端常见算法的时间复杂度,如冒泡排序,快速排序