有了解決問題的演算法,如何評價解決同一問題不同演算法的效能優劣?
其標準涉及演算法的執行時間和占用空間兩個方面。
【效能評價】應是問題規模的函式,以刻畫表徵問題規模的大小。
【問題規模】對於不同的問題其含義不同:
如矩陣的階、多項式的項數、圖的頂點數、集合的個數等,是反映問題大小的本質數目。
演算法實際執行時間與機器硬體和軟體環境相關(比如兩個機器的效能指標不同,就不便比較演算法執行的快慢),捨棄機器環境差異影響,語句執行時間本質就是語句執行次數,與機器環境無關。
因此演算法的執行時間就是演算法所有語句的執行次數之和。
例如:求兩個 n 階方陣的乘積 c=a×b。
#define n 100
/* n 可根據需要定義,這裡假定為 100*/
void
matrixmulti
(int a[n]
[n],int b [n]
[n],int c[n]
[n])
該演算法每一語句的語句頻度為(1
)for(i=
0;i< n;i++) n+1(
2)for (j=
0;j(n+1)(3)}
分析:
語句(1)的迴圈控制變數 i 從 0 增加到 n,測試到 i=n 成立才會終止,故它
的頻度是 n+1,但是它的迴圈體卻只能執行 n 次。
語句(2)作為語句(1)迴圈體內的語句應該執行 n 次,但語句(2)本身要執行 n+1 次,所以語句(2)的頻度是 n(n+1)。
同理可得語句(3),(4)和(5)的頻度分別是 n2,n2(n+1)和 n3。
該演算法中所有語句的頻度之和(即演算法的時間耗費)為:f(n)=2n3+3n2+2n+1
該演算法的時間耗費是矩陣階數 n 的函式。
乙個演算法的時間複雜度t(n)是該演算法的時間度量,計作:
t(n)=o(f(n))
它表示隨問題規模 n 的增大,演算法的執行時間的增長率和 f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。
資料結構中常用的時間複雜度頻率計數有 7 個:
按時間複雜度由小到大遞增排列成表 1-3(當 n 充分大時)。
不同數量級的時間複雜度的形狀如圖 1.6 所示,表 1-3 與圖 1.6 是同一問題的不同表示形式。一般情況下,隨 n 的增大,t(n)的增長較慢的演算法為最優的演算法。從中我們應該選擇使用多項式階 o(nk)的演算法,而避免使用指數階的演算法。
由圖 1.8 可知,隨著問題規模 n 的增大,
演算法 a 所耗費的時間 o(log2n)的增大
趨於平緩,演算法 b 所耗費的時間複雜度
迅速增大。顯然在同乙個問題解決方案
中,演算法 a 的執行效率高,可認為算
法 a 優於演算法 b。
資料結構常用時間複雜度有 7 種,分析按大小排列的頻度表,前 3 種增加速度
平緩,後 3 種增加速度過快,隨著 n 的增大實現困難。
是指執行基本操作的最大次數。基本操作時指演算法中基本運算的操作。
例如,在數值 a[0…n-1]中查詢給定值 k 的演算法大致如下:
(
1)i=n-1;
(2)while
(i>=0&&
(a[i]
!=k))(
3) i--;(
4)return i;
給出演算法分析:查詢成功時,最壞情況是從 a 中最後一直找到第乙個元素,共查詢 n 次,最好情況是最後乙個元素就是 k,只查詢一次查詢失敗會查 n+1 次,查完都找不到因此演算法最壞時間複雜度就取了最多次數上界為 0(n)
類似於時間複雜度的討論,乙個演算法的空間複雜度 s(n)定義為該演算法所耗費的儲存空間的數量級,它也是問題規模 n 的函式。記做:
s(n)=o(f (n))
一般情況下,乙個程式在機器上執行時,除了需要寄存本身所用的指令、常數、變數和輸入資料以外,還需要一些對資料進行操作的輔助儲存空間。其中對於輸入資料所佔的具體儲存量只取決於問題本身,與演算法無關,這樣我們只需要分析該演算法在實現時所需要的輔助空間單元個數就可以了。若演算法執行時所需要的輔助空間相對於輸入資料量而言是個常數,則稱這個演算法為原地工作,輔助空間為o(1)。
例如,將一維陣列 a 中的 n 個資料逆序存放到原陣列中,下面是實現該問題的兩
種演算法:
演算法 1:
for
(i=0
;)b[i]
=a[n-i-1]
;for
(i=0
;)a[i]
=b[i]
;
演算法 2:
for
(i=0
;i2;i++
)
演算法 1 的空間複雜度為 o(n),需要乙個大小為 n 的陣列 b。
演算法 2 的空間複雜度為 o(1),需要乙個變數 t,與問題規模沒有關係。
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。
演算法效能評價
演算法 algorithm 是為求解乙個問題需要遵循的 被清楚地指定的簡單指令的集合。簡單來說,演算法就是解決問題的一般步驟。因為問題的引入,為了解決問題。解決問題的方式方法有好壞之分,因此演算法也就有好壞之分。演算法效能的好壞並不會因為選取的語言的不同的而存在出入。因此,引入評價演算法效能的方式,...
評價演算法效能的方法
評價效能的方法主要有以下4種 1 時間分析法。通過在演算法的參考 c c c 或m 加入時間統計函式。來實現對演算法在整個系統中所佔時間作以統計。優點 實現簡單直觀的得到演算法複雜度在整個系統複雜度中所佔的比率。缺點 只能實現演算法間的比較,不能對演算法內部的複雜度給出cycle級別或指令級別的分析...
插補演算法效能評價指標
包括 逼近誤差 指用直線逼近曲線時產生的誤差 a delta a a 計算誤差 c delta c c 和圓整誤差 r delta r r 一般要求上述三誤差的綜合誤差 軌跡誤差 p delta p p 不大於系統的最小運動指令值或脈衝當量值 插補運算時間 插補運算所占用的記憶體 精度穩定性 精度穩...