2.計算
3.示例
非形式的說,演算法(algorithm)就是任何良定義的計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。這樣演算法就是把輸入轉換為輸出的計算步驟的乙個序列。
可以認為,演算法是求解計算問題的工具。
時間複雜度是指執行演算法所需要的計算工作量,即計算機執行相關程式所需要的時間(通過時間來評估效率)。
演算法的時間複雜度是乙個函式,它定性描述該演算法的執行時間。是乙個代表演算法輸入值的字串的長度的函式。
時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。
使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。
簡單理解就是: 定義
演算法的輸入大小:演算法所需的輸入值或值的集合為n;
演算法的執行次數函式:,也稱語句頻度或時間頻度,演算法的需要的運算次數即可用 輸入大小的函式 來表示,即t(n);
演算法的執行時間的增長速度:我們記作f(n)。
以c語言為例(累加程式,輸入n為累加次數,輸出sum為累加和)
int
main
(int n)
return sum;
}
輸入為1和輸入為100的情況,for迴圈的執行次數明顯是不一樣的。再談執行時間的增長速度即輸入大小n,影響了演算法的執行次數,不同的演算法有不同的影響機制,因為演算法執行次數記為以n為自變數的因變數,t(n)。
隨著n的增長,執行時間不斷增大,時間的增長速度也有變化,但也與輸入n有關,可以記為f(n)。自此,引入時間複雜度o(f(n))也可以看出,我們可以用 f(n) 的增長速度來度量 t(n) 的增長速度。
(速度與加速度)
定義:
存在常數 c 和函式 f(n),使得當 n >= c 時 ,t(n) <= f(n)。
表示為 t(n) = o(f(n)) 。
如圖:
當 n >= 2 的時候,f(n) = n^2 總是大於 t(n) = n + 2 的,於是我們說 f(n) 的增長速度是大於或者等於 t(n) 的,也說 f(n) 是 t(n) 的上界,可以表示為 t(n) = o(f(n))。
因為f(n) 的增長速度是大於或者等於 t(n) 的,即t(n) = o(f(n)),所以我們可以用 f(n) 的增長速度來度量 t(n) 的增長速度,所以我們說這個演算法的時間複雜度是 o(f(n))。
常數項這對函式的增長速度影響並不大,所以當 t(n) = 常數c 時,時間複雜度為 o(1); 如果 t(n) 不等於乙個常數項時,直接將常數項省略。
比如,t(n) = 2,時間複雜度為 o(1)。
t(n) = n + 29,時間複雜度為 o(n)。
高次項這對函式的增長速度影響最大。n3的增長速度遠大於n2。同時因為要求的精度不高,所以我們直接忽略低此項。
比如, t(n) = n^3 + n^2 + 29,此時時間複雜度為 o(n^3)。
階數因為函式的階數對函式的增長速度的影響是最顯著的,所以我們忽略與最高端相乘的常數。
比如, t(n) = 3n3,此時時間複雜度為 o(n^3)。
從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。一般來說,時間複雜度高的演算法比複雜度低的演算法慢。
常見的時間複雜度(按效率排序):
o(1)n)n)2)2logn)3)
常數階 o(1)
function test()
執行了三次printf,執行次數很固定,是個常數。那麼時間複雜度就是o(3),取為o(1)。
線性階 o(n)
for
(i=0;i)
執行n 次,時間複雜度就是o(n)
平方階 o(n2)
for
(i=0
;i)}
迴圈,裡面迴圈執行了n次,外層迴圈也執行了n次,所以時間複雜度為o(n^2)
立方階 o(n3)與上面類似,就是 三個 for 迴圈
對數階:o(log2n)
while
(n>1)
即不斷除以2,
n, n/2, n/2/2, n/2/2/2,n/2/2/,…
n/(2m)=1;我們需要算出m, 轉換成n=2m,得出m=log2n,所以時間複雜度為o(logn)
演算法的時間複雜度和問題規模 演算法時間複雜度
在進行演算法分析時,語句總的執行次數 是關於問題規模 n 的函式,進而分析 隨 n 的變化情況並確定 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 它表示隨問題規模 n 的增大,演算法執行時間的增長率和 的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度。其中 是問題規模 n 的...
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
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...