经典算法书籍推荐以及算法书排行【算法四库全书】
經(jīng)典算法書籍推薦以及算法書排行【算法四庫全書】
作者:霞落滿天? ?https://linuxstyle.blog.csdn.net/? ??https://blog.csdn.net/21aspnet
行文方式:類似《四庫全書》截取經(jīng)典算法書目錄和精華篇章
版權(quán)說明:本文于2019年5月5日首發(fā)于CSDN,若有轉(zhuǎn)載請務必保留版權(quán),為了整理編排選擇全文內(nèi)容花費了2019年一個五一的時間。
文中截圖:文中所算書籍截圖版權(quán)屬于出版社,這里只是為了學術研究選了其中幾頁。
原文鏈接:https://linuxstyle.blog.csdn.net/article/details/89670703
https://blog.csdn.net/21aspnet/article/details/89670703
引子
算法是計算機科學領域最重要的基石之一。算法是程序的靈魂,只有掌握了算法,才能輕松地駕馭程序開發(fā)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?---《算法詳解(卷1)——算法基礎》內(nèi)容提要
現(xiàn)狀
算法已經(jīng)出現(xiàn)了很多年,目前國內(nèi)外關于算法的書可謂汗牛充棟,不過精品并不多。算法離不開數(shù)據(jù)結(jié)構(gòu),有些講算法的書并不以算法命名而是叫數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)并不等于算法,數(shù)據(jù)結(jié)構(gòu)是靜態(tài)的,而算法是動態(tài)的,數(shù)據(jù)結(jié)構(gòu)是起點和終點,而算法是過程。
算法本身有一定的學習曲線,選一本好書事半功倍,選一本爛書不一定事倍功半,很可能還是看不懂學不會。
網(wǎng)上也不乏一些推薦算法書的,大多數(shù)都是說好評,這種推薦用處不大,很多寫推薦的自己有沒有閱讀過都是問題,每本書的行文風格都大不同。
?
?
目的
每個閱讀者的看書目的也不同,有人可能就是需要一段可以運行的代碼就可以,有人只是想了解下算法的入門知識,還有人要做算法分析研究,所以需要進行比較,選擇適合自己的書。
本文不是空洞的說教哪一本算法書籍怎么怎么的好,那樣是缺乏理論依據(jù)的,本文以紅黑樹為例,實際運行代碼,在這個過程以源碼能否直接運行還是需要做很多修改才可以運行來進行比較。
?
約定
主要針對歐美經(jīng)典著作的中文版,如果英文很好建議看看一些論文和外文原著,絕大多數(shù)程序員和工程師還是看漢化的。
本文一律以算法代稱算法和數(shù)據(jù)結(jié)構(gòu)。
?
亞馬遜和豆瓣
一般看書評大多是看豆瓣的,豆瓣上的還是有一定的客觀性,不過依然有很多是只評不看的。
某些電商網(wǎng)站的基本都是好評,這種跟風更是失去了參考意義,不管哪一本書基本90%都是好評甚至是湊數(shù)的評價。
最真實的評價是亞馬遜英文版的點評。
不過這里又有一個問題漢化所以如果漢化翻譯的不好那么一本很好的書可能會遜色很多,甚至節(jié)外生枝。
先看最熱門的算法書:
其實看封面就知道是那幾本了,這幾本書其實都已經(jīng)翻譯成中文了,
分別是《算法導論(原書第3版)》《算法 第4版》《算法設計指南 第二版》《算法圖解 ?像小說一樣有趣的算法入門書》《數(shù)據(jù)結(jié)構(gòu)與算法分析 : C語言描述》《算法概論》和豆瓣的排行略有差異,順序有不同。
截圖并不代表本文就完全認同這個排名,不然也就失去寫此文的目的,而且豆瓣和亞馬遜本身排名就不同也說明問題。
本文就以這幾本書為核心,但是又不局限于這幾本書,常見的經(jīng)典的和常見的算法書都會比較。
算法書非常多,很多書“評價”很高,但是真的就一定適合你么?不一定!很多好評是人云亦云的,蝴蝶效應而已,因為很多時候如果別人都說這書好,自己硬是說不好似乎錯的是自己?不過也有一些人還是堅持自己的觀點,說出某些好評非常多的書的不足,這些人是真正看書的,也是學到東西的人。我相信,一個人只有看出書中的錯誤才證明他在這個領域有所建樹。
?
漢化的問題
1)翻譯不準,這個問題是老大難問題,說實話計算機書籍的翻譯一般都不是專業(yè)翻譯,只能詞達意,要想信達雅很難,很多時候是閱讀者自己水平不夠看不懂,然后怪罪于譯者,有時候有些英文作者本身語句就很難理解,當然也有些翻譯確實又欠缺之處。
2)分卷出版,這個問題其實非常嚴重,一本書如果不太厚分卷是非常不便于閱讀,還有些書分卷之后下卷或者第二卷遲遲不出版,只有半卷的書看起來自然是不完整的,總不至于讓人買其他書補充是不是?
3)破壞原書,這個問題最嚴重,作者自己胡亂夾塞,非要自己加一段“譯者注”,本來看著好好的突然來一段“譯者注”,要知道譯者的水平和原著可是相差萬里,這種破壞原書的行為是非??膳碌?#xff0c;就像在一杯美味的咖啡里加入了怪味豆。
?
好書評比的標準
總要有個標準,最好是數(shù)據(jù)化,不然何以服人?
1.文字
一本書最多的就是文字,語句通順,容易理解是最重要的,這取決于原始英文的文字水平和翻譯后的水平,有些時候不一定是翻譯的問題原作就有問題。
2.圖表
文字有些時候沒有圖形更有更富的表現(xiàn)力,特別是演示算法變化。有表格更好,表格在統(tǒng)計學上的卓越表現(xiàn)是文字更難以代替的。
3.深度廣度
涵蓋常見算法,這是必須的。最起碼紅黑樹要有吧,想想平時程序員關于算法的口頭禪是什么,是不是某某大廠面試需要手撕紅黑樹,所有紅黑樹自然不能少,而且紅黑樹出現(xiàn)也有30多年了,對于1970年代的樹可以不要求,但是總不能說一本2000年之后的樹不寫紅黑樹吧,特別是很多以面試為目的的閱讀者,如果買到一本沒有寫紅黑樹的書。
更廣義的算法廣度應該是包含NP問題,動態(tài)規(guī)劃,流網(wǎng)絡等內(nèi)容。
程序員買書無非是解決工作問題或者準備面試,如果太淺顯只能當科普了。
關于紅黑樹參考以下:
為什么Java8中HashMap鏈表使用紅黑樹而不是AVL樹
https://blog.csdn.net/21aspnet/article/details/88939297
Linux內(nèi)核的紅黑樹源碼實現(xiàn)以及調(diào)用
https://blog.csdn.net/21aspnet/article/details/89641002
https://linuxstyle.blog.csdn.net/article/details/89641002
4.源碼
有些書是偽碼,有些是C,有些C++,還有Java的,最進一些新書有Python的。
偽碼不一定就不好,不能運行的代碼不如偽碼。
說了這么多總該進入整題了。
?
算法書排行榜
?
1.《算法導論(原書第3版)》
作者:Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein /?
正如這本書自己的介紹所說在有關算法的書中,在有關算法的書中,有一些敘述非常嚴謹,但不夠全面;另一些涉及了大量的題材,但又缺乏嚴謹性。本書將嚴謹性和全面性融為一體,深入討論各類算法,并著力使這些算法的設計和分析能為各個層次的讀者接受。全書各章自成體系,可以作為獨立的學習單元;算法以英語和偽代碼的形式描述,具備初步程序設計經(jīng)驗的人就能看懂;說明和解釋力求淺顯易懂,不失深度和數(shù)學嚴謹性。
全書選材經(jīng)典、內(nèi)容豐富、結(jié)構(gòu)合理、邏輯清晰,對本科生的數(shù)據(jù)結(jié)構(gòu)課程和研究生的算法課程都是非常實用的教材,在IT專業(yè)人員的職業(yè)生涯中,本書也是一本案頭必備的參考書或工程實踐手冊。
本書的作者是麻省理工系任教或者研究生畢業(yè),簡介:
Charles E. Leiserson(查爾斯?雷瑟爾森)麻省理工學院計算機科學與電氣工程系教授。
Thomas H. Cormen (托馬斯?科爾曼) 達特茅斯學院計算機科學系教授、系主任。他分別于1993年、1986年獲得麻省理工學院電子工程和計算機科學博士、碩士學位,師從Charles E. Leiserson教授,也就是上面這位的學生。
Ronald L. Rivest (羅納德?李維斯特)現(xiàn)任麻省理工學院電子工程和計算機科學系。他和Adi Shamir和Len Adleman一起發(fā)明了RSA公鑰算法,這個算法在信息安全中獲得最大的突破,這一成果也使他和Shamir、Adleman一起得到2002年ACM圖靈獎。他現(xiàn)在擔任國家密碼學會的負責人。
Clifford Stein(克利福德?斯坦)哥倫比亞大學計算機科學系和工業(yè)工程與運籌學系教授,他還是工業(yè)工程與運籌學系的系主任。在加入哥倫比亞大學大學之前,他在達特茅斯學院計算機科學系任教9年。Stein教授擁有MIT碩士和博士學位。
?
本書在內(nèi)容的廣度和深度方面是非常全面,先看本書目錄,作者先講了算法在計算中的作用,算法基礎,函數(shù)增長。
開篇第一章看似比較平淡,沒有怎么顯山縣水。
第6章開始講堆排序,第7章整一章講快速排序可見快排的重要性,其他書是把快速排序作為一種排序方法放在排序章節(jié)里。
第10章開始講基本數(shù)據(jù)結(jié)構(gòu),棧和隊列,鏈表,指針這是為了兼顧C/C++。
第11章散列表單獨一章,第12章二叉搜索樹,紅黑樹。
高級設計分析技術講了動態(tài)規(guī)劃,貪心算法(包含哈夫曼編碼),攤還分析(包含核算法)
?典型算法問題:線性規(guī)劃,計算幾何學,NP問題,旅行商問題,傅里葉變換。
作者在附錄里給出了補充的數(shù)學知識。
先看看作者關于分治策略是怎么講的,分治策略中遞歸的求解一個問題,在每層遞歸中應用如下三個步驟:
分解:將問題劃分為子問題,子問題的形式與原問題一樣,只是規(guī)模更小。想一想微服務拆分是不是也就是一種分解思想呢?
解決:遞歸的求解子問題,如果子問題規(guī)模足夠小則停止遞歸,直接求解。想一想微服務拆分服務拆分領域劃分到底拆到多微你是不是很多時候沒有一個標準?
合并:將子問題的解組合成原問題。想一想微服務是不是要聚合多個結(jié)果集。
所以說微服務拆分本身就是一種分治策略,都是一些前人早就總結(jié)的理論,沒有什么新的。
我們看看這本書對紅黑樹的講解,這是本文需要重點和其他算法書對比的地方:
紅黑樹的定義一共5點說的清清楚楚,和維基百科基本定義是一致的。
https://en.wikipedia.org/wiki/Red%E2%80%93black_tree
光有文字表述肯定是不夠的,需要用圖形來展示紅黑樹,結(jié)合小字注釋看起來更明白。
旋轉(zhuǎn)是紅黑樹的一個重要特征,只用這樣一幅圖就輕描淡寫的把這個問題演的明明白白。?
算法導論給出的是偽碼,我不覺得有什么不好,任何一門編程語言都可以轉(zhuǎn)換為對應的代碼,而且他的偽碼也不是單純的代碼是給出了足夠明確的說明。
再來看看關于B樹這一章,作者先講明B樹是為磁盤或其他輔助存儲設備設計的平衡搜索樹,B樹類似紅黑樹,但是又不同。
作者隨后講述了為什么針對磁盤設計的數(shù)據(jù)結(jié)構(gòu)不同于內(nèi)存,感興趣可以看看原書。
相信大家基本看懂了,當然這里并不是原書,只是用來比較算法書的優(yōu)劣,學習還是需要自己去看原書的。
?
2.《算法(第4版)》
作者:Robert Sedgewick / Kevin Wayne
因為這本書流傳甚廣,所以本文對于這本書花了很多筆墨,也為了快速讓讀者先睹為快,直接看我的總結(jié)。
總結(jié):如果你想學習算法理論,這不是一本好書,如果你只是要代碼庫,可以直接從教參網(wǎng)站下載,但是不能直接用,會依賴私有庫,需要自己改。?選擇此書需要慎重,建議一定要看完本文對此書的分析,你就知道適合不適合你。
這本書作者是奇威克 (Robert Sedgewick) 和韋恩 (Kevin Wayne),其中Robert Sedgewick是斯坦福大學博士,導師為Donald E. Knuth。Donald E. Knuth是圖靈機獲得者,他有傳世著作《計算機程序設計藝術》。Donald E. Knuth的學生很多,導師是導師,學生是學生,我覺得因為導師著名,學生就著名不成立。
這本書之前是分為兩本出版分別是《算法:C語言實現(xiàn)(第1-4部分)基礎知識、數(shù)據(jù)結(jié)構(gòu)、排序及搜索》和《算法:C語言實現(xiàn)(第5部分)圖算法》,在那個版本里作者就Robert Sedgewick一個人。那一版是C語言的,對于學C/C++的可以看看。新版第4版是java語言的,估計作者是為了迎合市場。
先看全書內(nèi)容,基本的數(shù)據(jù)結(jié)構(gòu)都包含了,但是內(nèi)容是明顯比《算法導論》單薄許多,如果不說這本書在豆瓣9.4分,亞馬遜上幾乎是和《算法導論》并列的書你很難想象這本書是怎么出名的。
全書600多頁基本是停留在數(shù)據(jù)結(jié)構(gòu),圖,最短路徑講到了。高級一點的內(nèi)容對于算法分析和設計,NP問題,動態(tài)規(guī)劃等沒有涉及,所以這本書在內(nèi)容上的廣度和深度上是不夠的。但是如果那些不是你需要研究的,那部分缺失的內(nèi)容自然就不重要了。
我們直接看紅黑樹這一節(jié),說實話關于紅黑樹的定義莫名其妙,紅鏈接和黑鏈接,你看得懂么?為什么就不能12345列出來。
感覺作者的表述非常的繞。紅黑樹右邊的這幅圖對于一個從沒看過紅黑樹的人絕對是一臉的懵!這本書最大的問題就是比較啰嗦。
對比《算法導論》紅黑節(jié)點是不能一目了然的,而作者給出的變通辦法是用彩頁,其實是完全沒必要的。?
?
再看看代碼實現(xiàn),不是偽碼,是Java的,不過代碼不夠清晰簡潔,最主要的是從作者提供的網(wǎng)站下載的代碼不能直接用,要改。
作者提供了一個在線教參網(wǎng)站和github提供了代碼庫,書中提及的算法大都有源碼實現(xiàn),對于只需要源碼的人可以直接下載,網(wǎng)站上還有些精簡版資源。
https://algs4.cs.princeton.edu/
Robert Sedgewick和Kevin Wayne的教科書?Algorithms,4th Edition調(diào)查了當今使用的最重要的算法和數(shù)據(jù)結(jié)構(gòu)。?我們通過檢查其對科學,工程和行業(yè)應用的影響來激勵我們解決的每個算法。該教科書分為六章:
- 第1章:基礎知識?介紹了比較算法和進行預測的科學和工程基礎。它還包括我們的編程模型。
- 第2章:排序?考慮了幾種經(jīng)典排序算法,包括插入排序,合并排序和快速排序。它還具有優(yōu)先級隊列的二進制堆實現(xiàn)。
- 第3章:搜索?描述了幾種經(jīng)典的符號表實現(xiàn),包括二叉搜索樹,紅黑樹和哈希表。
- 第4章:圖形?調(diào)查最重要的圖形處理問題,包括深度優(yōu)先搜索,廣度優(yōu)先搜索,最小生成樹和最短路徑。
- 第5章:字符串?研究字符串處理的專用算法,包括基數(shù)排序,子字符串搜索,嘗試,正則表達式和數(shù)據(jù)壓縮。
- 第6章:上下文?強調(diào)了與系統(tǒng)編程,科學計算,商業(yè)應用,運籌學和難以處理的聯(lián)系。
- Java代碼。本教科書中的算法和客戶端[?algs4?·?github?]。
?https://algs4.cs.princeton.edu/code/
https://github.com/kevin-wayne/algs4
此公共存儲庫?包含Robert Sedgewick和Kevin Wayne?在教科書Algorithms,4th Edition中的算法和客戶端?的Java?源代碼。這是官方版本 - 作者積極維護和更新。這些計劃是在包中組織的。如果只需要類文件(而不是源代碼),則可以使用?algs4.jar。?edu.princeton.cs.algs4
這里把一些常用算法列舉出來。
| 2 | 排序 | |
|---|---|---|
| 2.1 | Insertion.java | 插入排序 |
| - | InsertionX.java | 插入排序(優(yōu)化) |
| - | BinaryInsertion.java | 二進制插入排序 |
| 2.2 | Selection.java | 選擇排序 |
| 2.3 | Shell.java | 希爾排序 |
| 2.4 | Merge.java | 自上而下的合并 |
| - | MergeBU.java | 自下而上的合并 |
| - | MergeX.java | 優(yōu)化的合并 |
| - | Inversions.java | 反轉(zhuǎn)次數(shù) |
| 2.5 | Quick.java | 快速排序 |
| - | Quick3way.java | 快速排序,具有3向分區(qū) |
| - | QuickX.java | 優(yōu)化的雙向快速排序 |
| - | QuickBentleyMcIlroy.java | 優(yōu)化的3向快速排序 |
| - | TopM.java | 優(yōu)先隊列客戶端 |
| 2.6 | MaxPQ.java | 最大堆優(yōu)先級隊列 |
| - | MinPQ.java | 最小堆優(yōu)先級隊列 |
| - | IndexMinPQ.java | index min heap優(yōu)先級隊列 |
| - | IndexMaxPQ.java | index最大堆優(yōu)先級隊列 |
| - | Multiway.java | 多路合并 |
| 2.7 | Heap.java | 堆排序 |
| 3 | 搜索 | |
| - | FrequencyCounter.java | 頻率計數(shù)器 |
| 3.1 | SequentialSearchST.java | 順序搜索 |
| 3.2 | BinarySearchST.java | 二分搜索 |
| 3.3 | BST.java | 二叉搜索樹 |
| 3.4 | RedBlackBST.java | 紅黑樹 |
| 3.5 | SeparateChainingHashST.java | 單獨的鏈接哈希表 |
| 3.6 | LinearProbingHashST.java | 線性探測哈希表 |
| - | ST.java | 有序符號表 |
| - | SET.java | 有序集 |
| - | DeDup.java | 刪除重復項 |
| - | WhiteFilter.java | 白名單過濾器 |
| - | BlackFilter.java | 黑名單過濾器 |
| - | LookupCSV.java | 字典查找 |
| - | LookupIndex.java | 指數(shù)和倒排指數(shù) |
| - | FileIndex.java | 文件索引 |
| - | SparseVector.java | 稀疏的矢量 |
| 4 | 圖 | |
| - | Graph.java | 無向圖 |
| - | GraphGenerator.java | 生成隨機圖 |
| - | DepthFirstSearch.java | 深度優(yōu)先搜索圖表 |
| - | NonrecursiveDFS.java | 圖中的DFS(非遞歸) |
| 4.1 | DepthFirstPaths.java | 圖中的路徑(DFS) |
| 4.2 | BreadthFirstPaths.java | 圖中的路徑(BFS) |
| 4.3 | CC.java | 連接的圖形組件 |
| - | Bipartite.java | 二分或奇數(shù)周期(DFS) |
| - | BipartiteX.java | 二分或奇數(shù)周期(BFS) |
| - | Cycle.java | 在圖表中循環(huán) |
| - | EulerianCycle.java | 歐拉循環(huán)圖 |
| - | EulerianPath.java | 在圖中的歐拉路徑 |
| - | SymbolGraph.java | 符號圖 |
| - | DegreesOfSeparation.java | 分離度 |
| - | Digraph.java | 有向圖 |
| - | DigraphGenerator.java | 生成隨機有向圖 |
| 4.4 | DirectedDFS.java | 深度優(yōu)先搜索有向圖 |
| - | NonrecursiveDirectedDFS.java | 有向圖中的DFS(非遞歸) |
| - | DepthFirstDirectedPaths.java | 有向圖中的路徑(DFS) |
| - | BreadthFirstDirectedPaths.java | 有向圖中的路徑(BFS) |
| - | DirectedCycle.java | 在有向圖中循環(huán) |
| - | DirectedCycleX.java | 在有向圖中循環(huán)(非遞歸) |
| - | DirectedEulerianCycle.java | 歐拉循環(huán)在有向圖 |
| - | DirectedEulerianPath.java | 在有向圖的歐拉路徑 |
| - | DepthFirstOrder.java | 有向圖中的深度優(yōu)先順序 |
| 4.5 | Topological.java | DAG中的拓撲順序 |
| - | TopologicalX.java | 拓撲順序(非遞歸) |
| - | TransitiveClosure.java | 傳遞閉包 |
| - | SymbolDigraph.java | 符號有向圖 |
| 4.6 | KosarajuSharirSCC.java | 強大的組成部分(Kosaraju-Sharir) |
| - | TarjanSCC.java | 強大的組件(Tarjan) |
| - | GabowSCC.java | 強大的組成部分(Gabow) |
| - | EdgeWeightedGraph.java | 邊加權(quán)圖 |
| - | Edge.java | 加權(quán)邊緣 |
| - | LazyPrimMST.java | MST(懶惰的Prim) |
| 4.7 | PrimMST.java | MST(Prim) |
| 4.8 | KruskalMST.java | MST(Kruskal) |
| - | BoruvkaMST.java | MST(Boruvka) |
| - | EdgeWeightedDigraph.java | 邊加權(quán)有向圖 |
| - | DirectedEdge.java | 加權(quán),有向邊 |
| 4.9 | DijkstraSP.java | 最短的路徑(Dijkstra) |
| - | DijkstraUndirectedSP.java | 無向的最短路徑(Dijkstra) |
| - | DijkstraAllPairsSP.java | 全對最短路徑 |
| 4.10 | AcyclicSP.java | DAG中的最短路徑 |
| - | AcyclicLP.java | DAG中最長的路徑 |
| - | CPM.java | 關鍵路徑法 |
| 4.11 | BellmanFordSP.java | 最短的路徑(貝爾曼 - 福特) |
| - | EdgeWeightedDirectedCycle.java | 在邊加權(quán)有向圖中循環(huán) |
| - | Arbitrage.java | 套利檢測 |
| - | FloydWarshall.java | 全對最短路徑(密集) |
| - | AdjMatrixEdgeWeightedDigraph.java | 邊加權(quán)圖(密集) |
?以紅黑樹為例,下載的代碼不能直接運行,需要集成作者的私有庫標準庫!
使用標準庫。
文件stdlib.jar將所有標準庫捆綁到一個文件中。有許多方法可以訪問這些庫:
https://introcs.cs.princeton.edu/java/stdlib/
?以作者寫的紅黑樹為例不能直接運行,需要做一些改進,剝離私有庫才可以用。
https://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html
?
3.《算法設計指南 第二版》
作者:Steven Skiena
這本書由清華大學在2017年出版了,按說到今天也有2年左右時間,不過評語在豆瓣和亞馬遜是天壤之別。
很多中國讀者估計不知道還有這么一本算法好書,這書影響不大是有些客觀原因。?
1.本科教學版,直接看上圖,估計看到這幾個字很多人就不想買了,這讓我們想起了大學時代很多本科教學版,對于很多研究生來說估計看到這幾個字直接拒絕的,但是平心而論,本書的水平非常高,肯定是超越本科水平。
2.孤軍奮戰(zhàn),還是看上圖,現(xiàn)在計算機書基本是機械工業(yè)出版社經(jīng)典教材黑皮書,人民郵電的動物書,電子工業(yè)的那種綠皮書,,清華大學也有一套黑皮書。這四大出版社涵蓋了絕大多數(shù)計算機經(jīng)典書籍,也有好書不是上述封面包裝系列,不過一般讀者看到這三大出版社都會認可的。而本書就是不在清華黑皮書系列里,導致在書架和網(wǎng)站位置不突出,就無人關注。
3.內(nèi)容不全,目前這本只是第1卷,沒有出后續(xù)版本,內(nèi)容肯定是不全的。
4.多余的譯者注,有人說譯者喜歡加一點譯者注,我覺得這不是什么大問題,你不看就是。
這本書的總結(jié)是:書是好書,就是因為種種原因?qū)е鲁霈F(xiàn)今天這樣的結(jié)局,只能說可惜。這本書你可以作為其他書的補充,也可以做比較好的入門書。
這本書的內(nèi)容就300多頁,紅黑樹AVL樹都沒有深入講解,只講了基本的數(shù)據(jù)結(jié)構(gòu)。
對于算法復雜度有些模糊可以看看第二章,作者吧這個單獨一章可以看出作者的用心。
數(shù)據(jù)結(jié)構(gòu)和查找排序這塊都講的非常少,但是不代表簡單。?
看到動態(tài)規(guī)劃,NP問題是否有點意外。?
翻譯也是很精彩的,下面截取一些精彩片段,其實全書精彩片段幾乎遍地都是。
作者關于算法的定義:何謂算法?算法是完成某項特定任務的具體步驟,算法更是藏于程序背后的思想。
一個算法要想讓人關注,它一定要能解決一個有著清楚而且準確敘述的一般性問題。?
?作者把數(shù)據(jù)結(jié)構(gòu)分為緊接和鏈接型是非常簡潔的。
可以說讀起來是非常上口,作者總是妙筆生花,很精彩的一本書,你要是喜歡可以看看,不過看完估計你還是意猶未盡。?
?
4.《數(shù)據(jù)結(jié)構(gòu)與算法分析》
作者:Mark Allen Weiss
這本書的分析太長了,先總結(jié):本書內(nèi)容深度不像算法導論等算法分析的書那些深,廣度上也不遜于算法導論,書的厚度是算法導論的一半不到一點。內(nèi)容非常精煉,沒有廢話。本書有源碼可以直接運行,而且還分了多語言。
看到此圖你是否有點震驚!作者居然用C/C++/Java三種語言同時寫一本書,而且還是分別成冊。
《數(shù)據(jù)結(jié)構(gòu)與算法分析——C語言描述(原書第2版)》機械工業(yè)出版社 馮舜璽譯,英文版是1997年,中文是2003年;
《數(shù)據(jù)結(jié)構(gòu)與算法分析——C語言描述(原書第2版)典藏版》 機械工業(yè)出版社 馮舜璽譯,典藏版其實還是老版,中文是2019年。
《數(shù)據(jù)結(jié)構(gòu)與算法分析C++描述(第三版)》人民郵電出版社,這個版本是另一撥人翻譯的,這個版本已經(jīng)賣不到了。
《數(shù)據(jù)結(jié)構(gòu)與算法分析C++描述(第四版)》電子工業(yè)出版社,又由C語言版的馮舜璽譯,英文版是2014年,中文是2016年;
《數(shù)據(jù)結(jié)構(gòu)與算法分析:java語言描述(原書第3版)》機械工業(yè)出版社 馮舜璽譯,英文版是2012年,中文是2016年;
作者不同語言的書差別不大,沒必要都看,只是代碼不同,根據(jù)自己需要的編程語言選擇合適的版本即可。
需要說的是Mark Allen Weiss的書評價還是非常高的,原書曾被評為20世紀頂尖的30部計算機著作之一,作者Mark Allen Weiss在數(shù)據(jù)結(jié)構(gòu)和算法分析方面卓有建樹,他的數(shù)據(jù)結(jié)構(gòu)和算法分析的著作尤其暢銷,并受到廣泛好評。已被世界500余所大學用作教材。在書中,作者更加精煉并強化了他對算法和數(shù)據(jù)結(jié)構(gòu)方面創(chuàng)新的處理方法。著重闡述了抽象數(shù)據(jù)類型的概念,并對算法的效率、性能和運行時間進行了分析。
?
這本書既然是分編程語言可見不同語言自然是有側(cè)重點。
以C++版為例先講C++類和指針模板和STL中的vector和list。
以java版為例,java的數(shù)據(jù)結(jié)構(gòu)基礎知識泛型,抽象數(shù)據(jù)類型,表ADT,Java CollectionsAPI中的 Collections接口,Iterator接口,List接口,ArrayList類。
核心數(shù)據(jù)結(jié)構(gòu)樹 分為二叉樹及其實現(xiàn),AVL樹,伸展樹,B樹;散列是單獨一章,可見作者對其重要性的側(cè)重,這一章講了分離鏈接法,線性探測法,再散列,完美散列,布谷鳥散列,跳房子散列。
紅黑樹是放在第12章的,不要錯過。
看看作者對紅黑樹是怎么講的
經(jīng)典就是經(jīng)典,這里也是很清晰的1234,紅黑樹的高度最多是2log(N+1),對紅黑樹的最壞情形下花費O(logN)時間,作者一針見血的點出紅黑樹和AVL樹相比。紅黑樹的配圖也是很清楚沒有繞來繞去。作者經(jīng)驗是非常豐富,用詞準確不說廢話。
紅黑樹的插入作者先說了自底向上的插入,分兩種情形單旋轉(zhuǎn)和雙旋轉(zhuǎn),圖形也很簡潔。
作者給出了這本書的源碼不管是C/C++/Java,不過僅限于教師可以在網(wǎng)站下載,機械工業(yè)出版社網(wǎng)站是有的,如果不是教師想得到可以利用百度谷歌等搜素引擎搜素,也可以找到的。為了方便大家本人已經(jīng)上傳了:
https://download.csdn.net/download/21aspnet/11157988
書中的源碼選取了核心部分類的初始化構(gòu)造函數(shù)里定義紅黑樹的節(jié)點:
如果你想要完整的紅黑樹代碼可以自己網(wǎng)絡尋找,為了方便讀者這里貼出作者寫的紅黑樹源碼RedBlackTree.class
package com.algs.www;// RedBlackTree class
//
// CONSTRUCTION: with no parameters
//
// ******************PUBLIC OPERATIONS*********************
// void insert( x ) --> Insert x
// void remove( x ) --> Remove x (unimplemented)
// boolean contains( x ) --> Return true if x is found
// Comparable findMin( ) --> Return smallest item
// Comparable findMax( ) --> Return largest item
// boolean isEmpty( ) --> Return true if empty; else false
// void makeEmpty( ) --> Remove all items
// void printTree( ) --> Print all items
// ******************ERRORS********************************
// Throws UnderflowException as appropriate/*** Implements a red-black tree.* Note that all "matching" is based on the compareTo method.* @author Mark Allen Weiss*/
public class RedBlackTree<AnyType extends Comparable<? super AnyType>>
{/*** Construct the tree.*/public RedBlackTree( ){nullNode = new RedBlackNode<>( null );nullNode.left = nullNode.right = nullNode;header = new RedBlackNode<>( null );header.left = header.right = nullNode;}/*** Compare item and t.element, using compareTo, with* caveat that if t is header, then item is always larger.* This routine is called if is possible that t is header.* If it is not possible for t to be header, use compareTo directly.*/private int compare( AnyType item, RedBlackNode<AnyType> t ){if( t == header )return 1;elsereturn item.compareTo( t.element ); }/*** Insert into the tree.* @param item the item to insert.*/public void insert( AnyType item ){current = parent = grand = header;nullNode.element = item;while( compare( item, current ) != 0 ){great = grand; grand = parent; parent = current;current = compare( item, current ) < 0 ?current.left : current.right;// Check if two red children; fix if soif( current.left.color == RED && current.right.color == RED )handleReorient( item );}// Insertion fails if already presentif( current != nullNode )return;current = new RedBlackNode<>( item, nullNode, nullNode );// Attach to parentif( compare( item, parent ) < 0 )parent.left = current;elseparent.right = current;handleReorient( item );}/*** Remove from the tree.* @param x the item to remove.* @throws UnsupportedOperationException if called.*/public void remove( AnyType x ){throw new UnsupportedOperationException( );}/*** Find the smallest item the tree.* @return the smallest item or throw UnderflowExcepton if empty.*/public AnyType findMin( ){if( isEmpty( ) )throw new UnderflowException( );RedBlackNode<AnyType> itr = header.right;while( itr.left != nullNode )itr = itr.left;return itr.element;}/*** Find the largest item in the tree.* @return the largest item or throw UnderflowExcepton if empty.*/public AnyType findMax( ){if( isEmpty( ) )throw new UnderflowException( );RedBlackNode<AnyType> itr = header.right;while( itr.right != nullNode )itr = itr.right;return itr.element;}/*** Find an item in the tree.* @param x the item to search for.* @return true if x is found; otherwise false.*/public boolean contains( AnyType x ){nullNode.element = x;current = header.right;for( ; ; ){if( x.compareTo( current.element ) < 0 )current = current.left;else if( x.compareTo( current.element ) > 0 ) current = current.right;else if( current != nullNode )return true;elsereturn false;}}/*** Make the tree logically empty.*/public void makeEmpty( ){header.right = nullNode;}/*** Print the tree contents in sorted order.*/public void printTree( ){if( isEmpty( ) )System.out.println( "Empty tree" );elseprintTree( header.right );}/*** Internal method to print a subtree in sorted order.* @param t the node that roots the subtree.*/private void printTree( RedBlackNode<AnyType> t ){if( t != nullNode ){printTree( t.left );System.out.println( t.element );printTree( t.right );}}/*** Test if the tree is logically empty.* @return true if empty, false otherwise.*/public boolean isEmpty( ){return header.right == nullNode;}/*** Internal routine that is called during an insertion* if a node has two red children. Performs flip and rotations.* @param item the item being inserted.*/private void handleReorient( AnyType item ){// Do the color flipcurrent.color = RED;current.left.color = BLACK;current.right.color = BLACK;if( parent.color == RED ) // Have to rotate{grand.color = RED;if( ( compare( item, grand ) < 0 ) !=( compare( item, parent ) < 0 ) )parent = rotate( item, grand ); // Start dbl rotatecurrent = rotate( item, great );current.color = BLACK;}header.right.color = BLACK; // Make root black}/*** Internal routine that performs a single or double rotation.* Because the result is attached to the parent, there are four cases.* Called by handleReorient.* @param item the item in handleReorient.* @param parent the parent of the root of the rotated subtree.* @return the root of the rotated subtree.*/private RedBlackNode<AnyType> rotate( AnyType item, RedBlackNode<AnyType> parent ){if( compare( item, parent ) < 0 )return parent.left = compare( item, parent.left ) < 0 ?rotateWithLeftChild( parent.left ) : // LLrotateWithRightChild( parent.left ) ; // LRelsereturn parent.right = compare( item, parent.right ) < 0 ?rotateWithLeftChild( parent.right ) : // RLrotateWithRightChild( parent.right ); // RR}/*** Rotate binary tree node with left child.*/private RedBlackNode<AnyType> rotateWithLeftChild( RedBlackNode<AnyType> k2 ){RedBlackNode<AnyType> k1 = k2.left;k2.left = k1.right;k1.right = k2;return k1;}/*** Rotate binary tree node with right child.*/private RedBlackNode<AnyType> rotateWithRightChild( RedBlackNode<AnyType> k1 ){RedBlackNode<AnyType> k2 = k1.right;k1.right = k2.left;k2.left = k1;return k2;}private static class RedBlackNode<AnyType>{// ConstructorsRedBlackNode( AnyType theElement ){this( theElement, null, null );}RedBlackNode( AnyType theElement, RedBlackNode<AnyType> lt, RedBlackNode<AnyType> rt ){element = theElement;left = lt;right = rt;color = RedBlackTree.BLACK;}AnyType element; // The data in the nodeRedBlackNode<AnyType> left; // Left childRedBlackNode<AnyType> right; // Right childint color; // Color}private RedBlackNode<AnyType> header;private RedBlackNode<AnyType> nullNode;private static final int BLACK = 1; // BLACK must be 1private static final int RED = 0;// Used in insert routine and its helpersprivate RedBlackNode<AnyType> current;private RedBlackNode<AnyType> parent;private RedBlackNode<AnyType> grand;private RedBlackNode<AnyType> great;// Test programpublic static void main( String [ ] args ){RedBlackTree<Integer> t = new RedBlackTree<>( );final int NUMS = 400000;final int GAP = 35461;System.out.println( "Checking... (no more output means success)" );for( int i = GAP; i != 0; i = ( i + GAP ) % NUMS )t.insert( i );if( t.findMin( ) != 1 || t.findMax( ) != NUMS - 1 )System.out.println( "FindMin or FindMax error!" );for( int i = 1; i < NUMS; i++ )if( !t.contains( i ) )System.out.println( "Find error1!" );}
}
這個代碼相比《算法4》比較好,沒有依賴私有庫,只依賴了一個UnderflowException:
/*** Exception class for access in empty containers* such as stacks, queues, and priority queues.* @author Mark Allen Weiss*/
public class UnderflowException extends RuntimeException
{
}
這個代碼可以運行的:
?
?5.《算法圖解 ?像小說一樣有趣的算法入門書》
作者:Aditya Bhargava
這本書不想前面所列的幾本書比較老,這本書在最近紀年才出現(xiàn)的,出現(xiàn)后評價非常高,可見此書似乎小視。
按照內(nèi)容提要本書示例豐富,圖文并茂,以簡明易懂的方式闡釋了算法,旨在幫助程序員在日常項目中更好地利用
算法為軟件開發(fā)助力。前三章介紹算法基礎,包括二分查找、大O 表示法、兩種基本的數(shù)據(jù)結(jié)構(gòu)以及遞歸等。余下的篇幅將主要介紹應用廣泛的算法,具體內(nèi)容包括:面對具體問題時的解決技巧,比如何時采用貪婪算法或動態(tài)規(guī)劃;散列表的應用;圖算法;K 最近鄰算法。本書適合所有程序員、計算機專業(yè)相關師生以及對算法感興趣的讀者。
再看看作者說他為什么寫此書,原因就是因為愛好而踏入了編程殿堂。隨著學到的知識也越來越多,但對算法卻始終沒搞明白。作者買了一本算法書,但那本書深奧難懂,看了幾周后就放棄了。直到遇到一位優(yōu)秀的算法教授后,才認識到這些概念是多么地簡單而優(yōu)雅。
另一點是幾年前,撰寫了第一篇圖解式博文,對圖解式寫作風格鐘愛有加。
所以從以上可以看出作者寫書的目的是因為其他算法書難懂,于是作者就以圖解的方式寫了這樣一本新書。
先看目錄吧,很難想象一本200頁的書作者居然涵蓋了這么多內(nèi)容,連NP問題,動態(tài)規(guī)劃,K臨近算法都有。
?
不過由于全書只有200頁,內(nèi)容深度肯定不會太多。紅黑樹AVL樹都沒有。
不過作者對于其他書沒有的內(nèi)容,比如機器學習OCR,推薦系統(tǒng),對于大數(shù)據(jù)相關的mapreduce相關的分布式算法,映射函數(shù),歸并函數(shù)也有涉及。
找不到紅黑樹只能看到第11章的樹。
?
看到這里你是不是很失望,對于作者所謂的圖解其實也不是很高端,我開始以為的圖解是畫出非常復雜又好理解的圖,而作者這種圖解其實也只是在其他算法書基礎上使用了簡潔的手繪風格而已,本身沒有新的創(chuàng)造。
再看一個推薦算法的特征抽取
至此讀者應該大致明白了,這本書連入門都算不上,只能算科普。
所以本書的定位完全就是休閑消遣,實用性不大,估計很多人是被本書書名吸引來的。?
?
6.《算法概論》
作者: Sanjoy Dasgupta / Christos Papadimitriou / Umesh Vazirani
?本書涵蓋了絕大多數(shù)算法設計中的常用技術。在表達每一種技術時,闡述它的應用背景,強調(diào)每個算法運轉(zhuǎn)背后的簡潔數(shù)學思想,注意運用與其他技術類比的方法來說明它的特征,并提供了大量相應實際問題的例子。同時也注重了對每一種算法的復雜性分析。全書共10章,從基本的數(shù)字算法人手,先后介紹了分治、圖的遍歷、貪心算法、動態(tài)規(guī)劃、線性規(guī)劃等技術,對NP完全問題進行廠基本而清晰的闡述,對隨機算法、近似算法和量子算法也花費了一定的筆墨。
作者簡介:Sanjoy Dasgupta于2002年在加州大學伯克利分校獲得計算機科學專業(yè)的博士學位。他是AT&T實驗室的高級技術人員。他的工作重點是研究數(shù)據(jù)挖掘的算法,對業(yè)務數(shù)據(jù)的語音識別和分析的應用。他在多維數(shù)據(jù)的統(tǒng)計分析的開發(fā)算法領域獲得很重要的研究成果。
看目錄,本書和前面幾本書相比沒有基礎數(shù)據(jù)結(jié)構(gòu)的介紹,直接講算法思想,分治算法,貪心算法,動態(tài)規(guī)劃,線性規(guī)劃再到NP問題都是算法設計的領域。
?從目錄看出來這本不是一本基礎的算法書,屬于算法設計類的書,內(nèi)容是又一定的深度的。
第4章 圖中的距離,首先講深度優(yōu)先搜索DFS可以明確給出從起始點到所有目標頂點的路徑,然而這些路徑并不是最經(jīng)濟的,所有引出本章要討論的尋找圖中最短路徑的算法。兩點之間的距離是兩者之間最短路徑的長度,然后作者給出一個繩子和球的模型來測量這個問題。
從上面的截圖看出作者給出的非常的圖示清晰易懂,也不復雜。這本書非常厚,圖多是一個原因。
優(yōu)先隊列的實現(xiàn),有幾種方式數(shù)組,二分堆,D堆,Fibonacci堆。
Dijkstra算法算法的運行時間是嚴重依賴于優(yōu)先隊列的所用的實現(xiàn)方法,作者給出了一張表做對比。
再看看關于動態(tài)規(guī)劃這一章作者關于旅行商問題的講解,旅行商問題也就是TSP問題。
旅行商問題不明白可以可以參考:https://zh.wikipedia.org/wiki/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98
旅行商問題(最短路徑問題)(英語:travelling salesman problem,?TSP)是這樣一個問題:給定一系列城市和每對城市之間的距離,求解訪問每一座城市一次并回到起始城市的最短回路。它是組合優(yōu)化中的一個NP困難問題,在運籌學和理論計算機科學中非常重要。
是不是和前面的求最短路徑是否很相似,都是畫出一幅精煉的圖示。
動態(tài)規(guī)劃給出了一個相對而言快得多的解答,雖然它不是多項式時間的。
對于TSP子問題意味著部分解,而最顯而易見的部分解是旅行路線最初的部分,后面作者給出了子問題的求解。
上圖是代碼的偽碼算法以及總的運行時間。
最后在書的附錄里作者給出了各章的歷史背景和深入學習的資料,例如對于NP問題,NP完全性的概念最初見于Steve Cook的論文中,Dick Karp列出了23個NP問題以及本書第8章所有NP完全性已經(jīng)得到證明的問題。
總結(jié):這是一本有深度有厚度的算法分析書,如果你只想知道快速排序,紅黑樹之類的是什么這本書不適合你。?如果你想要直接可以運行的代碼這本書更不適合你。
?
7.《計算機程序設計藝術》
作者:Donald E.Knuath(高徳納)
這套書一共出了4卷,前三卷是國防工業(yè)出版社出版,第4卷是機械工業(yè)出版社出版,第4卷又分為01234一共五本書,譯者都是蘇運霖老師。
《計算機程序設計藝術(第1卷)基本算法》國防工業(yè)出版社.英文1997年,2002年出版
《計算機程序設計藝術(第2卷)半數(shù)值算法》國防工業(yè)出版社.英文1998年,中文2002年出版
《計算機程序設計藝術(第3卷)排序與查找》國防工業(yè)出版社.英文1998年,2002年出版
《計算機程序設計藝術:第4卷 第4冊(雙語版)生成所有樹組合生成的歷史》機械工業(yè)出版社.2007年出版
作者簡介
Donald.E.Knuth(中文名高德納)是算法和程序設計技術的先驅(qū)者,他當前正全神貫注于完成其關于計算機科學的史詩性的七卷集。這一偉大工程在1962年他還是加利福尼亞理工學院的研究生時就開始了。Knuth教授獲得了許多獎項和榮譽,包括圖靈獎(ACM Turing Award),注意人家1974年就獲得了圖靈獎。
訪問Knuth教授的個人主頁:https://www-cs-faculty.stanford.edu/~knuth/
談到算法書是無論如何也不能回避這本書,《計算機程序設計的藝術》被《美國科學家》雜志列為20世紀最重要的12本物理科學類專著之一,與愛因斯坦《相對論》、狄拉克《量子力學》、理查·費曼《量子電動力學》等經(jīng)典比肩而立。
不過但是又很少有人看,原因是成書時間太久,數(shù)學公式論證很多,不夠"實用"。
以第3卷為例,從目錄來看屬于現(xiàn)在看起來比較基本的數(shù)據(jù)結(jié)構(gòu),紅黑樹肯定不會有。
第6章查找講了二叉平衡樹,作者先說俄國數(shù)學家對維持一棵好查找樹的問題。?
?后面基本是求證和各種公式推導,定理證明。
一棵平衡樹的查找路徑長度絕不會比最優(yōu)樹長45%以上,然后給出定理,具有內(nèi)節(jié)點的一棵平衡樹的高度區(qū)間
總結(jié):這本書肯定是一本好書但是不適合絕大多數(shù)人,如果你想了解算法的歷史和一些數(shù)據(jù)結(jié)構(gòu)算法的推導過程可以看看。
對于本科學生和工作年限不長的工作人員這本書是不適合的,一般用不上,本書分成很多分卷也不便于閱讀特別是第4卷基本是作者想到什么寫什么然后馬上出版一本小冊子。
?
8.《數(shù)據(jù)結(jié)構(gòu)基礎》《計算機算法》《數(shù)據(jù)結(jié)構(gòu)、算法與應用》
作者:霍羅維茲 (Ellis Horowitz) / 薩尼 (Sartaj Sahni) / 拉賈瑟·克雷恩 (Sanguthevar Rajasekeran)
這套書版本比較復雜,數(shù)據(jù)結(jié)構(gòu)C語言版的作者一共三個人,數(shù)據(jù)結(jié)構(gòu)C++版的第三個作者不一樣,這個版本差異不太大就是編程語言不同。
Sartaj Sahni又自己單獨寫了本C++的,結(jié)構(gòu)版本差異完全是另一本書。
然后C語言的2個人新加一個人又出了一本叫計算機算法的的,結(jié)構(gòu)版本和C語言的也差距很大。
《數(shù)據(jù)結(jié)構(gòu)(C語言版)》原書名:?Fundamentals of Data Structures in C,作者:Ellis Horowitz,Sartaj Sahni,Susan Anderson-Freed?譯者: 李建中 張巖 李治軍? 出版社:機械工業(yè)出版社.2006年
《數(shù)據(jù)結(jié)構(gòu)(C語言版)(第2版)》原書名:?Fundamentals of Data Structures in C,作者:Ellis Horowitz,Sartaj Sahni,Susan Anderson-Freed??譯者:朱仲濤? ? ?出版社:清華大學出版社.2009年
說明:第二版和第一版差別不大,不過出版社和翻譯的都換了。
《數(shù)據(jù)結(jié)構(gòu)基礎(C語言版)(第2版)》是最經(jīng)典數(shù)據(jù)結(jié)構(gòu)教材的最新版本,國內(nèi)外大多數(shù)的同類教材都是以《數(shù)據(jù)結(jié)構(gòu)基礎(C語言版)(第2版)》為藍本編寫而來的。《數(shù)據(jù)結(jié)構(gòu)基礎(C語言版)(第2版)》用C作為描述語言,書中詳細討論了棧、隊列、鏈表以及查找結(jié)構(gòu)、高級樹結(jié)構(gòu)等功能,對裴波那契堆、伸展樹、紅黑樹、2-3樹、2-3-4樹、二項堆、最小-最大堆、雙端堆等新的數(shù)據(jù)結(jié)構(gòu)進行了有效分析,以及構(gòu)成所有軟件基礎的排序散列技術。此外,《數(shù)據(jù)結(jié)構(gòu)基礎(C語言版)(第2版)》還介紹了各種高級或特殊數(shù)據(jù)結(jié)構(gòu),如優(yōu)先級隊列、高效二叉查找樹、多路查找樹等。《數(shù)據(jù)結(jié)構(gòu)基礎(C語言版)(第2版)》對大多數(shù)算法都給出了計算時間在最優(yōu)、最差情形下的復雜度分析。
教材網(wǎng)站:https://www.cise.ufl.edu/~sahni/fdsc2ed/
《數(shù)據(jù)結(jié)構(gòu)基礎(C++語言版)(第2版)》原書名:?Fundamentals of Data Structures in C++ 2nd Edition 作者:Ellis Horowitz,Sartaj Sahni,Dinesh Mehta??譯者:張力? ? ?出版社:清華大學出版社.2009年
《數(shù)據(jù)結(jié)構(gòu)、算法與應用(C++語言描述)(原書第2版)》原書名:?Data Structures, Algorithms, And Applications In C++ 2nd Edition
這本書是Sartaj Sahni一個人寫的,風格和數(shù)據(jù)結(jié)構(gòu)基礎(C++語言版)差不多,多了一些算法分析的內(nèi)容。
《計算機算法(C++語言描述)(第2版)》原書名:?Computer Algorithms?2nd Edition??Computer Algorithms 2nd Edition 作者:Ellis Horowitz,Sartaj Sahni,Sanguthevar Rajasekaran? ? ?出版社:清華大學出版社.2015年
看看數(shù)據(jù)結(jié)構(gòu)的目錄:
??
這本書作者章節(jié)分的很細很實用,以第7章排序為例,講了插入排序,?快速排序,排序最快有多快,歸并排序 ,堆排序 ,多關鍵字排序 ,鏈表排序和索引表排序 ,?內(nèi)部排序,外部排序 。
這本書講的樹是很全面的,第9章優(yōu)先隊列的左傾樹,第10章高效二叉查找樹最優(yōu)二叉查找樹,AVL樹,紅黑樹,Splay樹,第11章多路查找樹,m-路查找樹,B樹,B+樹。第12章 數(shù)字查找結(jié)構(gòu)的數(shù)字查找樹,二路Trie樹,Patricia樹,多路Trie樹,后綴樹。
整體數(shù)據(jù)結(jié)構(gòu)內(nèi)容是很完整的,非常全面,你想看的樹都有。
下面以紅黑樹為例,看看內(nèi)容風格結(jié)構(gòu)。關于紅黑樹作者給出了兩種不同定義的紅黑樹,這個是有別于其他樹的。
一種是每個空指針都用喲個外部節(jié)點替換,第二種是如果為任意節(jié)點指向子節(jié)點的指針上色,有另一種等價定義。
同時作者指出入宮知道指針顏色就可以導出節(jié)點顏色,反之也可以。
關于紅黑樹作者畫出了一棵簡潔的圖,給出引理并給與證明。?
引理 令從根到外部節(jié)點的路徑長度是路徑上指針的數(shù)目,如果P和Q是一棵紅黑樹中從根到外部節(jié)點的兩條路徑,
那么length(P)≤2length(Q)。
本書作者的圖畫的簡潔,這樣的例子比比皆是。
例如B+樹作者畫了一棵三階B+樹,一棵M階B+樹性質(zhì):
所有數(shù)據(jù)節(jié)點在一層,數(shù)據(jù)節(jié)點只包含數(shù)據(jù)元素。
索引節(jié)點構(gòu)成一棵M階B+樹。
關于B+樹的查找提供兩種查找,一種是精確匹配查找,一種是范圍查找。
類似上圖中B+樹查找算法的高層描述這本書的代碼量不多。
這本書的C++版本--《數(shù)據(jù)結(jié)構(gòu)基礎(C++語言版)(第2版)》就不說了,整體差不多。
《數(shù)據(jù)結(jié)構(gòu)、算法與應用(C++語言描述)(原書第2版)》這本書第三部分多了算法設計方法:
貪婪算法?分治,動態(tài)規(guī)劃,回溯法和分支定界解背包問題,旅行商問題,電路板排列。
?
9.《算法設計與分析基礎》?
作者: Anany levitin?
作者基于豐富的教學經(jīng)驗,開發(fā)了一套全新的算法分類方法。該分類法站在通用問題求解策略的高度,對現(xiàn)有大多數(shù)算法準確分類,從而引領讀者沿著一條清晰、一致、連貫的思路來探索算法設計與分析這一迷人領域。?
《算法設計與分析基礎 第2版》作者: Anany levitin.清華大學出版社2007年出版.翻譯: 潘彥。
《算法設計與分析基礎 第3版》作者: Anany levitin.清華大學出版社2015年出版.翻譯: 潘彥。
這本書不是從數(shù)據(jù)結(jié)構(gòu)開始講起,類似算法概論一類書講算法設計思想,與算法導論等書不同。
這本書最大的特色就是作者把各種算法進行了歸類總結(jié)分為
蠻力法:選擇排序,冒泡排序,順序查找,蠻力字符串匹配,最近對和凸包問題,窮舉查找(旅行商問題,背包問題,分配問題),深度優(yōu)先查找和廣度優(yōu)先查找。
分治法:合并排序,快速排序,二叉樹遍歷,大整數(shù)乘法和Strassen矩陣乘法,用分治法解最近對問題和凸包問題
減治法:插入排序,拓撲排序,生成組合對象的算法,減常因子算法(折半查找,假幣問題,俄式乘法,約瑟夫斯問題),減可變規(guī)模算法(計算中值和選擇問題,插值查找,二叉查找樹的查找和插入)
變治法:預排序,高斯消去法,平衡查找樹(AVL樹,2-3樹),堆排序,霍納法則和二進制冪,問題化簡(求最小公倍數(shù),計算圖中的路徑數(shù)量,優(yōu)化問題的化簡,線性規(guī)劃,簡化為圖問題)
時空權(quán)衡:計數(shù)排序,散列法,B樹
動態(tài)規(guī)劃:背包問題和記憶功能,最優(yōu)二叉查找樹,Warshall算法和計算完全最短路徑的Floyd算法
貪婪技術:Prim算法,Kruskal算法,Diikstra算法,哈夫曼樹及編碼
迭代改進:單純形法,最大流量問題。
第5章,分治法,合并排序,作者說合并排序是成功應用分治技術的一個完美例子。
對一個需要排序的數(shù)組合并排序給他一分為二,后面給出了算法使用了遞歸。
然后給出一個合并排序的示意圖。?
作者給出的代碼比較簡潔,圖形也比較簡潔。
總結(jié):整本書并未超越其他算法書的范疇,只是作者用一種比較好的便于理解的方式把現(xiàn)有算法分類,整體講述內(nèi)容并未超越其他書的模式。
?
大總結(jié):相信經(jīng)過對這些書的比較大家已經(jīng)知道那些書是自己喜歡和需要的。算法書很多,好書也不說一個帖子可以展示完的,這一個帖子寫了一個完整五一,還是沒有寫完,暫且先這樣,我也不知道這樣一種表述方式是否會得到大家的喜歡,如果很受歡迎就繼續(xù)寫續(xù)篇,把其他一些有特色的算法書一一展示給大家。
總結(jié)
以上是生活随笔為你收集整理的经典算法书籍推荐以及算法书排行【算法四库全书】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联发科g90t相当于天玑多少?
- 下一篇: 风儿轻轻的吹是什么歌啊?