2018-11-07
演算法運用(讀《智慧科學技術導論》筆記)
學計算機玩的就是演算法,演算法之於程式員就如同菜譜之於廚師。人類通過編制演算法,將智慧"植入"機器系統,演算法越智慧,機器越智慧。
一、演算法構造
演算法:指解決一個(智慧)計算問題具體步驟的集合。這個步驟需要通過一定的形式來呈現。
1、界定演算法的性質
1)演算法的性質
-
有序性
-
有限性:步驟有限
-
明確性
-
終止性:執行時間有限(but,也有例外,作業系統需永不終止)
2)演算法內涵與演算法表示之間的關係
-
演算法內涵:指一個演算法固有的功能本質,完成某一任務的具體步驟及其內在聯絡。
-
演算法表示:具體給出的文字描述,可以有很多版本
-
它們兩可以類比金庸的《神鵰俠侶》:《神鵰俠侶》只有一本書,但是卻有很多版本的電視劇。
3)演算法的效率
-
演算法的效率:指執行一個演算法程式所要花費的時空代價。
-
演算法的計算複雜性(複雜性當量 O(f(n))):一般情況下,我們僅僅從理論上來討論演算法的效率,即對於給定的輸入資料規模(n),一個演算法需要動態執行多少個計算步驟(f(n))。
-
問題本身的計算複雜性:期望能夠找到問題的最低計算複雜性的演算法。
4)演算法的正確性
2、描述演算法的虛擬碼
1)原語
-
原語:可以精確描述演算法的形式語言就成為原語
-
原語=語法(規定原語中符號組合的規則)+語義(說明原語中符號及其組塊的含義)
2)偽碼
-
為了使描述演算法的高階語言具有某種通用性,推出偽碼作為原語。
-
偽碼:是一種重在表達演算法思想的非正式符號系統。
-
有時為了更直觀表達演算法的思想,常用流程圖對偽碼描述的演算法作補充說明
3)具體規範
-
賦值語義結構:(變數)name<—expression(表示式)
-
條件語義結構:if(條件)then(活動1)else(活動2)
-
迴圈語義結構:
while(條件)do(活動)
repeat(活動)until(條件)
-
為了使得偽碼更具可讀性,一般規定語句之間用分號隔開,如果一個語句內部嵌有另一個語句,則採用縮排格式,相信會程式設計的同學都知道是怎麼沒一回事。
-
偽碼還有一個類似於函式的定義——過程。一般過程的定義方式為:
**procedure** name(參量)
偽碼段
引用之處直接用語句“procedure name(參量)”
- 有時,為了使偽碼可讀性更高,在巢狀的語句中,每一層語句的結束都用明顯的標識來醒目地加以標記,end while 、end if
3、演算法構造的過程
最重要的就是發現演算法,本質上是一個理解、解決問題的過程
1)演算法發現的四個階段
參照美籍匈利亞數學家波利亞給出解決問題的一般原理,形成演算法發現的如下四個階段:
-
階段一:理解問題
-
階段二:尋找一個可能解決問題的演算法過程(思路)
-
階段三:闡明演算法並且用偽碼將其表達出來
-
階段四:從準確度以及作為解決普適問題的一個工具的潛力這兩個方面來評估這個演算法。(這一步今天第一次見,值得深思)
2)想要增加解決問題的思路,可以去看美國科普作家加德納所著的《啊哈,靈機一動》 (這本書我也還沒有看,是本書的作者老師推薦的,決定明年1月份之前讀完)
3)能夠解決複雜問題的逐步求精法
逐步求精:就是通過把複雜問題不斷分解為子問題,直到分解的子問題能夠給出解決思路,然後將子問題的解決思路一層層整合起來,最終給出總問題的解決思路。(從上而下,再從下而上。 就像每次打包行李,先想好去哪帶哪幾類東西,再把要帶的東西分塊裝好,最後把這些東西放到行李箱)
二、演算法結構
推薦由美國學者納希和希內德曼提出的N-S盒圖來輔助分析演算法的複雜結構