学算法要读《算法导论》吗?

京东云开发者
• 阅读 319

这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间,也为了给经典的“黑皮书”祛魅,我觉得这些书籍在大部分互联网从业者心中已经不再是进步的阶梯,而是恐惧的阴影了,因为当一些学习路线中列出这些书目时,评论区多是调侃少是交流和讨论。在这之前我也这些书抱有读起来很困难的看法,但是在我参考过《算法导论》之后,我觉得它更像是一杯“鸡尾酒”:正文学习起来相对容易,能帮大家建立基础,后续的习题和实验,能帮助有需要的人进行深入学习,扩展的高级数据结构和数论等章节也能进行探索,就看大家怎么来利用了。

开始学习算法的契机是23年初参加《Hello 算法》开源项目的内容贡献,发现自己算法基础知识匮乏,索性准备系统地学习一下算法相关的知识,在这前后一共读了4本书:《Hello 算法》、《数据结构与算法之美》、《算法(第四版)》和《算法导论》(参考了前16章),学习期间在朋友的建议下实践了艾宾浩斯学习法,觉得收货良多。所以,本文会分两部分,分别介绍算法的学习指南和学习方法,希望对大家能有启发:

算法学习指南

我采用的专题阅读学习,以《算法》为主要参考书目,逐章阅读,每学习完一个章节都会再去阅读其他书籍的对应章节作为内容补充,并结合章后的习题练习(我觉得没有练习的算法学习都是空架子,因为大多时候看会了很可能还是写不出来,但是官方给出的参考答案补全,可以参考《算法(第四版)》参考答案开源项目)。但是事实上并不是这些书中所有的内容都值得参考,所以可以参照下面的学习方法:

《算法》的第二章排序介绍了时间复杂度为O(n^2)和O(logn)的排序算法,它并没有直接介绍时间复杂度为O(n)的桶排序、计数排序和基数排序,而是将它们放在了第五章的字符串排序中,我认为这部分并不好,所以在完成这一章的学习后,需要参考《Hello 算法》的第十一章或者《算法导论》的第八章,我认为参考前者更合适一些。

《算法》的第三章在介绍红黑树时,它写的是左倾红黑树(与2-3查找树同构),该数据结构是这本书的作者先前发表的一篇论文,它是经典红黑树的变体,实现相对容易。不过,在Java语言中TreeMap的实现采用的经典红黑树(与2-3-4查找树同构),我认为如果要扩展学习经典红黑树的话需要结合《算法导论》的第十三章和TreeMap的源码,除此之外,暂时没有发现参考学习经典红黑书更合适的材料。

除此之外,《算法》中没有对动态规划和贪心算法的介绍,这一部分在《算法导论》的第十五章和第十六章有讲解,不过动态规划和贪心算法类的Leetcode题目在我看来还是比较难的,需要结合大量的练习才行。

以上,对于 基础的算法学习 就比较全面了,下面我们来讨论一些问题作为补充:

《算法导论》需要读吗?

我认为《算法导论》真的是非常合适的算法学习参考书,由于之前我也带着“黑皮书”读起来比较困难的想法,所以只把它作为了补充阅读,没有以它的内容为准,如果现在让我重新选择,我会把它作为主要参考书而其他作为补充阅读。

《算法导论》它不局限于语言,其中的代码内容是伪代码实现,所以任何语言的学习者都是合适的。而且,它会用单独的章节来介绍算法中常用的策略,如分治法等,此外在数据结构中创建哨兵节点的技巧也在链表章节中也描述。我认为它的前十六章加上第二十二章用来学习基础的算法已经足够了。开篇我说这本书像鸡尾酒,因为 它还扩展了高级数据结构和更加深入的算法知识,如斐波那契堆、van Emde Boas 树、数论算法和NP相关的知识等,所以,它的知识更加全面,面向的读者范围更广。我认为作为普通的算法学习者,一定要把握好学习的度,因为算法本身相对更加耗费脑力和时间,钻牛角尖式的学习在工作和生活间协调起来是不容易的,而且在算法导论中确实有一些复杂的证明和推导存在,可以选择性的跳过,因为我们的学习并非研究和探索,这样降低了难度也提高了学习效率。

《Hello 算法》是怎样的一本参考书?

《Hello算法》是一本基础的算法书,它的作者是也是Leetcode上剑指Offer系列题解的作者,这本书的知识基本上覆盖了刷LeetCode所需要的知识,它在内容深度上没有做扩展,像红黑树这些,也正如它的前言所述:它是一本能够让你避免读大部头便具备基本刷题能力的书,如果大家在短时间内想补足算法知识的话,参考这本书足够了,但是深入的学习是必要且无法被替代的。

对于只想刷题的同学该怎么学习?

我觉得可以直接参考高频题目的题单 分类 先刷起来,然后根据题目,发现缺少的知识进行补足。这样相对更加高效,因为Leetcode具有技巧性和规律性,结合大量的题目练习是最好的方式,反而如果先啃完大部头再回过头刷题可能效率不够高,而且这样也不能得到预期的收益,因为这些书它并不是教你如何刷题的。


以上内容对于找到适合自己的算法学习路线我认为已经足够了,接下来是我在算法学习中实践过的学习方法:

艾宾浩斯学习法

我认为学习某项技能,不仅局限于算法的学习,最终目的在于形成对它的长期记忆,并不是仅仅保留印象,而形成长期记忆的方法也非常简单:即频繁而有效的重复刺激,像我们的母语和一些生活习惯(刷牙、打扮和系鞋带等)之所以不会忘记是因为我们每天都在反复的刺激大脑如何运用,乃至最后都形成了肌肉记忆。总之,学习结合规律的复习,并归纳总结,便可以克服遗忘,达到温故知新的结果

