天天看點

算法導論

  

算法導論

一.算法

  非形式地說,算法【algorithm】就是任何定義的計算過程,該過程取某個值或值的集合作為輸入并産生某個值或值的集合作為輸出。這樣算法就是把輸入轉換成輸出的計算步驟的一個序列。

  我們也可以把算法看成是用于求解計算問題的工具。一般來說,問題陳述說明了期望的輸入/輸出關系。算法則描述一個特定的計算過程來實作該輸入/輸出關系。例如,我們可能需要把一個數列進行升序排序。實際上,這個問題經常出現,并且為引入許多标準的設計技術和分析工具提供了足夠的理由。

  輸入:n個數的一個序列(a1,a2,...,an)

  輸出:輸入序列的一個排序(a`1,a`2,...,a`n)

  例如,給定輸入序列(6,3,1,2,8,5),排序算法将傳回序列(1,2,3,5,6,8)作為輸出。這樣的輸入序列稱為排序問題的一個執行個體。一般來說,問題執行個體由計算該問題解所必需的【滿足問題陳述中的各種限制】輸入組成。

  因為許多程式使用排序作為中間步驟,是以排序是計算機科學中的一個基本操作。是以,已有許多好的排序算法供我們任意使用。對于給定應用,哪個算法最好依賴于一下因素:将要被排序的項數、這些項已被稍微排序的程度、關于項值的可能限制、計算機的體系結構、以及使用的儲存設備的種類【記憶體、磁盤或錄音帶】。

  若對每個輸入執行個體算法都以正确的輸出結束,則稱該算法是正确的,并稱正确的算法解決了給定的計算問題。不正确的算法對某些輸入執行個體可能根本不停止,也可能以不正确的方式結束。與人們期望的相反,不正确的算法隻要其錯誤率是可控的,有時還是有用的。例如:在研究大素數算法時,将會是一個具有可控錯誤率的算法。

  算法可以用英文說明,也可以說明成計算機程式,甚至說明成硬體設計。唯一的要求是這個說明必須準确描述所要遵循的計算過程。

二.算法解決那些問題

  排序絕不是已開發算法的唯一計算問題,實際上,算法的實際應用是無處不在的,例如:

算法導論

  1.人類基因工程

    識别人類DNA中所有10萬個基因,确定構成人類DNA的30億個化學基對的序列。

  2.網際網路搜尋

    網際網路使得全世界的人都能快速地通路與檢索大量資訊。借助于一些聰明的算法,網際網路上的網站能夠管理和處理這些海量資料。

  3.電子商務

    電子商務使得貨物能夠以電子方式洽談與交換,并且依賴于信用卡号、密碼和銀行結單這類個人資訊的保密性。

  4.制造業、廣告推送等等

  5.A/B兩點的最短路徑

  6.最長公共子序列

  7.工廠流水線設計等等

  雖然這些問題的清單還未窮盡,但是它們卻展示了許多有趣的算法問題所共有的兩個特征:

    1.存在許多候選解,但絕大多數候選解都沒有解決手頭上的問題。尋找一個真正的解或一個最好的解可能是一個很大的挑戰。

    2.存在實際應用。例如,最短路徑問題就是一個很常見的例子。地圖導航、貨物運輸、網絡路由等等

三.資料結構

  資料結構是一種存儲群組織資料的方式,旨在便于通路和修改。沒有一種單一的資料結構對所有用途都有效,所有重要的是知道不同資料結構的優點和局限。

四.技術

算法導論

  雖然你可能掌握了很多的算法,但是也許某一天你會遇到這樣一個問題,你一時無法找到一個你所知曉或搜尋到的算法來解決它。那麼你需要知道如何自己設計與分析一個算法,并且可以去證明及測試它的效率。

五.并行性

  我們或許可以指望處理器時脈速度能以某個持續的比率增加多年。然而實體的限制對不斷提高的時脈速度給出了一個限制:因為功率密度随着時脈速度超線性增長,一旦時脈速度變的足夠快,晶片就有融化的危險。是以,為了每秒執行更多的計算,晶片被設計成包含不止一個核心,不同核心之間可以并行執行。是以,為了算法從多核計算機中獲得最佳性能,設計算法時必須考慮并行性。

六.算法無處不在

算法導論

  我們應該像計算機硬體一樣把算法看成一種技術。整個系統的性能不但依賴于選擇快速的硬體而且還依賴于選擇有效的算法。可能你會想,我隻是開發一個簡單的WEB程式,隻有html和css,那麼抱歉,其中還是設計了不少算法,其中,圖形界面的渲染依賴了算法,WEB程式依賴網際網路,網絡中的路由高度依賴路由算法。程式需要中有需要編譯的代碼沒?編譯器也廣泛使用算法。是以,算法時目前計算機中使用的大多數計算的核心。

  進一步說,随着計算機能力的不斷增強,我們使用計算機來解決比之前更大的問題,是以,在面對海量的資料時,算法的優劣就顯得尤為重要。

  是否具有算法知識與技術的堅實基礎是區分真正熟練的程式員與初學者的一個特征。使用現代計算技術,如果你對算法懂得不多,你也可以完成一些任務,但是,如果有一個好的算法背景,那麼你可以做的事情就會多得多。

繼續閱讀