乙個演算法的優劣程度主要取決於程式執行時間和計算占用儲存空間來衡量。
一般使用「大o符號表示法」來表示時間複雜度:t(n) = o(f(n)),其中n是影響複雜度變化的因子,f(n)是複雜度具體的演算法。
描述大o表示法
常數階o(1)
線性階o(n)
對數階o(logn)
線性對數階
o(nlogn)
平方階o(n
2n ^
n2)立方階
o(n 3n^
n3)k次方階
o(n kn^
nk)指數階
o( 2n
(2^(2
n)o (1
)
logn
)
n)
nlog
n)
n2
)
n3
)
2n
)
n!
)
nn
)o(1)o(
1)logn
)n)nlog
n)n2
)n3)2n
)n!)nn)
注:隨著n的不斷增大,時間複雜度不斷增大,演算法花費的時間越多。
選取相對增長最高的項
最高項的係數都化為1
若是常數的話都用o(1)表示
如:f(n
)=2∗
n3+2
n+
100=n3
f(n) = 2*n^+2n+100=n^
f(n)=2
∗n3+
2n+1
00=n
3當查詢乙個有n個隨機數字陣列arr[n]中的某個數字時,最好的情況是第一次查詢時就是,那麼演算法的時間複雜度為o(1),但是也有可能為最後一次查詢才查到,那麼時間複雜度為o(n)。
平均執行時間是期望的執行時間。
最壞執行時間是一種保證。在應用中,這是一種最重要需求,通常除非特別指定,我們提到的執行時間都是最壞的執行時間。
對數階o(lognnn)
執行次數:1+1i =1;
while
(i<= n)
+log
2n
1+1+log_n
1+1+lo
g2n
則t(n) =1+1
+log
2n
1+1+log_n
1+1+lo
g2n
則時間複雜度為:log
2n
log_n
log2n
或(log2
nlog_2n
log2n
)注:這裡的底數對於研究程式執行效率不重要,常數部分常忽略!
平方階o(n2n^
n2)
執行次數:1+1sum =0;
total =0;
for(i=
1;i<=n;i++
)
+n+n
+n2+
n2
1+1+n+n+n^+n^
1+1+n+
n+n2
+n2
則t(n) = 2n2
+2n+
22n^+2n+2
2n2+2n
+2則時間複雜度為:o(n2n^
n2)如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化,則空間複雜度為乙個常量,可表示為o(1)。
**中m,n所分配的空間都不隨著處理資料量變化,因此空間複雜度為s(n) = o(1)。int m =5;
int n =8;
m = m + n;
n = m + n;
**中,第一行new出乙個空間n+1的陣列,後面變數沒有分配空間,故占用空間為n+1,即為s(n) = o(n)。int
a = new int
[n+1];
//定義乙個n+1的陣列,0空間未使用a[1
]=1;
a[2]=
2;for(
int i=
3;i<=n;i++
) a[i]
= a[i-1]
+ a[i-2]
;
注:對於遞迴演算法,計算一般為遞推和回歸,每一次遞推需要乙個棧空間來儲存呼叫記錄,因此空間複雜度一般空間複雜度為o(n)。
評價乙個演算法效率主要是看它的時間複雜度和空間複雜度情況。在開發中,尤其在併發量的情況下,時間複雜度和空間複雜度的優化能帶來巨大效能的提公升。在演算法優化中也常存在「時間」換「空間」,"空間"換「時間」的情況。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...