算法图解 -- 书评
算法圖解
Grokking Algorithms
作者Aditya Bhargava,美國人。
?
這本書的定位正如封面副標題所言–像小說一樣有趣的算法入門書,作為一本入門級的算法書,這本書無疑是成功的,書中穿插著大量的圖解(作者自述自己為一個視覺性學習者),內容簡單,將一些經典的算法結合圖解以生動有趣的方式向讀者講解,使非程序員的讀者也能輕松理解(除了動態規劃部分本身就是一個難點)。同時,以小說為定位也很真實,本書共181頁,豐富的圖解、形象的表述、生動的表達使讀者很容易被吸引,短短一天內即可吸收完這本書的內容精華。
內容提要
本書示例豐富,圖文并茂,以簡明易懂的方式闡釋了算法,旨在幫助程序員在日常項目中更好地利用算法為軟件開發助力。前三章介紹算法基礎,包括二分查找、大 O 表示法、兩種基本的數據結構以及遞歸等。余下的篇幅將主要介紹應用廣泛的算法,具體內容包括 :面對具體問題時的解決技巧,比如何時采用 貪婪算法或動態規劃 ;散列表的應用 ;圖算法
;K 最近鄰算法。
本書適合所有程序員、計算機專業相關師生以及對算法感興趣的讀者。
第一章 算法簡介
主要內容
講解了二分查找算法,介紹了大O表示法。
O(log n),也叫對數時間,這樣的算法包括二分查找。
O(n),也叫線性時間,這樣的算法包括簡單查找。
O(n * log n),這樣的算法包括第4章將介紹的快速排序——一種速度較快的排序算法。 ? O(n2),這樣的算法包括第2章將介紹的選擇排序——一種速度較慢的排序算法。
O(n!),這樣的算法包括接下來將介紹的旅行商問題的解決方案——一種非常慢的算法。
O(1),常數時間。
小結
二分查找的速度比簡單查找快得多。
O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
算法運行時間并不以秒為單位。
算法運行時間是從其增速的角度度量的。
算法運行時間用大O表示法表示。
第二章 選擇排序
主要內容
介紹數組和鏈表,分析了兩者查找、插入、刪除的時間復雜度,說明了兩者的適用范圍。
講解了選擇排序算法的原理和實現。
需要檢查的元素數越來越少
隨著排序的進行,每次需要檢查的元素數在逐漸減少,最后一次需要檢查的元素都只有一 個。既然如此,運行時間怎么還是O(n2)呢?這個問題問得好,這與大O表示法中的常數相關。 第4章將詳細解釋,這里只簡單地說一說。
你說得沒錯,并非每次都需要檢查n個元素。第一次需要檢查n個元素,但隨后檢查的元素 數依次為n - 1, n – 2, …, 2和1。平均每次檢查的元素數為1/2 × n,因此運行時間為O(n × 1/2 × n)。 但大O表示法省略諸如1/2這樣的常數(有關這方面的完整討論,請參閱第4章),因此簡單地寫 作O(n × n)或O(n2)。
小結
計算機內存猶如一大堆抽屜。
需要存儲多個元素時,可使用數組或鏈表。
數組的元素都在一起。
鏈表的元素是分開的,其中每個元素都存儲了下一個元素的地址。
數組的讀取速度很快。
鏈表的插入和刪除速度很快。
在同一個數組中,所有元素的類型都必須相同(都為int、double等)。
第三章 遞歸
主要內容
介紹了遞歸(遞歸只是讓解決方案更清晰,并沒有性能上的優勢),注意是基線條件(base case)和遞歸條件(recursive case),重點是調用棧及遞歸調用棧。
尾遞歸
小結
遞歸指的是調用自己的函數。
每個遞歸函數都有兩個條件:基線條件和遞歸條件。
棧有兩種操作:壓入和彈出。
所有函數調用都進入調用棧。
調用棧可能很長,這將占用大量的內存。
第四章 快速排序
主要內容
介紹了分治法,講解了D&C算法–快速排序算法的原理和實現(基準值 pivot 和分區 partitioning)。比較了快排和歸并排序的性能。
解釋了大O表示法的平均情況和最糟情況。
提示:編寫涉及數組的遞歸函數時,基線條件通常是數組為空或只包含一個元素。陷入困境時, 請檢查基線條件是不是這樣的。
小結
D&C將問題逐步分解。使用D&C處理列表時,基線條件很可能是空數組或只包含一個元 素的數組。
實現快速排序時,請隨機地選擇用作基準值的元素。快速排序的平均運行時間為O(n log n)。
大O表示法中的常量有時候事關重大,這就是快速排序比合并排序快的原因所在。
比較簡單查找和二分查找時,常量幾乎無關緊要,因為列表很長時,O(log n)的速度比O(n) 快得多。
第五章 散列表
主要內容
本章介紹了散列表和散列函數及其實現原理,解釋了填充因子定義及作用。介紹了Python的散列表的應用–字典 dict()。
介紹了散列表的應用范圍:查找、防止重復、緩存。
你可能根本不需要自己去實現散列表,任一優秀的語言都提供了散列表實現。Python提供的 散列表實現為字典,你可使用函數dict來創建散列表。
經驗規則: 一旦填裝因子大于0.7,就調整散列表的長度。
小結
你幾乎根本不用自己去實現散列表,因為你使用的編程語言提供了散列表實現。你可使用
Python提供的散列表,并假定能夠獲得平均情況下的性能:常量時間。 散列表是一種功能強大的數據結構,其操作速度快,還能讓你以不同的方式建立數據模型。
你可能很快會發現自己經常在使用它。
你可以結合散列函數和數組來創建散列表。
沖突很糟糕,你應使用可以最大限度減少沖突的散列函數。
散列表的查找、插入和刪除速度都非常快。
散列表適合用于模擬映射關系。
一旦填裝因子超過0.7,就該調整散列表的長度。
散列表可用于緩存數據(例如,在Web服務器上)。
散列表非常適合用于防止重復。
第六章 廣度優先搜索
主要內容
簡介了圖(有向圖、無向圖),講解了BFS實現算法(運行時間O(V+E))。介紹了拓撲排序。
廣度優先搜索是一種用于圖的查找算法,可幫助回答兩類問題。
第一類問題:從節點A出發,有前往節點B的路徑嗎?
第二類問題:從節點A出發,前往節點B的哪條路徑最短?
小結
廣度優先搜索指出是否有從A到B的路徑。
如果有,廣度優先搜索將找出最短路徑。
面臨類似于尋找最短路徑的問題時,可嘗試使用圖來建立模型,再使用廣度優先搜索來 解決問題。
有向圖中的邊為箭頭,箭頭的方向指定了關系的方向,例如,rama→adit表示rama欠adit錢。
無向圖中的邊不帶箭頭,其中的關系是雙向的,例如,ross - rachel表示“ross與rachel約會,而rachel也與ross約會”。
隊列是先進先出(FIFO)的。
棧是后進先出(LIFO)的。
你需要按加入順序檢查搜索列表中的人,否則找到的就不是最短路徑,因此搜索列表必 須是隊列。
對于檢查過的人,務必不要再去檢查,否則可能導致無限循環。
第七章 狄克斯特拉算法
主要內容
講解了狄克斯特拉算法的實現,適用范圍為有向無環圖DAG且沒有負權邊。
狄克斯特拉算法包含4個步驟。
(1) 找出“最便宜”的節點,即可在最短時間內到達的節點。
(2) 更新該節點的鄰居的開銷,其含義將稍后介紹。
(3) 重復這個過程,直到對圖中的每個節點都這樣做了。
(4) 計算最終路徑。
貝爾曼-福德算法(Bellman-Ford algorithm)
小結
廣度優先搜索用于在非加權圖中查找最短路徑。
狄克斯特拉算法用于在加權圖中查找最短路徑。
僅當權重為正時狄克斯特拉算法才管用。
如果圖中包含負權邊,請使用貝爾曼-福德算法。
第八章 貪婪算法
主要內容
講解了如何用貪婪算法解決教室調度問題、背包問題、集合覆蓋問題。介紹了NP完全問題,詳解了旅行商問題。給出了識別NP完全問題的方法。
貪婪算法很簡單:每步都采取最有的做法。用專業術語說,就是你每步都選擇局部最優解,最終得到的就是全局最優解。
NP完全問題的簡單定義是,以難解著稱的問題.
沒辦法判斷問題是不是NP完全問題,但還是有一些蛛絲馬跡可循的。
- 元素較少時算法的運行速度非常快,但隨著元素數量的增加,速度會變得非常慢。
- 涉及“所有組合”的問題通常是NP完全問題。
- 不能將問題分成小問題,必須考慮各種可能的情況。這可能是NP完全問題。
- 如果問題涉及序列(如旅行商問題中的城市序列)且難以解決,它可能就是NP完全問題。
- 如果問題涉及集合(如廣播臺集合)且難以解決,它可能就是NP完全問題。
- 如果問題可轉換為集合覆蓋問題或旅行商問題,那它肯定是NP完全問題。
小結
貪婪算法尋找局部最優解,企圖以這種方式獲得全局最優解。
對于NP完全問題,還沒有找到快速解決方案。
面臨NP完全問題時,最佳的做法是使用近似算法。
貪婪算法易于實現、運行速度快,是不錯的近似算法。
第九章 動態規劃
主要內容
通過講解了如何用動態規劃方法解決背包問題說明動態規劃問題的基本方法–網格,又講解了動態規劃問題–最長公共子串。
費曼算法(Feynman algorithm)
步驟如下:
(1) 將問題寫下來。
(2) 好好思考。
(3) 將答案寫下來。
小結
需要在給定約束條件下優化某種指標時,動態規劃很有用。
問題可分解為離散子問題時,可使用動態規劃來解決。
每種動態規劃解決方案都涉及網格。
單元格中的值通常就是你要優化的值。
每個單元格都是一個子問題,因此你需要考慮如何將問題分解為子問題。
沒有放之四海皆準的計算動態規劃解決方案的公式。
第十章 K最近鄰算法
主要內容
講解了KNN算法的原理,引出了機器學習的概念,簡單介紹了OCR、創建垃圾郵件過濾器。
畢達哥拉斯公式(歐式距離)
余弦相似度(cosine similarity)
樸素貝葉斯分類器(Naive Bayes classifier)
小結
KNN用于分類和回歸,需要考慮最近的鄰居。
分類就是編組。
回歸就是預測結果(如數字)。
特征抽取意味著將物品(如水果或用戶)轉換為一系列可比較的數字。
能否挑選合適的特征事關KNN算法的成敗。
第十一章 接下來如何做
主要內容
簡單提及了10個作者認為打算深入學習者進一步可以選擇的學習內容和方向。
pdf下載
總結
以上是生活随笔為你收集整理的算法图解 -- 书评的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一个JavaScript实例-动态省
- 下一篇: Work Tips