哲:算法的哲學思考

這位大佬是個比較會思考的人,,,,有點意思,符合口味,,,

算法的哲學思考

 

 

算法的哲學思考

置頂 2012年02月19日 13:07:15 yangjl38 閱讀數:1735

1       算法的哲學思考

算法在“在線新華字典”中的解釋是“解題方案的準確和完整的描述。是一個有窮的動作步驟序列,只有一個初始態,每個動作只有一個後繼動作,一步一步地直到序列結束。是解題從開始到結束的動作全過程。”。“算”字的解釋是“覈計,計數”,“法”字的解釋是“體現統治階段的意志,國家制定和頒佈的公民必須遵守的行爲規則”。

1.1  算法的定義

算法可以理解爲有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題。

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

1.2  算法的特徵

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

(1)     有窮性(Finiteness)

  算法的有窮性是指算法必須能在執行有限個步驟之後終止

(2)     確切性(Definiteness)

  算法的每一步驟必須有確切的定義;

(3)     輸入項(Input)

  一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法本身定出了初始條件;

(4)     輸出項(Output)

  一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的算法是毫無意義的;

(5)     可行性(Effectiveness)

  算法中執行的任何計算步都是可以被分解爲基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之爲有效性);

(6)     高效性(High efficiency)

  執行速度快,佔用資源少;

(7)     健壯性(Robustness)

  對數據響應正確。

1.3  算法的複雜度

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

(1)     時間複雜度

算法的時間複雜度是指執行算法所需要的時間。一般來說,計算機算法是問題規模n 的函數f(n),算法的時間複雜度也因此記做T(n)=Ο(f(n))   

因此,問題的規模n 越大,算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間複雜度(Asymptotic Time Complexity)。

(2)     空間複雜度

 算法的空間複雜度是指算法需要消耗的內存空間。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。

1.4  算法設計與分析的基本方法

(1)     遞推法

遞推算法是一種用若干步可重複的簡運算(規律)來描述複雜問題的方法.   遞推是序列計算機中的一種常用算法。它是按照一定的規律來計算序列中的每個項,通常是通過計算機前面的一些項來得出序列中的指定項的值。其思想是把一個複雜的龐大的計算過程轉化爲簡單過程的多次重複,該算法利用了計算機速度快和不知疲倦的機器特點。

(2)     遞歸法

