演算法複雜度是評價乙個演算法是否高效的依據。
演算法複雜度分為時間複雜度和空間複雜度,乙個高效的演算法具有用時短或者使用空間少的特點。
隨著儲存技術的發展,儲存介質的容量也發生了翻天覆地的變化,更有出現一些以空間換時間的演算法。因此,如今評價演算法的效率更加關注「用時短」方面,即是時間複雜度。
簡單的來說,演算法的時間複雜度表示程式執行直至完成所需的總時間。
因為程式可以由不同的程式語言實現,可以在配置不同的機器上面執行,那麼不同的程式語言和不同的配置機器之間就沒有可比性。因此不能用程式執行的具體時間比較效率,而是要用基本運算的次數來度量演算法的時間複雜度。
乙個演算法是由控制結構(順序、分支和迴圈)和原操作(比如有四則運算,比較運算,賦值運算等)構成的,演算法時間複雜度取決於兩者的基本運算次數之和。進行基本運算的次數越少,其執行時間也就相對越少;基本運算次數越多,其執行時間也就相對越多。
求解1~1000的累加和:
#include int main()
printf("sum=%d\t",sum);
return 0;
}
我們已經知道,演算法的時間複雜度取決於演算法的基本運算的次數。
以上程式的基本運算次數:tn=
3n+3
t_n = 3n+3
tn=3n
+3演算法的時間複雜度通常使用「大o表示法」( big o notation)表示,大o符號的作用在於用簡單的函式來描述複雜函式行為,給出乙個上或下界。
演算法中基本運算次數 t
nt_n
tn 是問題規模 n
nn 的某個函式 f
nf_n
fn,記作:tn=
o(fn
)t_n = o(f_n)
tn=o(
fn)
。表示 t
nt_n
tn 與 f
nf_n
fn 是同量級函式,具有相同的增長率;
表示當 n
nn 趨於正無窮時,存在乙個常數 c
cc ,總有 t
n<=c
∗f
nt_n <= c * f_n
tn<=c
∗fn
,簡單的來說,當 n
nn 趨於正無窮時,tn=
fn
t_n = f_n
tn=fn
。由 t n=
3n+3
t_n = 3n + 3
tn=3n
+3可得,
時間複雜度 o(f
n)=o
(3n+
3)=o
(n
)o(f_n)=o(3n+3)=o(n)
o(fn)
=o(3
n+3)
=o(n
) 。計算時間複雜度的步驟:
例如:時間複雜度t n=
n2+3
n+4=
o(n2
+3n+
4)=o
(n2)
t_n=n^2+3n+4=o(n^2+3n+4)=o(n^2)
tn=n2
+3n+
4=o(
n2+3
n+4)
=o(n
2) tn=
4n2+
2n+1
=o(4
n2+2
n+1)
=o(n
2)
t_n=4n^2+2n+1=o(4n^2+2n+1)=o(n^2)
tn=4n
2+2n
+1=o
(4n2
+2n+
1)=o
(n2)
時間複雜度量級
大小(由小到大)
o (1
)o(1)
o(1)
常數階1
o
(log2
n)
o(\log_2n)
o(log2n
)對數階2o(n
)o(n)
o(n)
線性階3
o (n
logn
)o(nlogn)
o(nlog
n)線性對數階4o(n
2)
o(n^2)
o(n2
)平方階5o(n
3)
o(n^3)
o(n3
)立方階6o(2
n)
o(2^n)
o(2n
)指數階
7
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
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表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...