演算法的複雜度體現在執行該演算法時的計算機所需的資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度。
時間複雜度是執行演算法所需要的計算工作量。
空間複雜度是執行這個演算法所需要的記憶體空間。
時間複雜度(time complexity)定義
時間複雜度計算
根本沒有必要計算時間頻度,即使計算處理還要忽略常量、低次冪和最高次冪的係數,所以可以採用如下簡單方法:
時間複雜度的幾條基本計算原則
基本操作:即只有常數項,認為其時間複雜度為o(1)
順序在操作:時間複雜度按加法及逆行計算
迴圈操作:時間複雜度按乘法進行計算
分支結構:時間複雜度取最大值
判斷乙個演算法的效率時,往往只需要關注數量的最高次項,其他次要項和常數項可以忽略
在沒有特殊說明時,我們所分析的演算法的時間複雜度是指最壞時間複雜度
例如:
for a in range(0,1001):
for b in range(0,1001):
c = 1000 - a -b
if a**2 + b**2 == c**2:
print(a,b,c)
t(n)=nn(1+max(1,0))
演算法時間複雜度舉例
int n=8,count=0;
for (int i=1;i<=n;i++)
count++;
int n=8,count=0;
for (int i=1;i<=n;i*=2)
count++;
1 2 4 8 16 32 …
n =2
in=2^i
n=2i
所以:i
=log2
ni=\log_2 n
i=log2n
int n=8,count=0;
for (int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
count++;
int n=8,count=0;
for (int i=1;i<=n;i*=2)
for(int j=1;j<=n;j++)
count++;
int n=8,count=0;
for (int i=1;i<=10n;i++)
for(int j=1;j<=100n;j++)
count++;
int n=8,count=0;
for (int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
count++;
1+2+3+…+n=(1+n)*n/2
查詢和排序演算法會大量的設計時間複雜度,作為選擇查詢和排序演算法的重要依據。
常用的時間複雜度級別
越往下,時間複雜度越高,執行效率越來越低:
常數階o(1)
對數階o
(log2
n)
o(\log_2 n)
o(log2n
)線性階o(n)
線性對數階o(n
log2n
)o(n\log_2 n)
o(nlog2
n)平方階o(n
2)
o(n^2)
o(n2
)立方階o(n
3)
o(n^3)
o(n3)…
k次方階o(n
k)
o(n^k)
o(nk
)指數階o(2
n)
o(2^n)
o(2n
)階乘階o(n
!)
o(n!)
o(n!
)o(1
) logn ) n) nlog n) n2 ) n3 ) 2n ) n! ) nn )o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n) o(1) logn )n)nlog n)n2 )n3)2n )n!)nn ) 時間複雜度 n=8(2 32^3 23)n=10 n=100 n=1000 o(1)11 11o (log2 n) o(\log_2 n) o(log2n )33.322 6.644 9.966 o (n )o(n) o(n)810 1001000 o (n log2n )o(n\log_2 n) o(nlog2 n)2433.22 664.4 9966 o (n 2) o(n^2) o(n2)64 10010000 1 06 10^6 106o (log2 n) o(\log_2 n) o(log2n )和|o(n )o(n) o(n) 差異很大,因此在編寫演算法時一定要注意時間複雜度的選擇。 1.描述乙個演算法優劣用計算次數的 數量級。1m 1g 1t。與問題相關的規模用n t n n 2 n 3 2.常見的時間複雜度 用大o表示法表示 常數階 o 1 線性階 o n 平方階 o n 2 對數階 o logn nlogn階 o nlogn 立方階 o n 3 指數階 o 2 n o 1 ... 1.乙個問題的解可以分解為幾個子問題的解 2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 3.存在遞迴終止條件 假如這裡有 n 個台階,每次你可以跨 1 個台階或者 2 個台階,請問走這 n 個台階有多少種 走法?如果有 7 個台階,你可以 2,2,2,1 這樣子上去,也可以 1... 演算法,對應的英文單詞是algorithm,這是乙個很古老的概念,最早來自數學領域。我們都聽過高斯小時的故事和高斯演算法,這裡就不多說了,這是數學領域中演算法的乙個簡單示例。在數學領域裡,演算法是用於解決某一類問題的公式和思想。而我這裡所講的演算法,是電腦科學領域的演算法,它的本質是一系列程式指令,...資料結構與演算法入門
資料結構與演算法之演算法
資料結構時間複雜度 資料結構與演算法之演算法概述