艾宾浩斯遗忘曲线,即人对于知识的遗忘速度遵循 "先快后慢" 的原则。学得的知识在一天后,如不抓紧复习,很快就只剩下原来的 25%,而随着时间的推移,遗忘的速度会减慢,遗忘的数量也随之减少。

学算法要读《算法导论》吗?

如果想有效抵抗遗忘,最好的办法就是进行规律的复习(每 5 分钟、30分钟、12小时、1天、2天、4天、7天、15天、1个月、3个月、6个月)。

艾宾浩斯遗忘曲线是大家都熟悉的概念,但是我几乎没有发现我的同学采用类似的学习方法。如果不是在朋友的推荐下,我也不会去改变自己的学习方式,在我实践过之后,收获很大,所以也分享给大家,下面是部分我用来记录学习和复习的艾宾浩斯表格:

学算法要读《算法导论》吗?

我并没有完全照搬它的复习时间,而是采用了2小时、12小时、2天、7天、15天、1个月和3个月这样的时间间隔,其中表格中记录的是学习日期,绿色表示按时完成复习,红色表示没有按时复习。

采用这个学习方法我认为需要始终坚持 “循序渐进,按部就班” 的学习理念,不能一时图快而在短时间内学习过多知识,否则它会带来长时间的复习压力,也不能采取断断续续学习几天就休息一阵子的方式,而是真正地让学习成为一种习惯,慢慢地积累达到知识稳步增长的目的,这更像是投资的复利。

这种学习方法完全打破了我之前“从来不复习,永远看新的”的学习方式,而且不复习经常会带来“这个东西我看过,但是我忘了”的困扰,导致最后学完什么都没有剩下的局面,并且从采用这个学习方法之后,以“手写线段树”为例,真得可以信手拈来,像“肌肉记忆”一样,所以规律的学习和复习是很有必要的。需要注意的是:这种学习方式需要耐心、毅力和自制力的辅助,并根据自身记忆情况进行合理的调整,达到合适的学习和复习模式,否则很容易在遇到长假休息时导致学习计划夭折。

Over

所有内容到这里就已经结束了,文末是一些优秀的参考文章和题单,希望能帮助大家在算法学习上少走一些弯路,最后祝大家学得开心~


巨人的肩膀

点赞
收藏
评论区
推荐文章
一只编程熊 一只编程熊
3年前
ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识结构图首先,了解算法和数据结构有哪些知识点,在学习中形成大局观,对学习和刷题十分有帮助。下面是我花了一天时间整理的算法和数据结构的知识结构,大家可以看看。<imgsrc"https://tva1.sinaimg.cn/large/008i3skNly1gsbvbwd5u1j30ys0u0tl6.jpg"alt"image202107
Souleigh ✨ Souleigh ✨
3年前
学完了C++语法之后该学什么??(数据结构与算法篇)
数据结构与算法数据结构与算法,我就不想多说了,重要性不用说。应届生秋招和春招最大的优势估计就是数据结构与算法的掌握了。上面三门课程的学习,基本也都是离不开数据结构的,对于如何学习数据结构与算法,我觉得可以在写一篇文章了,所以数据结构与算法的学习,我这里不写了。论面试,我觉得 操作系统计算机网络数据库 数据结构算法 这四大块是问的最多的,所以我写的
Stella981 Stella981
3年前
PBFT算法java实现(上)
PBFT算法的java实现(上)在这篇博客中,我会通过Java去实现PBFT中结点的加入,以及认证。其中使用socket实现网络信息传输。关于PBFT算法的一些介绍,大家可以去看一看网上的博客,也可以参考我的上上一篇博客(https://www.oschina.net/action/GoToLink?url
Wesley13 Wesley13
3年前
Java学习路线!
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。  在大家看之前,我要先声明两点。1、由于我本人是Java后端开
Stella981 Stella981
3年前
EPI online zoom session 面试算法基础知识直播分享
各位有兴趣做面试算法解题的朋友, 突击九章算法班半年以后,未来两个月我打算仔细学习ElementsofProgrammingInterviewsinPython,(EPI),夯实基础知识.为了督促自己保持合理进度,咱每周都会有两三次学习心得分享,zoom视频直播,欢迎报名.一般直播时间是每天加西时间
Stella981 Stella981
3年前
JVM垃圾收集算法之清除算法
  最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识。我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际中怎么应用确实比较难总结。但以后我也会尽量总结这个知识点有什么用。  看前总结:为什么要了解垃圾回收中清除算法的具体实现,那是因为在jvm有很多
菜园前端 菜园前端
1年前
什么是分而治之?
原文链接:什么是分而治之?在我们前面有学习过一系列数据结构、以及相关的一些算法,包含排序、搜索算法。而本次学习的分而治之它不是数据结构,也不是一种算法,而是算法设计中的一种方法,可以理解为是一种思想。我们可以利用这种思想去设计很多种算法。分而治之是将一个问
京东云开发者 京东云开发者
10个月前
深入理解经典红黑树 | 京东物流技术团队
本篇我们讲红黑树的经典实现,Java中对红黑树的实现便采用的是经典红黑树。前一篇文章我们介绍过左倾红黑树,它相对来说比较简单,需要大家看完上篇再来看这一篇,因为旋转等基础知识不会再本篇文章中赘述。本篇的大部分内容参考《算法导论》和Java实现红黑树的源码,