《大話資料結構》讀後總結(六)

徐曙輝發表於2019-03-29

演算法時間複雜度定義

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

一般情況下,隨著n的增大,T(n)增長最慢的演算法為最優演算法。

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

推導大O階:

1.用常數1取代執行時間中的所有加法常數。

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

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

常數階

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),我們一起學習,一起進步

相關文章