1. 程式人生 > 實用技巧 >資料結構 第一節 第二課

資料結構 第一節 第二課

[toc]

演算法效率衡量

執行時間反應演算法效率

對於同一問題, 我們給出了兩種解決演算法, 在兩種演算法的實現中, 我們對程式執行的時間進行了測算, 發現兩段程式執行的時間相差懸殊 ( 126.514秒相比於 0.997 秒), 由此我們可以得出結論: 實現演算法程式的執行時間可以反應出演算法的效率, 即演算法的優劣.

執行結果:

注: 每臺機器執行的總時間不同, 但是執行基本運算數量大體相同

單靠時間值絕對可信嗎?

假設我們將第二次嘗試的演算法程式執行在一臺配置古老效能低下的計算機中, 情況會如何? 很可能執行時間並不會比我們的電腦中執行演算法一的 126.514 秒塊多少.

單純依靠執行時間來比較演算法的優劣不一定是客觀準確的!

程式的執行離不開計算機環境 ( 包括硬體和作業系統 ), 這些客觀原因會影響程式執行的速度並反映在程式的執行時間上. 那麼如果才能客觀的評判一個演算法的優劣呢?

時間複雜度與 "大O記法"

我們假定計算機執行演算法每一個基本操作的時間是固定的一個單位, 那麼有多少個基本操作就代表會花費多少時間單位. 雖然對於不同的機器環境而言, 確切的單位時間是不同的, 但是對於演算法進行多少個基本操作 ( 即花費多少時間單位 ) 在規模數量上是相同的, 由此可以忽略機器環境的影響而客觀的反應演算法的時間效率.

對於演算法的時間效率, 我們可以用 "大O記法" 來表示.

"大O記法": 對於單調的整數函式 f, 如果存在一個整數 g 和常數 C>0, 使得對於充分大的 n 總有 f(n) <= c*g(n), 就是說函式 g 是 f 的一個漸進函式 ( 忽略常數 ), 記為 f(n) = O(g(n)). 也就是說, 在趨向無窮的極限意義下, 函式 f 的增長速度受到函式 g 的約束, 亦即函式 f 與函式 g 的特徵相似.

時間複雜度: 假設存在函式 g, 使得演算法 A 處理規模為 n 的問題示例所用時間為 T(n) = O(g(n)), 則稱 O(g(n)) 為演算法 A 的漸近時間複雜度, 簡稱時間複雜度, 記為 T(n)

如何理解 "大O記法"

對於演算法進行特別具體的細緻分析雖然很好, 但在實踐中的實際價值有限. 對於演算法的時間性質和空間性質, 最重要的是其數量級和趨勢, 這些是分析演算法效率的主要部分. 而計算量法基本運算元量的規模函式中那些常量因子可以忽略不計. 例如, 可以認為 3n^2 和 100n^2 屬於同一個量級, 如果兩個演算法處理同樣規模例項的代價分別為這兩個函式, 就認為他們的效率 "差不多", 都為 n^2 級.