時間複雜度

是什麼

  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)bash

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);spa

小做業

算出前端常見算法的時間複雜度,如冒泡排序,快速排序code

相關文章
相關標籤/搜索