程序調用自身的編程技巧稱爲遞歸( recursion)。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化爲一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重複計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。注意: (1) 遞歸就是在過程或函數裏調用自身; (2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。

(3)     窮舉法

窮舉法,或稱爲暴力破解法,是一種針對於密碼的破譯方法,即將密碼進行逐個推算直到找出真正的密碼爲止。例如一個已知是四位並且全部由數字組成的密碼,其可能共有10000種組合,因此最多嘗試10000次就能找到正確的密碼。理論上利用這種方法可以破解任何一種密碼,問題只在於如何縮短試誤時間。因此有些人運用計算機來增加效率,有些人輔以字典來縮小密碼組合的範圍。

(4)     貪心算法

貪婪算法是一種對某些求最優解問題的更簡單、更迅速的設計技術。用貪婪法設計算法的特點是一步一步地進行,常以當前情況爲基礎根據某個優化測度作最優選擇,而不考慮各種可能的整體情況,它省去了爲找最優解要窮盡所有可能而必須耗費的大量時間,它採用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇就將所求問題簡化爲一個規模更小的子問題, 通過每一步貪心選擇,可得到問題的一個最優解,雖然每一步上都要保證能獲得局部最優解,但由此產生的全局解有時不一定是最優的,所以貪婪法不要回溯。 

貪婪算法是一種改進了的分級處理方法。其核心是根據題意選取一種量度標準。然後將這多個輸入排成這種量度標準所要求的順序,按這種順序一次輸入一個量。如果這個輸入和當前已構成在這種量度意義下的部分最佳解加在一起不能產生一個可行解,則不把此輸入加到這部分解中。這種能夠得到某種量度意義下最優解的分級處理方法稱爲貪婪算法。 對於一個給定的問題,往往可能有好幾種量度標準。初看起來,這些量度標準似乎都是可取的,但實際上,用其中的大多數量度標準作貪婪處理所得到該量度意義下的最優解並不是問題的最優解,而是次優解。因此,選擇能產生問題最優解的最優量度標準是使用貪婪算法的核心。 一般情況下,要選出最優量度標準並不是一件容易的事,但對某問題能選擇出最優量度標準後,用貪婪算法求解則特別有效。最優解可以通過一系列局部最優的選擇即貪婪選擇來達到,根據當前狀態做出在當前看來是最好的選擇,即局部最優解選擇,然後再去解做出這個選擇後產生的相應的子問題。每做一次貪婪選擇就將所求問題簡化爲一個規模更小的子問題,最終可得到問題的一個整體最優解。

(5)     分治法

分治法是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。   

分治法所能解決的問題一般具有以下幾個特徵:(1) 該問題的規模縮小到一定的程度就可以容易地解決;(2) 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質;(3) 利用該問題分解出的子問題的解可以合併爲該問題的解;(4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。

(6)     動態規劃法

動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解爲相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種算法的基礎,被廣泛應用於計算機科學和工程領域。   

動態規劃程序設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊算法。不象前面所述的那些搜索或數值計算那樣,具有一個標準的數學表達式和明確清晰的解題方法。動態規劃程序設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解題方法,而不存在一種萬能的動態規劃算法,可以解決各類最優化問題。因此讀者在學習時,除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想象力去建立模型,用創造性的技巧去求解。

(7)     迭代法

迭代法也稱輾轉法,是一種不斷用變量的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱爲一次解法),即一次性解決問題。迭代法又分爲精確迭代和近似迭代。“二分法”和“牛頓迭代法”屬於近似迭代法。迭代算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快、適合做重複性操作的特點,讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組指令(或這些步驟)時,都從變量的原值推出它的一個新值。

(8)     分枝界限法

分枝界限法是一個用途十分廣泛的算法,運用這種算法的技巧性很強,不同類型的問題解法也各不相同。分支定界法的基本思想是對有約束條件的最優化問題的所有可行解(數目有限)空間進行搜索。該算法在具體執行時,把全部可行的解空間不斷分割爲越來越小的子集(稱爲分支),併爲每個子集內的解的值計算一個下界或上界(稱爲定界)。在每次分支後,對凡是界限超出已知可行解值那些子集不再做進一步分支。這樣,解的許多子集(即搜索樹上的許多結點)就可以不予考慮了,從而縮小了搜索範圍。這一過程一直進行到找出可行解爲止,該可行解的值不大於任何子集的界限。因此這種算法一般可以求得最優解。 

與貪心算法一樣,這種方法也是用來爲組合優化問題設計求解算法的,所不同的是它在問題的整個可能解空間搜索,所設計出來的算法雖其時間複雜度比貪婪算法高,但它的優點是與窮舉法類似,都能保證求出問題的最佳解,而且這種方法不是盲目的窮舉搜索,而是在搜索過程中通過限界,可以中途停止對某些不可能得到最優解的子空間進一步搜索(類似於人工智能中的剪枝),故它比窮舉法效率更高。

1.5  算法的表現形式

描述算法可以使用自然語言、僞代碼、流程圖和PAD圖等多種不同的方法來描述,其中最普遍的是流程圖。

1.6  算法的分類

算法可大致分爲基本算法、數據結構的算法、數論與代數算法、計算幾何的算法、圖論的算法、動態規劃以及數值分析、加密算法、排序算法、檢索算法、隨機化算法、並行算法。算法可以宏泛的分爲三類:   

(1)     有限的,確定性算法

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

(2)     有限的,非確定算法

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

(3)     無限的算法

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

 

2       程序基本運算的認識

算法=基本運算+運算軌跡+運算數據,即一個算法是由基本運算、運算軌跡

和運算數據構成。基本運算是程序中的最小的不可分隔的運算原子活動,如付值運算、關係運算等;運算軌跡是指基本運算按順序、分支、循環三個形式中的一個或幾個組合而成的時間序;運算數據是指基本運算中要用到的變量、結構、數組等數據。

   程序中的基本運算包括賦值運算、關係運算、邏輯運算、位運算、位移運算、集合運算等。在程序中基本運算是由表達式構成。表達式由多個(兩個或兩個以上)標識符用各種運算符號連接起來而成,即表達式=標識符+運算符。  

2.1  基本運算分類

2.1.1       賦值運算

賦值運算表達式=標識符+賦值運算符。賦值運算符分爲簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類。

2.1.2       算述運算

算述運算表達式=標識符+算述運算符。算述運算符分爲加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)、自增(++)、自減(--)等。

2.1.3       關係運算

關係運算表達式=標識符+關係運算符。關係運算符分爲大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)等。

2.1.4       邏輯運算

邏輯運算表達式=標識符+邏輯運算符。邏輯運算符分爲與(&&)、或(||)、非(!)等。

2.1.5       位運算

位運算表達式=標識符+位運算符。位運算符分爲位與(&)、位或(|)、位非(~)、位異或(^)等。

2.1.6       位移運算

位移運算表達式=標識符+位移運算符。位移運算符分爲左移(<<)、右移(>>)等。

2.1.7       條件運算

條件運算表達式=標識符+條件運算符。條件運算符是一個三目運算符,用於條件求值(?:)。

2.1.8       特殊運算

特殊運算表達式=標識符+特殊運算符。特殊運算符分爲括號(),下標[],成員(.)等。

2.2  基本運算的優先級和結合性

運算符是有優先級的。在表達式中,優先級較高的先於優先級較低的進行運算。 而在一個運算量兩側的運算符優先級相同時, 則按運算符的結合性所規定的結合方向處理。 語言中各運算符的結合性分爲兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z則y應先與“-”號結合, 執行x-y運算,然後再執行+z的運算。這種自左至右的結合方向就稱爲“左結合性”。而自右至左的結合方向稱爲“右結合性”。 最典型的右結合性運算符是賦值運算符。如x=y=z,由於“=”的右結合性,應先執行y=z再執行x=(y=z)運算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章