算法的相關理論概述

jopen 9年前發布 | 29K 次閱讀 算法

算法概述

從字面意義上理解,算法(Algorithm)就是用于計算的方法,并通過這種方法可以達到預期的計算結果。算法的專業解釋:算法是解決實際問題的一種精確描述的方法,算法是對特定問題的求解步驟的一種精確描述方法。但更廣泛認可的算法專業定義:算法是模型分析的一組可行的、精確的和有窮的規則。

通俗的講,算法可以理解為一個完整的解題步驟,由一些基本運算和規定的運算順序而構成。通過這樣的解題步驟可以解決特定的問題。從計算機程序設計的角度看,算法由一系列求解問題的指令構成,能夠根據規范的輸入,在有限的時間內獲得有效的輸出結果。算法代表了用系統的方法來描述解決問題的一種策略機制。

典型的算法可以從其中抽象出5個特征:有窮性、確切性、輸入、輸出和可行性。

 有窮性:

算法的指令或者步驟的執行次數是有限的,執行時間也是有限的。

 確切性:

算法的每一個指令或者步驟都必須有明確的定義和描述。

 輸入:

一個算法應該有相應的輸入條件,用來刻畫運算對象的初始情況。

輸出:

一個算法應該有明確的結果輸出。這是容易理解的,沒有得到結果的算法是毫無意義的。

 可行性:

算法的執行步驟必須是可行的且可以在有限的時間內完成。

算法的分類

算法是一門古老且龐大的學科,隨著歷史的發展,演化出多種多樣的算法。按照不同的應用和特性,可以分為不同的類別。

1.按照應用來分類

按照算法的應用領域,也就是解決的問題,算法可以分為基本算法、數據結構相關的算法、幾何算法、圖論算法、規劃算法、數值分析算法、加秘/解密算法、排序算法、查找算法、并行算法和數論算法等。

2.按照確定性來分類

按照算法結果的確定性來分類,可以分為確定性算法和非確定性算法。

?確定性算法:這類算法在有限的時間內完成計算,得到的結果是唯一的,且經常取決于輸入值。

?非確定性算法:這類算法在有限的時間內完成計算,但是得到的結果往往不是唯一的,也就是存在多值性。

3.按照算法的思路來分類

按照算法的思路來分類,算法可以分為遞推算法、遞歸算法、窮舉算法、貪婪算法、分治算法、動態規劃算法和迭代算法等多種。

算法相關概念的區別

算法其實是一種很抽象的概念,往往需要依托于具體的實現方法才能體現其價值,例如在計算機編程中的算法、數值計算中的算法等。本文所重點講解的便是算法在計算機中的應用。正是由于算法的抽象性,導致讀者很容易產生混淆,這里有必要說明一些基本概念。

算法與公式的關系

從當前所談到的算法,讓我們很容易聯想到數學中的公式。公式也是解決某類問題,有特定的輸入和結果輸出,能在有限時間內完成,并且公式都是完成可以操作計算的。其實公式確實是提供了一種算法,但算法不完全等于公式。

公式是一種高度精確的計算方法,可以認為就是一種算法,其是人類智慧的結晶。而算法并不一定是公式,算法的形式可以比公式更復雜,解決的問題更加廣泛。

算法與程序的關系

正如前面所述,算法是依托于具體的實現方式的。雖然我們一提到算法,就聯想到計算機程序設計,但算法并非如此。例如,在傳統的筆算中,通過紙和筆按照一定的步驟完成的計算也是算法的應用。在速記中,人們通過特殊的方式來達到快速牢固記憶的目的,這也是一種算法的應用。

在計算機程序設計中,算法的體現更加廣泛,幾乎每個程序都需要用到算法,只不過有些算法比較簡單,有些算法比較復雜。

算法和程序設計語言是不同的。目前較為主流的程序設計語言,包括VB、C、C++、Java、C#等。程序設計語言是算法實現的一種形式,也就是一種工具。我們往往需要首先熟悉程序語言的語法格式,然后才能使用這種程序語言編寫合適的算法實現程序。學習一門程序設計語言是比較容易的,難的是如何正確合理地運用算法來編寫求解問題。

算法和數據結構的關系

數據結構是數據的組成形式,可以用來表征特征的對象數據。在計算機程序設計中,操作的對象是各種各樣的數據,這些數據往往擁有不同的數據結構,例如數組、結構體、聯合、指針和鏈表等。因為不同的數據結構所采用的處理方式不同,計算的復雜程度也不同,因此算法往往是依賴于某種數據結構的。換言之,數據結構是算法實現的基礎。

計算機科學家尼克勞斯?沃斯(Nikiklaus Wirth)曾提出了一個著名的公式:數據結構+算法=程序。后來出版了《數據結構+算法=程序》,這一著作。我們從中可以看出算法和數據結構的關系。

通過前面的介紹,我們現在對程序、算法、數據結構設計有了比較深刻的認識。如果給出一個公式的話,可以表述成如下形式:

數據結構+算法+程序設計語言=程序

這里,數據結構往往表示的是處理的對象,算法是計算和處理的核心方法,程序設計語言是算法的實現方法。它們之間的綜合便構成一個實實在在的程序。算法是解決問題的一個抽象方法和步驟,同一個算法在不同的語言中具有不同的實現形式,這依賴于數據結構的形式和程序設計語言的語法格式(規則)。

算法的性能評價

算法其實就是解決問題的一種方法,一個問題的解決往往可以采用多種方法,但每種方法所有的時間和得到的效果往往是不一樣的。好的算法執行效率高,所耗費的時間短;差的算法則往往需要耗費更多的時間,導致效率很低。

算法的一個重要任務便是找到合適的、效率最高的解決問題的方法,也就是做好的算法。從理論上,這需要對算法的性能能有一個合理的評價。一個算法優劣往往通過算法復雜度來衡量,算法復雜度包括時間復雜度和空間復雜度兩個方面。

時間復雜度

時間復雜度也就是通常所說的算法執行所需要耗費的時間,時間越短,算法越好。一個算法執行的時間往往無法精確估算,通常需要在實際的計算機運行才能知道。但是,我們也可以對算法代碼進行估算,而得到算法的時間復雜度。

首先,算法代碼執行的時間往往和算法代碼中語句執行的數量有關。由于每條語句執行都是需要時間的,語句執行的次數越多,整個程序所耗費的時間就越長。因此,簡短、精悍的算法程序往往執行速度快。

另外,算法的時間復雜度還與問題的規模有關。這方面的專門的算法分析中有詳細的分析,有興趣的讀者可以參閱算法分析的相關書籍。

空間復雜度

空間復雜度指的是算法程序在計算機中執行所需要消耗的存儲空間。空間復雜度其實可以分為以下兩個方面:

? 程序保存所需要的存儲空間,也就是程序的大小。

? 程序在執行過程中所需要消耗的存儲空間資源,例如程序在執行過程中的中間變量等。

一般來說,程序的大小越小,執行過程所消耗的資源越少,這個程序越好。在算法分析中,空間復雜度有更為詳細的量度,有興趣的讀者可以閱讀相關的書籍。

文章出處: http://blog.csdn.net/mahoking/article/details/43758463

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!