演算法時間複雜度定義
演算法的時間複雜度,也就是演算法的時間量度,記作: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)。
歡迎掃描下方二維碼,持續關注:
網際網路工程師(id:phpstcn),我們一起學習,一起進步