《大話數據結構》讀後總結(六)

算法時間複雜度定義

算法的時間複雜度,也就是算法的時間量度,記做:T(n)=O(f(n))。它表示隨問題規模n的增大,算法執行時間的增加率和f(n)的增加率相同,稱做算法的漸近時間複雜度,簡稱爲時間複雜度。其中f(n)是問題規模n的某個函數。php

通常狀況下,隨着n的增大,T(n)增加最慢的算法爲最優算法。算法

O(1)叫常數階、O(n)叫線性階、O(n^2)叫平方階。函數

推導大O階:學習

1.用常數1取代運行時間中的全部加法常數。code

2.在修改後的運行次數函數中,只保留最高階項。io

3.若是最高階項存在且不是1,則去除與這個項相乘的常數。function

常數階

int sum = 0,n = 100;      /* 執行一次 */
sum = (1 + n) * n / 2;    /* 執行一次 */
printf("%d", sum);        /* 執行一次 */

運行次數函數是f(n)=3,時間複雜度爲O(1)。與問題的大小無關(n的多少),執行時間恆定的算法,叫常數階。互聯網

線性階

int i;
for (i = 0; i < n; i++)
{
    /* 時間複雜度爲O(1)的程序步驟序列 */
}

時間複雜度爲O(n),由於循環體中的代碼需要執行n次。循環

對數階

int count = 1;
while (count < n)
{
    count = count * 2;
    /* 時間複雜度爲O(1)的程序步驟序列 */
}

由2x=n獲得x=log2n,時間複雜度爲O(logn)。二維碼

平方階

int i, j;
for (i = 0; i < n; i++)
{
    for (j = 0; j < n; j++)
    {
        /* 時間複雜度爲O(1)的程序步驟序列 */
    }
}

外層的循環時間複雜度O(n),內層時間複雜度爲O(n),因此這段代碼的時間複雜度爲O(n^2)。

n++;                       /* 執行次數爲1 */
function(n);               /* 執行次數爲n */
int i, j;
for (i = 0; i < n; i++)    /* 執行次數爲n^2 */
{
    function (i);
}
for (i = 0; i < n; i++)    /* 執行次數爲n(n + 1)/2 */
{
    for (j = i; j < n; j++)
    {
        /* 時間複雜度爲O(1)的程序步驟序列 */
    }
}

執行次數f(n)=1+n+n^2+n(n+1)/2=3/2·n^2+3/2·n+1,時間複雜度也是O(n2)。

歡迎掃描下方二維碼,持續關注:

image

互聯網工程師(id:phpstcn),咱們一塊兒學習,一塊兒進步

相關文章
相關標籤/搜索