2016年11月我终于读完了《算法导论》。
说起来买这本书已经很久了。最早是上大学的时候就听说了这本书知道它是算法领域的经典中的经典但是那时候觉得太厚了太难了一直没敢,买。
后来工作了一段时间发现算法真的很重要。很多工作中的问题其实都可以归结为算法问题如果算法学得好就能更快更好地解决这些问题。而且面试的时候算法也是必考的很多大公司都很看重算法能力。
于是咬咬牙买了一本,《算法导论》,第三版中文版厚厚的一大本一千多页拿在手里沉甸甸的。
刚开始读的时候真的很痛苦很多内容看不懂很多证明看不明白很多习题不会做。读了几章就有点想放弃了。
但是后来还是坚持下来了断断续续读了一年多终于在这个月把整本书读完了。
虽然读得很辛苦很多内容也没有完全吃透但是收获非常大对算法对数据结构对计算机科学都有了更深的理解。
今天就来聊聊,《算法导论》这本书以及为什么它是算法领域的必读书。
一、关于,这本书
先简单介绍一下这本书。
《算法导论》,英文原名Introduction to Algorithms作者是Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein四位都是计算机科学领域的大牛。因为四位作者的首字母分别是C、L、R、S所以程序员们亲切地称这本书为,"CLRS"。
这本书第一版出版于1990年第二版出版于2001年第三版出版于2009年。到现在已经三十多年了仍然是算法领域的最权威最经典的教材被全世界很多大学用作算法课的教材。
这本书内容非常全面涵盖了算法领域的几乎所有重要的主题包括:
- 算法基础:算法在计算中的作用算法入门函数的增长分治策略概率分析和随机算法
- 排序和顺序统计量:堆排序快速排序线性时间排序中位数和顺序统计量
- 数据结构:元素排序哈希表二叉搜索树红黑树数据结构的扩张
- 高级设计和分析技术:动态规划贪心算法摊还分析
- 高级数据结构:B树斐波那契堆van Emde Boas树用于不相交集合的数据结构
- 图算法:基本的图算法最小生成树单源最短路径所有结点对的最短路径最大流
- 算法问题选编:多线程算法矩阵运算线性规划多项式与快速傅里叶变换数论算法字符串匹配计算几何学NP完全性近似算法
可以说这本书就是算法领域的百科全书几乎所有重要的算法和数据结构都能在这本书里找到。
而且这本书不仅讲了算法怎么实现更讲了算法为什么这样设计算法的正确性怎么证明算法的时间复杂度空间复杂度怎么分析。这些都是很重要的能帮我们从本质上理解算法。
二、这本书的,特点
读完这本书我总结了它的几个特点。
1. 内容全面系统
这本书最大的特点就是内容全面系统。
它从最基础的算法入门讲起一直讲到最前沿的高级算法涵盖了算法领域的几乎所有重要的主题。
而且它的结构很清晰很系统从基础到进阶从简单到复杂循序渐进层层递进。每一章都建立在前面章节的基础上前面的内容学好了后面的内容就容易理解了。
这种全面系统的讲解能帮我们建立一个完整的算法知识体系而不是零散地知道一些算法。
2. 讲解深入透彻
这本书另一个特点就是讲解深入透彻。
它不仅讲了算法怎么实现更讲了算法为什么这样设计算法的思路是什么算法的正确性怎么证明算法的时间复杂度空间复杂度怎么分析。
比如讲快速排序它不仅讲了快速排序怎么实现还讲了快速排序的分治思想快速排序的性能分析快速排序的最坏情况最好情况平均情况快速排序的随机化版本快速排序的和其他排序算法的比较。
这种深入透彻的讲解能帮我们从本质上理解算法而不是只记住算法的实现代码。
而且理解了算法的本质我们才能在实际工作中灵活地运用算法甚至根据实际情况改进算法创造新的算法。
3. 数学严谨证明充分
这本书还有一个特点就是数学严谨证明充分。
算法是建立在数学基础上的很多算法的正确性性能都需要用数学来证明来分析。
这本书在这方面做得非常好。几乎每一个重要的算法都有严格的数学证明证明算法的正确性分析算法的时间复杂度空间复杂度。
比如讲红黑树它详细证明了红黑树的各种操作为什么能保持红黑树的性质为什么时间复杂度是O(log n)。
这种数学严谨证明充分的讲解虽然读起来比较吃力但是能帮我们更深入地理解算法也能培养我们的数学思维和逻辑思维。
而且对于想做算法研究或者想进大公司做算法工程师的人来说这种数学证明的能力是非常重要的。
4. 习题丰富有挑战性
这本书还有一个特点就是习题丰富有挑战性。
每一章后面都有很多练习题和思考题。这些习题有简单的也有很难的有的是巩固本章的内容有的是扩展本章的内容有的甚至是一些研究性的问题。
做这些习题能帮我们更好地理解本章的内容也能锻炼我们的思维能力和解决问题的能力。
我在读这本书的时候尽量每一道练习题都做了虽然很多思考题不会做但是做了的那些都让我收获很大。
而且这本书的很多习题都很经典经常被各大公司用作面试题。所以把这些习题做好了面试的时候也会更有把握。
三、我的阅读方法
这本书很厚很难很多人读了几章就放弃了。我在读这本书的时候也走了一些弯路后来慢慢找到了一些适合自己的阅读方法。
今天就分享一下我的阅读方法希望能对想读这本书的朋友有帮助。
1. 不要逐字逐句地读要有重点地读
这本书一千多页内容很多很难如果逐字逐句地读不仅读得很慢而且很容易看不懂很容易放弃。
所以我建议不要逐字逐句地读要有重点地,读。
首先先把每一章的引言和小结读了了解本章主要讲了什么核心思想是什么。
然后再读本章的核心内容重点理解算法的思路算法的实现算法的性能分析。
对于一些太复杂的数学证明如果看不懂可以先跳过等以后有时间再回来慢慢,看。不要因为一个证明看不懂就卡住了就放弃了。
而且有些章节比如高级数据结构里的斐波那契堆van Emde Boas树等如果平时用不到也可以先跳过等需要的时候再回来,看。
2. 边读边写代码实现算法
读算法书光看是不够的一定要边读边写代码实现算法。
只有自己动手实现了算法才能真正理解算法。而且写代码的过程也是一个思考的过程能帮你发现很多看书的时候发现不了的问题。
我在读这本书的时候每学一个算法都会用自己熟悉的语言(我用的是PHP后来也用了Python),实现一遍。
比如学了快速排序就自己写一个快速排序的函数;学了二分查找就自己写一个二分查找的函数;学了红黑树就自己实现一个红黑树。
虽然写代码花了很多时间但是收获非常大对算法的理解深入了很多。
而且自己实现的这些算法代码也可以作为自己的代码库以后工作中需要的时候可以直接用或者参考。
3. 做习题巩固知识
前面说了这本书的习题很丰富很有挑战性。所以一定要做习题巩固知识。
我建议每学完一章都尽量把本章的练习题都做了。练习题一般比较简单是巩固本章的基本内容的做了能帮你更好地理解本章的内容。
思考题比较难可以选做一些自己感兴趣的或者和自己工作相关的。如果不会做可以看看网上的答案或者和别人讨论讨论。
做习题虽然花时间但是能帮你更好地理解算法也能锻炼你的思维能力和解决问题的能力。
4. 反复读多次读
这本书内容很多很难读一遍是不可能完全理解的。所以一定要反复读多次读。
我第一遍读的时候很多内容看不懂很多证明看不明白很多习题不会做。但是我还是坚持把整本书读了一遍有了一个整体的印象。
然后第二遍读的时候就轻松很多了很多第一遍看不懂的内容第二遍就看懂了。而且第二遍读的时候重点看了第一遍没看懂的地方和自己工作中常用的算法。
以后工作中遇到相关的算法问题也会回来翻翻这本书每次翻都有新的收获。
所以不要期望读一遍就完全理解这本书要反复读多次读每次读都会有新的收获。
5. 结合实际应用读
读算法书最忌讳的就是为了读而读脱离实际应用。
如果只是为了读书而读书那么读完了很快就会忘记而且也不知道怎么,用。
所以一定要结合实际应用,读。在工作中遇到算法问题的时候回来翻翻这本书看看有没有相关的算法能解决这个问题。
比如工作中需要做排序就回来看看排序的章节看看哪种排序算法最适合当前的场景;工作中需要做查找就回来看看查找的章节看看哪种数据结构最适合当前的场景。
这样结合实际应用读不仅能帮你更好地理解算法还能帮你解决实际的工作问题一举两得。
四、我的收获和感悟
读完这本书我收获非常大有很多感悟。
1. 算法是程序员的基本功
读完这本书我更加深刻地认识到算法是程序员的基本功。
很多初学者觉得算法不重要觉得工作中用不到觉得只要会用框架会写业务代码就够了。
但是实际上算法无处不在。很多工作中的问题其实都可以归结为算法问题。比如如何高效地查找数据如何高效地排序数据如何高效地处理图的问题如何优化代码的性能等等这些都需要算法知识。
而且算法能帮我们写出更高效更优雅的代码。同样一个问题算法学得好的人能写出时间复杂度空间复杂度都很优的代码;算法学得不好的人可能就只能写出暴力的低效的代码。
而且现在很多大公司面试都很看重算法能力。因为算法能力能反映一个程序员的逻辑思维能力解决问题的能力和基本功。如果算法学得好面试的时候就更有优势更容易拿到好的offer。
所以算法是程序员的基本功一定要好好,学。
2. 基础很重要
读完这本书我也更加深刻地认识到基础很重要。
现在技术更新换代很快新的框架新的语言新的工具层出不穷。很多程序员热衷于追新技术学了这个框架又学那个框架但是基础却很薄弱。
但是实际上新技术万变不离其宗都是建立在基础之上的。如果基础扎实那么学新技术就很快很容易;如果基础薄弱那么学新技术就很慢很吃力而且只能学到皮毛学不到本质。
算法就是计算机科学最重要的基础之一。把算法学好了基础扎实了不管以后技术怎么更新换代都能很快适应很快学会。
而且基础扎实的程序员和基础薄弱的程序员差距会随着时间越来越大。基础扎实的程序员能解决更复杂的问题能写出更高效的代码能更快地学习新技术发展潜力更大。
所以一定要重视基础好好学算法数据结构操作系统计算机网络编译原理这些计算机科学的基础课程。
3. 数学很重要
读完这本书我也更加深刻地认识到数学很重要。
算法是建立在数学基础上的。很多算法的设计分析证明都需要数学知识。比如时间复杂度空间复杂度的分析需要高等数学的知识;概率算法随机算法需要概率论的知识;数论算法需要数论的知识;计算几何学需要几何学的知识。
如果数学不好那么学算法就会很吃力很多证明看不懂很多分析不明白只能记住算法的实现学不到本质。
而且数学能培养我们的逻辑思维能力抽象思维能力这些对于程序员来说都是非常重要的。
所以一定要重视数学好好学高等数学线性代数概率论离散数学这些数学课程。虽然学的时候可能觉得没用但是以后会发现用处很大。
4. 坚持很重要
读完这本书我最大的感悟就是坚持很重要。
这本书很厚很难读起来很吃力很多人读了几章就放弃了。我刚开始读的时候也很痛苦也想过放弃。
但是后来还是坚持下来了每天读一点每周读一章断断续续读了一年多终于把整本书读完了。
读完之后回头看发现其实也没有那么难只要坚持每天读一点慢慢就能读完。
而且很多事情都是这样的看起来很难很遥远但是只要坚持一步一个脚印慢慢地就能完成。
所以不管做什么事情都要坚持不要轻易放弃。坚持下去总会有收获的。
五、推荐理由
最后总结一下为什么我推荐大家读,《算法导论》。
1. 它是算法领域的经典中的经典
这本书出版三十多年了仍然是算法领域的最权威最经典的教材被全世界很多大学用作算法课的教材。能经过这么长时间的考验仍然被广泛使用说明它确实是一本好书。
2. 它内容全面系统讲解深入透彻
这本书涵盖了算法领域的几乎所有重要的主题内容全面系统讲解深入透彻。读了这本书能帮你建立一个完整的算法知识体系从本质上理解算法。
3. 它能帮你打好基础提升能力
读这本书能帮你打好算法基础数学基础提升你的逻辑思维能力解决问题的能力编程能力。这些能力对于程序员来说都是非常重要的能让你在职业发展中走得更远。
4. 它对面试很有帮助
现在很多大公司面试都很看重算法能力。这本书的内容和习题很多都是面试的常考点。把这本书学好了面试的时候就更有把握更容易拿到好的offer。
六、写在最后
《算法导论》:算法领域的必读书。
这本书很厚很难读起来很吃力但是只要坚持读完收获会非常大。它不仅能帮你学好算法打好基础还能培养你的思维能力提升你的整体素质。
算法是程序员的基本功也是区分普通程序员和优秀程序员的重要标志。想成为一名优秀的程序员一定要好好学算法而,《算法导论》,就是学算法的最佳教材。
如果你也想学好算法想提升自己的能力那么我推荐你读一读,《算法导论》。虽然读的过程会很辛苦但是读完之后你会发现一切都是值得的。
最后用一句话结尾:
"算法是程序的灵魂。学好算法才能写出有灵魂的程序。"
愿大家都能学好算法打好基础成为一名优秀的程序员。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录