演算法的時間複雜度定義為:
時間複雜度或稱時間複雜性,又稱計算複雜度,她說是演算法有效的度量之一,時間複雜度是乙個演算法執行時間的相對度量,乙個演算法的執行時間長短,它大致等於執行一種簡單操作所(賦值、比較、計算、轉向、返回、輸入和輸出)需要的時間與演算法中進行簡單操作次數的乘積。
根據定義,求解演算法的時間複雜度的具體步驟是:
⑴ 找出演算法中的基本語句;
一般演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
⑵ 計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
⑶ 用大ο記號表示演算法的時間效能。
當n趨近於無窮大時,如果lim(t(n)/f(n))的值為不等於0的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n))。
簡單的說,就是保留求出次數的最高次冪,並且把係數去掉。 如t(n)=2n^2+n+1=o(n^2)
舉個例子:
#include "stdio.h"
int main()
} printf("%d", sum); /* 執行1次 */
}照上面推導「大o階」的步驟,我們來看
第一步:「用常數 1 取代執行時間中的所有加法常數」,
則上面的算式變為:執行總次數 =3n^2 + 3n + 1
(直接相加的話,應該是t(n) = 1 + n+1 + n +n*(n+1) + n*n + n*n + 1 = 3n^2 + 3n + 3。現在用常數 1 取代執行時間中的所有加法常數,就是把t(n) =3n^2 + 3n + 3中的最後乙個3改為1. 就得到了 t(n) = 3n^2 + 3n + 1)
第二步:「在修改後的執行次數函式中,只保留最高端項」。
這裡的最高端是 n 的二次方,所以算式變為:執行總次數 = 3n^2
第三步:「如果最高端項存在且不是 1 ,則去除與這個項相乘的常數」。
這裡 n 的二次方不是 1 所以要去除這個項的相乘常數,算式變為:執行總次數 = n^2
因此最後我們得到上面那段**的演算法時間複雜度表示為: o( n^2 )
下面我把常見的演算法時間複雜度以及他們在效率上的高低順序記錄在這裡,使大家對演算法的效率有個直觀的認識。
o(1) 常數階 < o(logn) 對數階 < o(n) 線性階 < o(nlogn) < o(n^2) 平方階 < o(n^3) <
printf("%d", sum); /* 執行1次 */
}從**附加的注釋可以看到所有**都執行了多少次。那麼這寫**語句執行次數的總和就可以理解為是該演算法計算出結果所需要的時間。該演算法所用的時間(演算法語句執行的總次數)為: 1 + ( n + 1 ) + n + 1 = 2n + 3
而當 n 不斷增大,比如我們這次所要計算的不是 1 + 2 + 3 + 4 +...... + 100 = ? 而是 1 + 2 + 3 + 4 + ...... + n = ?其中 n 是乙個十分大的數字,那麼由此可見,上述演算法的執行總次數(所需時間)會隨著 n 的增大而增加,但是在 for 迴圈以外的語句並不受n 的規模影響(永遠都只執行一次)。所以我們可以將上述演算法的執行總次數簡單的記做: 2n 或者簡記 n
這樣我們就得到了我們設計的演算法的時間複雜度,我們把它記作: o(n)。
高斯演算法:
#include "stdio.h"
int main()
這個演算法的時間複雜度: o(3),但一般記作 o(1)。
從感官上我們就不難看出,從演算法的效率上看,o(1) < o(n) 的,所以高斯的演算法更快,更優秀。
二、求兩個n階方陣c=a*b的乘積其演算法如下:
//右邊列為語句執行的頻度
void matrixmultiply(int a[n][n],int b [n][n],int c[n][n])
} x = b[i];
b[i] = b[k];
b[k] = x;
} }
其中,演算法的基本運算語句是
if (b[k] > b[j])
其執行次數t(n)為:
五、分析下列時間複雜度
void test_3(int n)
else
}對於遞迴函式的分析,跟設計遞迴函式一樣,要先考慮基情況(比如hanoi中n==1時候),這樣把乙個大問題劃分為多個子問題的求解。
故此上述演算法的時間複雜度的遞迴關係如下:
大二學習需努力阿。
就扯到這裡,希望對大家有所幫助。
資料結構時間複雜度計算
1 for迴圈 一次for迴圈的執行時間至多是該for迴圈內語句的執行時間乘以迭代次數。2 巢狀的for迴圈 肯定是計算最內層迴圈語句的執行次數,然後再乘以所以迴圈的迭代次數。3 整個程式 其實找到迴圈迭代次數最多,巢狀最多的進行計算就好。3 當然,我們計算的只是大概值,而且為了計算的簡便,我們一邊...
資料結構 時間複雜度計算
1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi...
資料結構 時間複雜度計算
1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi...