前言

演算法是計算機從業者的核心技能,不論是前端、後端還是人工智慧,都建立在良好的演算法基礎之上。剝開光鮮亮麗的外殼,底層無不是艱深晦澀的演算法,它們默默支撐著數以千萬計的應用程式,用最小的代價實現最大的功能,給人類社會的進步提供著源源不斷的動力。

我最初接觸演算法是在2015年研一的高階演算法設計課程,說來可笑,那段時間一上課我就瞌睡,老師的聲音更是像催眠曲般伴我入眠,整個學期下來幾乎什麼都沒學明白。到了2016年,趁著實驗室工作還比較輕鬆,決定開始讀《演算法導論》這本書。一邊讀一邊寫文章總結,便有了這個系列的文章。可惜好景不長,實驗室的事情多起來,讀書計劃只好中道崩殂,放下不提。以至於時至今日,我對演算法的掌握仍然侷限於最最基礎的那些,稍微高階些的演算法,比如動態規劃、貪心演算法,還是一片雲裡霧裡。

最近,偶然又翻出這本書,覺得還是應該繼續讀一讀,也算是完成一份未了的心願。

當初,演算法導論系列文章發表在簡書上,同時自己寫了一份Java版的配套程式碼。現在,我把文章翻新後重新發佈於知乎專欄,並保持程式碼的更新。

最後,歡迎大家前來交流。

原版前言

本書提供了對當代計算機演算法研究的一個全面、綜合性的介紹。

一直以來,《演算法導論》都是計算機領域學習演算法的不二法門,這是一門導論性的書籍,但它的內容卻異常豐富,足以滿足普通程式開發人員的日常需求。因此,學習《演算法導論》也成了每一位程式設計師的必經之路。

我在幾年前已經瞭解到這本鉅著對於我的重要性,但一直沒抽出時間讀完它。現在,藉助簡書這個平臺,把我學習過程中遇到的重點、難點、感悟和體會記錄下來,以便今後時時查閱,也希望能順便為對演算法感興趣的讀者們提供些許的幫助。

版本

以2013年機械工業出版社出版的《演算法導論》原書第3版中文版為準。

閱讀經典——《演算法導論》

本書目錄

第一部分 基礎知識

第1章 演算法在計算中的作用

第2章 演算法基礎

第3章 函式的增長

第4章 分治策略

第5章 機率分析和隨機演算法

第二部分 排序和順序統計量

第6章 堆排序

第7章 快速排序

第8章 線性時間排序

第9章 中位數和順序統計量

第三部分 資料結構

第10章 基本資料結構

第11章 散列表

第12章 二叉搜尋樹

第13章 紅黑樹

第14章 資料結構的擴張

第四部分 高階設計和分析技術

第15章 動態規劃

第16章 貪心演算法

第17章 攤還分析

第五部分 高階資料結構

第18章 B樹

第19章 斐波那契堆

第20章 van Emde Boas樹

第21章 用於不相交集合的資料結構

第六部分 圖演算法

第22章 基本的圖演算法

第23章 最小生成樹

第24章 單源最短路徑

第25章 所有結點對的最短路徑問題

第26章 最大流

第七部分 演算法問題選編

第27章 多執行緒演算法

第28章 矩陣運算

第29章 線性規劃

第30章 多項式與快速傅立葉變換

第31章 數論演算法

第32章 字串匹配

第33章 計算幾何學

第34章 NP完全性

第35章 近似演算法

第八部分 附錄:數學基礎知識

附錄A 求和

附錄B 集合等離散數學內容

附錄C 計數與機率

附錄D 矩陣

專欄目錄

插入排序

歸併排序

矩陣乘法Strassen演算法

主方法求解遞迴式

堆排序

快速排序

計數排序、基數排序和桶排序

。。。

其它

由於書中採用虛擬碼描述演算法,陣列的下標從1開始。但Java中陣列下標從0開始,因此本系列文章中的原始碼會與書中有所區別,需稍加註意。

本文涉及到的所有程式碼均開源在GitHub的Algorithms倉庫中,並附以詳細註釋,供讀者參閱。