我們發現乙個高階語言編寫的程式在計算機上執行所消耗的時間取決於下列因素:
1.演算法採用的策略,方案
2.編譯產生的**質量
3.問題的輸入規模
4.機器執行的指令速度
我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確地定位需要執行多少次,因為如果這樣的話,我們又得考慮編譯器優化等問題。
計算方法
1.一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。
分析:隨著模組n的增大,演算法執行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小,演算法的時間複雜度越低,演算法的效率越高。
在計算時間複雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出 t(n) 的同數量級(它的同數量級有以下:1,log2n,n,n log2n ,n的平方,n的三次方,2的n次方,n!),找出後,f(n) = 該數量級,若 t(n)/f(n) 求極限可得到一常數c,則時間複雜度t(n) = o(f(n))
例:演算法:
for(i=1;
i<=n; ++i)
}
1.則有 t(n) = n^2+n^3,根據上面括號裡的同數量級,
2.我們可以確定 n的三次方 為t(n)的同數量級
3.則有 f(n) = n的三次方,然後根據 t(n)/f(n) 求極限可得到常數c
則該演算法的時間複雜度:t(n) = o(n^3) 注:n^3即是n的3次方。
求解演算法的時間複雜度的具體步驟是:
⑴找出演算法中的基本語句;
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
⑵計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
⑶用大ο記號表示演算法的時間效能。
將基本語句執行次數的數量級放入大ο記號中。
如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加。例如:
for(i=1;i<=n;i++) x++;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) x++; 第乙個for迴圈的時間複雜度為ο(n),第二個for迴圈的時間複雜度為ο(n2),則整個演算法的時間複雜度為ο(n+n2)=ο(n2)。
常見的演算法時間複雜度由小到大依次為:
ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n^2)<ο(n^3)<…<ο(2^n)<ο(n!)
ο(1)表示基本語句的執行次數是乙個常數,一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是ο(1)。
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...
演算法的時間複雜度 空間複雜度
時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...