時間複雜度和空間複雜度是度量演算法效率的常用指標
事後統計,不常用
事前統計影響因素:
演算法策略 問題規模 程式語言 **質量 機器執行指令的速度
撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模(通常用整數n表示)
乙個演算法是由控制結構(順序,分支,迴圈三種)和原操作(指固有資料型別的操作)構成,則演算法時間取決於兩者的綜合效果。
為了便於比較同一問題的不同演算法,通常從演算法中選取一種對於所研究問題來說是基本操作的原操作,以該基本操作重複執行的次數作為演算法的時間度量。原操作的執行次數與包含他的語句的執行次數相同演算法的時間複雜度記做 t(n)=o(f(n))
它表示隨問題規模n的增大,演算法執行時間的增長率和 f(n) 的增長率相同
含基本操作「x+1」的語句的頻度分別為1,n和n^2,所以這三個程式段的時間複雜度分別為o(1)、o(n)、o( n^2 ) ,分別稱為常量階,線性階和平方階。
有些情況下,演算法中基本操作重複執行的次數還隨問題的輸入資料集不同而不同。例如在氣泡排序演算法中,「交換序列中相鄰兩個整數」這個基本操作執行次數可能為0,或者o(n^2)。這類演算法時間複雜度有兩種表示方法:一是考慮所有情況下時間複雜度的期望值(麻煩,而且出現概率難確定,所以不常用);另一種是以最壞的情況下的時間複雜度作為該演算法的時間複雜度。
時間複雜度並不是表示乙個程式解決問題需要花多少時間,而是當問題規模擴大後,程式需要的時間長度增長得有多快。也就是說,對於高速處理資料的計算機來說,處理某乙個特定資料的效率不能衡量乙個程式的好壞,而應該看當這個資料的規模變大到數百倍後,程式執行時間是否還是一樣,或者也跟著慢了數百倍,或者變慢了數萬倍。不管資料有多大,程式處理花的時間始終是那麼多的,我們就說這個程式很好,具有o(1)的時間複雜度,也稱常數級複雜度;資料規模變得有多大,花的時間也跟著變得有多長,這個程式的時間複雜度就是o(n),比如找n個數中的最大值;而像氣泡排序、插入排序等,資料擴大2倍,時間變慢4倍的,屬於o(n^2) 的複雜度。還有一些窮舉類的演算法,所需時間長度成幾何階數**,這就是o(a^n) 的指數級複雜度,甚至o(n!)的階乘級複雜度。
s(n)=o(f(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...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...