<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          目前最好的算法書

          共 4294字,需瀏覽 9分鐘

           ·

          2020-12-27 00:58

          這是從圖靈 2016 年發(fā)的一篇文章修改而來的標題,原先這篇文章的標題叫《如果你只能擁有一本算法書》。沒錯,這次,我們就不遮遮掩掩了,引用了一位大學教授的書評標題「 Best algorithms textbook by far」。從市場和讀者的反饋看,這也不是虛假宣傳。這篇文章的內(nèi)核是一篇書評,我們依然保留,送給 2016 年還沒來得及認識圖靈的小伙伴,以及還在猶豫選擇哪本算法參考書的小伙伴。

          如果關注算法圖書,你可能已經(jīng)猜到我們這本書的主角了,是:《算法(第 4 版)》。

          完全不夸張,《算法(第 4 版)》是目前市面上口碑、銷量、學習友好度綜合排名第一位的算法圖書。

          《算法(第4版)》豆瓣中文版評分 9.4,Amazon 英文版評分 4.6,圖靈同時引入出版了中英文版,一直超級受歡迎。最近兩年,其受歡迎程度快速穩(wěn)步上漲。

          當然,一本書無論別人怎么說它好,具體到你,總要去研究它是否真的適合自己的閱讀習慣和閱讀品味。那么,這本書好在哪里?你是否需要呢?

          以下是 Amazon 高票支持的《算法(第4版)》書評,也是相對客觀的書評。我們來看看這位大學教授是如何評價這本書的。

          最后,我們也在「閱讀原文」給出了圖靈算法書單,歡迎小伙伴挑到適合自己的算法書,攻克算法難題。


          目前最好的算法參考書??

          ★★★★★?389人覺得有用
          作者:Kevin P. Murphy ?(不列顛哥倫比亞大學計算機系教授)
          Robert Sedgewick 和 Kevin Wayne的《算法》(第4版,由 Addison-Wesley 于 2011 年 3 月出版)是我讀過的最棒的計算機科學方面的書籍之一。它應該是所有程序員以及計算機科學專業(yè)的學生的必讀書籍——它的目標是覆蓋“每個程序員都應該了解的 50 個算法”。下面我就來說說為什么我覺得這本書是如此優(yōu)秀。
          1
          Java源代碼 ?

          《算法》包含了具體的源代碼(基于一個 Java 的子集),這和它的主要對手——由 Cormen、Leiserson、Rivest 和 Stein (CLRS)完成的《算法導論》(An introduction to algorithms)——非常不同。這一點非常重要,因為它意味著學生們可以使用這些代碼去解決許多真實的問題。這些算法產(chǎn)生了從網(wǎng)絡搜索到基因組學的許多有趣和令人激動的應用,這些應用也貫穿了全書(這本書的網(wǎng)站上提供了所有的源代碼和數(shù)據(jù))。
          對真實代碼的一種很自然的擔心是它們可能會影響對概念的理解。但在這本書中,作者通過精心定義的抽象數(shù)據(jù)類型(隊列、背包、哈希表、樹、有向無環(huán)圖等類)賞心悅目的創(chuàng)造了許多既有可讀性又非常準確的實現(xiàn)。
          使用真實代碼的另一個好處是迫使你解決一些容易被忽略卻十分重要的實現(xiàn)細節(jié)。例如,大家都知道并歸排序需要輔助性內(nèi)存空間。在 CLRS 的偽代碼中,作者在他們的并歸函數(shù)內(nèi)部分配的臨時存儲空間。但在實踐中,僅分配一次臨時存儲空間并將它作為一個指針傳遞給并歸函數(shù)(或是將它作為并歸排序類的一個私有成員)將會高效得多。這種重要的技巧你又可以從哪里學到呢?
          2
          代碼配以詳細的語言闡釋?

          除了代碼的展示之外,本書也用清晰的語言解釋了這些方法。本書非常與眾不同的一點就是包含許多詳細的例子來說明這些算法在處理真實數(shù)據(jù)時的行為和表現(xiàn)。(除非你真的實現(xiàn)了這些算法,否則是很難得到這些數(shù)據(jù)的!)
          3
          嚴格遵循軟件工程實踐?

          這本書的另一個優(yōu)點是它嚴格遵守了軟件工程的最佳實踐:先寫 API,再寫單元測試或是實現(xiàn)一個使用該數(shù)據(jù)結構或算法的應用(用例),最后才考慮應該如何實現(xiàn)這個 API。另外,本書在許多時候還討論了同一 API 的多種實現(xiàn),它們在簡潔性、速度和內(nèi)存使用上的折中都各有不同。
          對于數(shù)據(jù)結構,使用“類”是很自然的,但對于算法作者也采用了這種描述方式,特別是圖算法。這使得算法能夠進行預處理并保存一些內(nèi)部狀態(tài),然后再為使用者提供服務。這種方式比傳統(tǒng)的無狀態(tài)的函數(shù)式的算法更加通用。
          4
          經(jīng)驗性算法題練習?

          這本書的每一節(jié)都有大量的練習,分為“簡單”、“提高”和“實驗”三種,它的網(wǎng)站提供了部分練習的解答。
          除了理論之外,本書還含有許多經(jīng)驗性的算法題目,這也是特色。它展示了算法的不同實現(xiàn)對于不同規(guī)模問題的實際運行時間,并用這些數(shù)據(jù)作為傳統(tǒng)理論分析的補充。
          相比 CLRS,這本書的一個小優(yōu)點是沒有那么厚(約 1000 頁,而 CLRS 有1300 頁)。
          5
          組織良好,循序漸進?

          顯然,《算法》和 CLRS 的內(nèi)容有許多重疊。從書的目錄來看這一點并不明顯,因此我寫了一份更加詳細的列表來列出這本書討論的所有問題。
          全書的組織非常好,前面介紹過的內(nèi)容(和代碼)會在后面得到多次應用(例如:堆 -> 優(yōu)先隊列 -> 最小生成樹的 Prim 算法)。書中的話題也會越來越高級。因此讀者最好一頁一頁的按順序閱讀本書。
          下面是我制作的一份書中的話題總結,這些話題從目錄上看起來并不明顯。
          ?關鍵話題?


          第1章 基礎
          1.1 ?礎編程模型
          -- Java入門
          -- API與各種庫
          -- 二分查找(遞歸)
          1.2 ?數(shù)據(jù)抽象
          -- 面向?qū)ο蠡A
          -- 避免“寬”接口
          1.3 ?背包、隊列和堆棧
          -- 泛型(C++中被稱為模板)
          -- 迭代器
          -- 表達式求值的Dijkstra的雙堆棧算法
          -- 動態(tài)數(shù)組
          -- 鏈表與指針
          1.4 ?算法分析
          -- 經(jīng)驗性算法
          -- 大O記法(“線性對數(shù)”的意思是O(NlogN))
          -- 隨機化的算法
          -- 內(nèi)存的使用
          1.5 ?實例分析:union-find算法
          -- 應用:動態(tài)連通性(p、q是否是在同一個集合中?)
          -- 三種實現(xiàn),最后得到一種經(jīng)典的算法

          第2章 排序算法
          2.1 ?初級排序算法
          -- 選擇排序
          -- 插入排序
          -- 希爾排序
          2.2 ?并歸排序
          -- 自頂向下的并歸排序(遞歸)
          -- 運行時間是NlogN的證明
          -- 自底向上的并歸排序
          -- 證明排序所需的比較次數(shù)的下界是NlogN
          2.3 ?快速排序
          -- 實現(xiàn)
          -- 分析
          -- 使用三向切分加快對等鍵情況的排序
          -- 證明排序成本的下界是N乘以鍵的分布的熵
          2.4 ?優(yōu)先隊列
          -- 堆
          -- 優(yōu)先隊列
          -- 使用優(yōu)先隊列解決得到一列數(shù)中最大的N個數(shù)的問題
          -- 使用索引優(yōu)先隊列實現(xiàn)N個有序列表的多向合并
          -- 堆排序
          -- 各種排序算法的比較(速度、穩(wěn)定性、原地性、額外空間的使用)
          -- 順序統(tǒng)計以及在O(N)時間內(nèi)找到中位數(shù)

          第3章 查找
          3.1 ?符號表(也叫做關聯(lián)性數(shù)組)
          -- 符號表與有序符號表(鍵可以被比較,因此可以得到最大和最小鍵)
          -- 在一份大文檔中統(tǒng)計詞頻
          -- 無序鏈表中的順序查找
          -- 有序數(shù)組中的二分查找
          3.2 ?二分查找樹
          -- 二分查找樹的性質(zhì)(父節(jié)點比左子節(jié)點大,比右子節(jié)點小)
          -- get和put方法的實現(xiàn),以及對其所需時間為O(logN)的分析
          -- 查找最小元素、刪除最小元素、刪除任意元素
          -- 中序遍歷
          3.3 ?平衡查找樹
          -- 2-3樹和紅黑樹
          3.4 ?哈希表
          -- 哈希函數(shù)(例如,取模以及Horner法則)
          -- 拉鏈法
          -- 線性探測法
          3.5 ?應用
          -- 去重
          -- 字典查找
          -- 逆向索引
          -- 文件索引
          -- 稀疏矩陣向量的乘法

          第4章 圖
          4.1 ?無向圖
          -- 臨接表的表示
          -- 深度優(yōu)先搜索
          -- 廣度優(yōu)先搜索
          -- 基于廣度優(yōu)先搜索的單點最短路徑算法
          -- 基于深度優(yōu)先搜索的連通分量算法
          -- 使用深度優(yōu)先搜索判斷G是否是無環(huán)的
          -- 使用深度優(yōu)先搜索判斷G是否是二分的
          -- Kevin Bacon游戲(六度理論)
          4.3 ?加權無向圖的最小生成樹
          -- Prim算法
          -- Kruskal算法
          4.4 ?加權圖中的最短路徑
          -- Dijkstra算法
          -- 加權有向無環(huán)圖中的最短路徑
          -- 調(diào)度問題的關鍵路徑算法
          -- 加權有環(huán)有向圖中的最短路徑(Bellman-Ford算法與負權重邊的檢測)
          -- 套匯

          第5章 字符串
          5.1 ?字符串排序
          --?鍵索引計數(shù)法(基數(shù)排序)
          -- 低位優(yōu)先的字符串排序
          -- 高位優(yōu)先的字符串排序
          -- 適用于帶有重復前綴字符串的三向字符串快速排序
          5.2 ?字典查找樹
          -- R向字典查找樹
          -- longestPrefixOf方法(最長公共前綴)
          -- 三向字典查找樹(R向數(shù)組的二分查找樹表示)
          5.3 ?子字符串查找
          -- 暴力方法
          -- KMP算法
          -- Boyer-Moore算法
          -- Rabin-Karp指紋算法
          5.4 ?正則表達式
          -- 語法
          -- 使用非確定性有限狀態(tài)自動機判定字符串是否在特定的語言中
          5.5 ?數(shù)據(jù)壓縮
          -- 基礎知識
          -- 游程編碼
          -- 哈夫曼壓縮算法
          -- LZW壓縮算法(基于字典查找樹)

          第6章 背景
          6.1 ?基于優(yōu)先隊列的事件驅(qū)動模擬
          6.2 ?B樹
          6.3 ?后綴數(shù)組
          -- 找出最長重復子字符串
          -- 字符串的索引(上下文中的關鍵字)
          6.4 ?Ford-Fulkerson最大流量算法
          -- 尋找最短增廣路徑
          -- 最大二分圖匹配問題向最大流量問題的歸約
          -- 最大流量問題和最短路徑問題向線性規(guī)劃問題的歸約
          6.5 NP完全性
          END


          作者:Kevin Wayne,Robert Sedgewick

          譯者:謝路云

          定價:99.00元 / 英文版129.00元


          • 中文版和英文版,豆瓣 9.4 分

          • 幾十年多次修訂,經(jīng)久不衰的暢銷書

          • 涵蓋所有程序員必須掌握的 50 種算法

          • Sedgewick 之巨著,與高德納 TAOCP 一脈相承


          本書作為算法領域經(jīng)典的參考書,全面介紹了關于算法和數(shù)據(jù)結構的必備知識,并特別針對排序、搜索、圖處理和字符串處理進行了論述。第 4 版具體給出了每位程序員應知應會的 50 個算法,提供了實際代碼,而且這些 Java 代碼實現(xiàn)采用了模塊化的編程風格,讀者可以方便地加以改造。本書配套網(wǎng)站提供了書中內(nèi)容的摘要及更多的代碼實現(xiàn)、測試數(shù)據(jù)、練習、教學課件等資源。


          關注數(shù):10億+?文章數(shù):10億+
          粉絲量:10億+?點擊量:10億+

          ?


          懸賞博主專區(qū)請掃描這里


          喜愛數(shù):?1億+?發(fā)帖數(shù):?1億+
          回帖數(shù):?1億+?結貼率:?99.9%


          —————END—————



          喜歡本文的朋友,歡迎關注公眾號?程序員哆啦A夢,收看更多精彩內(nèi)容

          點個[在看],是對小達最大的支持!


          如果覺得這篇文章還不錯,來個【分享、點贊、在看】三連吧,讓更多的人也看到~

          瀏覽 132
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一道本在线 | 国产精品粉嫩在线播放 | 操骚逼黄色网址 | 后入无码日韩 | 人人操人人人人操人人爱 |