2.1 演算法效率評估¶
在演算法設計中,我們先後追求以下兩個層面的目標。
- 找到問題解法:演算法需要在規定的輸入範圍內可靠地求得問題的正確解。
- 尋求最優解法:同一個問題可能存在多種解法,我們希望找到儘可能高效的演算法。
也就是說,在能夠解決問題的前提下,演算法效率已成為衡量演算法優劣的主要評價指標,它包括以下兩個維度。
- 時間效率:演算法執行時間的長短。
- 空間效率:演算法佔用記憶體空間的大小。
簡而言之,我們的目標是設計“既快又省”的資料結構與演算法。而有效地評估演算法效率至關重要,因為只有這樣,我們才能將各種演算法進行對比,進而指導演算法設計與最佳化過程。
效率評估方法主要分為兩種:實際測試、理論估算。
2.1.1 實際測試¶
假設我們現在有演算法 A
和演算法 B
,它們都能解決同一問題,現在需要對比這兩個演算法的效率。最直接的方法是找一臺計算機,執行這兩個演算法,並監控記錄它們的執行時間和記憶體佔用情況。這種評估方式能夠反映真實情況,但也存在較大的侷限性。
一方面,難以排除測試環境的干擾因素。硬體配置會影響演算法的效能表現。比如一個演算法的並行度較高,那麼它就更適合在多核 CPU 上執行,一個演算法的記憶體操作密集,那麼它在高效能記憶體上的表現就會更好。也就是說,演算法在不同的機器上的測試結果可能是不一致的。這意味著我們需要在各種機器上進行測試,統計平均效率,而這是不現實的。
另一方面,展開完整測試非常耗費資源。隨著輸入資料量的變化,演算法會表現出不同的效率。例如,在輸入資料量較小時,演算法 A
的執行時間比演算法 B
短;而在輸入資料量較大時,測試結果可能恰恰相反。因此,為了得到有說服力的結論,我們需要測試各種規模的輸入資料,而這需要耗費大量的計算資源。
2.1.2 理論估算¶
由於實際測試具有較大的侷限性,因此我們可以考慮僅透過一些計算來評估演算法的效率。這種估算方法被稱為漸近複雜度分析(asymptotic complexity analysis),簡稱複雜度分析。
複雜度分析能夠體現演算法執行所需的時間和空間資源與輸入資料大小之間的關係。它描述了隨著輸入資料大小的增加,演算法執行所需時間和空間的增長趨勢。這個定義有些拗口,我們可以將其分為三個重點來理解。
- “時間和空間資源”分別對應時間複雜度(time complexity)和空間複雜度(space complexity)。
- “隨著輸入資料大小的增加”意味著複雜度反映了演算法執行效率與輸入資料體量之間的關係。
- “時間和空間的增長趨勢”表示複雜度分析關注的不是執行時間或佔用空間的具體值,而是時間或空間增長的“快慢”。
複雜度分析克服了實際測試方法的弊端,體現在以下幾個方面。
- 它無需實際執行程式碼,更加綠色節能。
- 它獨立於測試環境,分析結果適用於所有執行平臺。
- 它可以體現不同資料量下的演算法效率,尤其是在大資料量下的演算法效能。
Tip
如果你仍對複雜度的概念感到困惑,無須擔心,我們會在後續章節中詳細介紹。
複雜度分析為我們提供了一把評估演算法效率的“標尺”,使我們可以衡量執行某個演算法所需的時間和空間資源,對比不同演算法之間的效率。
複雜度是個數學概念,對於初學者可能比較抽象,學習難度相對較高。從這個角度看,複雜度分析可能不太適合作為最先介紹的內容。然而,當我們討論某個資料結構或演算法的特點時,難以避免要分析其執行速度和空間使用情況。
綜上所述,建議你在深入學習資料結構與演算法之前,先對複雜度分析建立初步的瞭解,以便能夠完成簡單演算法的複雜度分析。