1. 程式人生 > >《資料結構與演算法》之演算法簡介

《資料結構與演算法》之演算法簡介

演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度與時間複雜度來衡量。

一個演算法應該具有以下五個重要的特徵:

輸入項 一個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件
輸出項 一個演算法有一個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的
有窮性 演算法的有窮性是指演算法必須能在執行有限個步驟之後終止
確切性 演算法每個步驟都應被精確定義,同樣的輸入只能有一種輸出
可行性 演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)

演算法的設計原則:

1、正確性:首先,演算法應當滿足以特定的“規則說明”方式給出的需求。其次,對演算法是否“正確”的理解可以有以下四個層次:

     (1)程式語法錯誤。

     (2)程式對於幾組輸入資料能夠得出滿足需要的結果。

     (3)程式對於精心選擇的、典型、苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求的結果。

     (4)程式對於一切合法的輸入資料都能得到滿足要求的結果。

       PS:通常以第 (3) 層意義的正確性作為衡量一個演算法是否合格的標準。

2、可讀性:演算法為了人的閱讀與交流,其次才是計算機執行。因此演算法應該易於人的理解;另一方面,晦澀難懂的程式易於隱藏較多的錯誤而難以除錯。

3、健壯性:當輸入的資料非法時,演算法應當恰當的做出反應或進行相應處理,而不是產生莫名其妙的輸出結果。並且,處理出錯的方法不應是中斷程式執行,而是應當返回一個表示錯誤或錯誤性質的值,以便在更高的抽象層次上進行處理。

4、高效率與低儲存量需求:通常演算法效率值得是演算法執行時間;儲存量是指演算法執行過程中所需要的最大儲存空間,兩者都與問題的規模有關。

同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間複雜度和空間複雜度來考慮。

時間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。一般來說,計算機演算法是問題規模n 的函式f(n),演算法的時間複雜度也因此記做T(n)=Ο(f(n))。 因此,問題的規模n 越大,演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間複雜度(Asymptotic Time Complexity)。

空間複雜度 演算法的空間複雜度是指演算法需要消耗的記憶體空間。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。
正確性 演算法的正確性是評價一個演算法優劣的最重要的標準。
可讀性 演算法的可讀性是指一個演算法可供人們閱讀的容易程度。
健壯性 健壯性是指一個演算法對不合理資料輸入的反應能力和處理能力,也稱為容錯性

演算法的分類

演算法可大致分為基本演算法、資料結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法,厄米變形模型,隨機森林演算法。

演算法可以巨集泛的分為三類:

一,有限的,確定性演算法。 這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。

二,有限的,非確定演算法。 這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。

三,無限的演算法。 是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的資料滿足而不終止執行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。

下面例舉一些演算法方法:

遞推法、遞迴法、窮舉法、貪心演算法、分治法、動態規劃法、迭代法、分支界限法、回溯法。