時間復(fù)雜度的通俗講法

時間頻度:

一個算法花費(fèi)的時間與算法中語句的執(zhí)行次數(shù)成正比,我們將算法中的語句執(zhí)行次數(shù)稱為語句頻度或時間頻度,記為T(n),n稱為問題的規(guī)模.

在時間頻度中,當(dāng)n不斷變化時,時間頻度T(n)也會不斷變化,但有時我們想知道隨著問題的規(guī)模n的不斷增加,運(yùn)行時間呈現(xiàn)怎樣的變化規(guī)律,為此,引入了時間復(fù)雜度.

時間復(fù)雜度:
  • 一般情況下,算法中基本操作重復(fù)執(zhí)行的次數(shù)是問題規(guī)模n的某個函數(shù),用T(n)表示,若有某個輔助函數(shù)f(n),使得當(dāng)n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數(shù),則稱f(n)T(n)的同數(shù)量級函數(shù)。記作T(n) = O(f(n)),稱O(f(n))為算法的時間復(fù)雜度.
  • 數(shù)學(xué)上定義:存在大于0的常數(shù)C和非負(fù)整數(shù)n',使得對于任意的n >= n'來說,T(n) <= C * f(n),表示為T(n) = O(f(n));
  • 簡單來說:
    O(n2)表示當(dāng)n很大的時候,復(fù)雜度約等于C * n2,C是某個常數(shù);
    O(n)是說n很大的時候復(fù)雜度約等于C * n,C是某個常數(shù).
  • 例如,O(2n2 + n + 1) = O (3n2 + n + 3) = O (7n2 + n) = O(n2),一般都只用O(n2)表示就可以了.
時間復(fù)雜度n2比對

圖中4條曲線分別表示4種不同的執(zhí)行次數(shù)表達(dá)式,從圖中可以看出,只要最高項(xiàng)的階數(shù)相同,4種表達(dá)式值受其他項(xiàng)的影響很小,隨著n增大,幾乎可以忽略不計,甚至可以忽略與最高項(xiàng)相乘的常數(shù)

更通俗的講:時間復(fù)雜度是T(n)中受n的變化影響最大的那一項(xiàng)(不包含系數(shù))

最壞時間復(fù)雜度和平均時間復(fù)雜度

最壞情況下的時間復(fù)雜度稱最壞時間復(fù)雜度。一般不特別說明,討論的時間復(fù)雜度均是最壞情況下的時間復(fù)雜度。 這樣做的原因是:最壞情況下的時間復(fù)雜度是算法在任何輸入實(shí)例上運(yùn)行時間的上界,這就保證了算法的運(yùn)行時間不會超過此時間.

常見時間復(fù)雜度

常數(shù)階O(1)、對數(shù)階O(log?n)、線性階O(n)線性對數(shù)階O(nlog?n)、平方階O(n2)立方階O(n3)、k次方階(n)指數(shù)階O(2?)

常見時間復(fù)雜度比對圖

從圖中不難看出,選擇算法時候應(yīng)該盡量選擇對數(shù)階而非指數(shù)階時間復(fù)雜度的算法.

常數(shù)階O(1)
void func(int n) {
    printf("Hello, World!\n"); // 循環(huán)體時間復(fù)雜度為 O(1)
}
對數(shù)階O(log?n)
void func(int n) {
    for(int i = 1; i < n; i *= 2) { // 循環(huán)次數(shù)為 log?n
        printf("Hello, World!\n"); // 循環(huán)體時間復(fù)雜度為 O(log?n)
    }
}
線性階O(n)
void func(int n) {
    for(int i = 0; i < n; i++) { // 循環(huán)次數(shù)為 n
        printf("Hello, World!\n"); // 循環(huán)體時間復(fù)雜度為 O(n)
    }
}
線性對數(shù)階O(nlog?n)
void func(int n) {
    for(int i = 0; i < n; i++) { // 循環(huán)次數(shù)為 n
        for(int j = 1; j < n; j *= 2) { // 循環(huán)次數(shù)為 log?n
            printf("Hello, World!\n"); // 循環(huán)體時間復(fù)雜度為 O(nlog?n)
        }
    }
}
平方階O(n2)
void func(int n) {
    for(int i = 0; i < n; i++) { // 循環(huán)次數(shù)為 n
        for(int j = 0; j < n; j++) { // 循環(huán)次數(shù)為 n
            printf("Hello, World!\n"); // 循環(huán)體時間復(fù)雜度為 O(n2)
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容