天天看點

算法在身邊——學習算法從媽媽的菜單開始

聽到“算法(algorithm)”這個詞,大部分人都覺得好像很艱深晦澀。的确,這不是一個常常能聽到的詞。事實上,在數學、計算機等理工科領域,所謂的算法,指的就是“對特定問題的解決步驟”。而這裡說的特定問題,通常有: • 對資訊進行排序 • 搜尋目标資訊 等不同的問題。 此外,如果說“算法是解決問題的步驟”,那麼撇開計算機的資料處理不論,現實生活中也有很多問題的解決方法蘊含了算法的思想。這其中的代表就是菜單。

我們都知道,記錄做出各色各樣的菜品所需步驟的東西就是菜單。 例如: • 雞肉咖喱 • 馬鈴薯炖肉 以上兩個菜品的菜單裡,會把制作菜品所必需的材料種類、量标記清楚,并且把做菜的過程、每一步需要的時間等正确地記述下來。遵從這樣的步驟,無論是誰都可以做出一道不錯的雞肉咖喱或者馬鈴薯炖肉。 像這樣對給定問題(做一道雞肉咖喱等)給出可行解法的菜單,也就是“解決問題的步驟”,正可以稱得上是不錯的算法範例。

算法和菜單

算法在身邊——學習算法從媽媽的菜單開始

算法是人類智慧的結晶

按照菜單指定的方法做菜,有時候也不一定能做出好吃的菜。如果分毫不差地遵照一份菜單,結果做出來的菜并不好吃,那麼我們可以說那一份菜單“不是很好的菜單”。于是很自然地,那份菜單也就漸漸地沒什麼人用了。 而可以做出大家都覺得美味的菜的菜單,會有越來越多的人重複使用。這樣的菜單也就成了“好的菜單”。而好的菜單在越來越多人使用的情況下,會被慢慢地改善,可以指導人做出越來越美味的菜。像這樣,好的菜單上就聚集了為了做出美味的菜而付出的前人的智慧的結晶。 在程式中應用的算法也是一樣。自計算機面世,在利用計算機解決各種各樣的“問題”時,無數解法、步驟被人們提出來。“是不是可以更好地複用”、“是不是可以更高效”、“是不是可以花費更少的空間代價”等,很多研究者會從這些方面對現存的算法進行改善。而曆經時間的洗煉,那些優雅的算法正在被應用到各種計算機程式中去。像這樣,算法也一樣,聚集了為了編寫優雅的程式而付出的前人的智慧的結晶。

好的菜單正是優秀的算法

算法在身邊——學習算法從媽媽的菜單開始

了解算法對玩遊戲有幫助嗎

優秀的算法是編寫程式的範本,能幫助我們巧妙地解決問題。這和玩遊戲時用的攻略異曲同工。 在遊戲對戰的時候,采取更好的戰略往往容易獲得勝利。曾經有這麼一款射擊遊戲,它的玩法是:“用移動的炮台把從遊戲畫面上方不斷迫近的敵人擊落”。在這款遊戲的設計中,甚至還有直接寫成招式名稱的遊戲定式,譬如“○○式”、“△△攻擊”等。依照定式所訓示的步驟來操作,無論誰每次都可以打倒同樣的敵人。這種為遊戲通關設計的定式,也算是不錯的算法。 所謂的“定式”,原本是圍棋術語,指的是“在某種局面下,最優的固定下法”。在将棋1 或者國際象棋中,同等的東西被稱為“棋式”,在英文裡叫“theory”。在下圍棋的時候,在某種局面下隻要知道相應的定式,就可以在沒有“思考往後幾步的下法,在各種下法中找出最好的下法”的情況下,直接下出最好的一步棋。定式中彙集了無數前人的智慧,是以知道的定式越多,下赢不知道定式的對手就越簡單。 而計算機中的算法也是如此。一個學習過算法的人,即便沒有多高的天份,在編寫同樣功能的程式時,完成度比沒有學習過算法的人有明顯的優勢。

彙集前人智慧的定式也是優秀的算法

算法在身邊——學習算法從媽媽的菜單開始

算法有兩個必要條件

作為“解決問題的處理順序”的算法,必須要具備下述兩個重要的條件。 1.準确性 對相應的問題,算法必須能夠得出正确的結果。這正是算法的準确性。所謂算法的準确性,指的是“輸入符合指定條件的值,一定要保證能得到正确的輸出”。算法準确性的證明事實上并不簡單。乍看之下能夠得出正确結果的算法,很可能在多了某些特别的邊界輸入值的情況下就會發生謬誤。證明算法準确性的其中一個方法是,“對于算法中的任意一個步驟,輸入目前步驟滿足條件的值,看看是否能得到目前步驟産生的準确的結果,以此細分并判定。”這種方法叫斷言(assertion)。 2.可停止性 算法必須是最終可停止的。也就是說,一直重複,永遠也不能傳回結果的操作步驟(也叫死循環)是不能被稱作算法的。算法的可停止性也就是“保證無論什麼樣的輸入,也一定可以在有限時間内正确地停止”。

算法的兩大支柱

算法在身邊——學習算法從媽媽的菜單開始

要特别了解的重要算法

編寫程式時必要的算法浩如煙海,而其中有些是要特别了解的重要的算法。本書将介紹一些比較有代表性的算法。 1.專用于數論計算的算法 • 求解最大公約數的輾轉相除法 • 求解聯立方程的高斯消元法 • 求解定積分近似值的梯形公式 • 計算質數的埃拉托斯特尼篩法 2.對一組亂序的資料進行升序或者降序排序的算法(sort) • 選擇排序 • 冒泡排序 • 插入排序 • 希爾排序 • 歸并排序 • 快速排序 3.在大量資料中找出目标資料的搜尋算法(search) • 線性搜尋(linear search) • 二分搜尋(binary search) 4.在一個字元串中找到符合特定模式的子串(子字元串)的比對算法 • 簡單字元串搜尋 • kmp 算法 • bm 算法

有代表性的算法

算法在身邊——學習算法從媽媽的菜單開始

相關圖書:

算法在身邊——學習算法從媽媽的菜單開始

《寫給大家看的算法書》 來自漫畫帝國的圖解算法書 輕松掌握資料處理關鍵點 【日】杉浦 賢 著 絕雲 譯 2016年6月出版 ◎ 從基礎開始詳盡地講解算法 ◎ 将複雜的算法知識點與輕松有趣的漫畫故事結合 ◎ 采用大量生動的類比,配合簡潔易懂的配圖,深入淺出地講解算法

算法在身邊——學習算法從媽媽的菜單開始

繼續閱讀