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

news2024/10/3 10:40:57

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

开始学习算法的契机是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%,而随着时间的推移,遗忘的速度会减慢,遗忘的数量也随之减少。

WechatIMG120.jpg

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

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

image.png

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

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

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

Over

所有内容到这里就已经结束了,学习算法这件事情起于23年3月,可能由于算法本身比较耗费脑力,需要协调大块的时间和精力,所以它几乎占据了我去年大部分休息时间,文末是一些优秀的参考文章和题单,其中Github - LeetCode题单是我自己花时间整理的,希望能帮助大家在算法学习上少走一些弯路,最后祝大家学得开心~


巨人的肩膀

  • 《Hello 算法》

  • 《算法(第四版)》

  • 《算法导论》

  • 《数据结构与算法之美》

  • GitHub - algorithms-sedgewick-wayne

  • GitHub - LogicStack-LeetCode

  • Github - LeetCode题单

  • Leetcode - 论如何 4 个月高效刷满 500 题并形成长期记忆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Simulink系列】——动态系统仿真 之 混合系统

声明:本系列博客参考有关专业书籍,截图均为自己实操,仅供交流学习! 一、混合系统概述 由不同类型系统共同构成的系统称为混合系统!仿真时必须考虑连续信号和离散信号的采样匹配问题,一般使用变步长连续求…

golang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大,似中文 主要原因: 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况,全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符,在没…

物联网七种通信协议

物联网(IoT)的快速发展催生了多种通信协议,每种协议针对不同的应用场景和需求有着独特的设计和优化。今天小编给大家介绍物联网领域中七大关键通信协议,希望对大家了解物联网通信协议提供一些帮助! 1、MQTT MQTT(Mess…

设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构

文章目录 前言实战演示写在最后 前言 相信很多人都使用过LinkedHashMap,LinkedHashMap中的removeEldestEntry可以删除老旧的元素,我们可以以此来实现一个LRU缓存结构,并结合java中JUC包中的各种多线程锁机制来保证多线程安全。 以下是我遇见…

【管理咨询宝藏资料26】某城投集团对标案例分析报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料26】某城投集团对标案例分析报告 【关键词】战略规划、对标研究、管理咨询 【文件核心观点】 - 市场化城开企业,打造城市综合运…

[ai笔记12] chatGPT技术体系梳理+本质探寻

欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第12篇分享! 这周时间看了两本书,一本是大神斯蒂芬沃尔弗拉姆学的《这就是ChatGPT》,另外一本则是腾讯云生态解决方案高级架构师宋立恒所写的《AI制胜机器学习极简入门》&#xf…

【web】云导航项目部署及环境搭建(复杂)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

python自动化管理和zabbix监控网络设备(有线网络配置部分)

目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name huawei revision-level 1 instance…

无需工具清理电脑C盘

方法如下: 1、打开我的电脑,在C盘上面右键单击,选择属性: 2、然后点击清理磁盘,选择在自己要删掉的垃圾文件 接下来等待几分钟的样子,清理好就OK了,强迫症!

如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序,适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目: 考察内容: 思路转化:求出o字母出现偶次(o的索引);环形–双倍字母; 方法1:循环变量双倍字母(保证环线),记录最大偶次,如果是&a…

vue2和vue3 setup beforecreate create生命周期时间比较

创建一个vue程序&#xff0c;vue3可以兼容Vue2的写法&#xff0c;很流畅完全没问题 写了一个vue3组件 <template><div></div> </template><script lang"ts"> import {onMounted} from vue export default{data(){return {}},beforeCr…

Python接口自动化测试 —— unittest批量用例管理!

我们日常项目中的接口测试案例肯定不止一个&#xff0c;当案例越来越多时我们如何管理这些批量案例&#xff1f;如何保证案例不重复&#xff1f;如果案例非常多&#xff08;成百上千&#xff0c;甚至更多&#xff09;时如何保证案例执行的效率&#xff1f;如何做&#xff08;批…

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;它管理外部访问集群内部服务的规则。你可以将其视为一个入口&#xff0c;它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

高分SCI绘图必备!你必须要学会的18种Matlab绘图代码与20个绘图技巧(附完整代码)

目录 绘图技巧篇 绘图代码篇 免费完整代码获取​ 今天为大家带来一期18种Matlab绘图代码与20个绘图技巧代码&#xff0c;所有代码完全免费&#xff01; 如果你想发SCI&#xff0c;普通的图已经进入不了审稿人的视线了&#xff0c;非常容易被拒稿。试想&#xff0c;如果一篇…

探寻2024国际生物发酵展览会-水木清研生态环保

参展企业介绍 水木清研生态环保(山东)有限公司是恶臭异味废气治理领域的高新技术企业&#xff0c;提供集研发、设计、制造、技术支持与服务、工程、售后、运维于一体的异味废气治理整体解决方案&#xff0c;公司是复旦大学环境科学研究所科研转化基地&#xff0c;并与中国环保…

Vue前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码&#xff1a; import { v4 as uuidx } from uuid;import emitter from /utils/mittclass Message {// 过期时间&#xff0c;0表示马上就消费exp: number;// 消费标识&#xff0c;避免重复消费tag : string;// 消息体body : any;constructor( exp: number …

OD(10)之Mermaid甘特图(Gantt diagrams)使用详解.md

OD(8)之Mermaid甘特图(Gantt diagrams)使用详解 Author: Once Day Date: 2024年2月24日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermiad使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting …

Qt QWidget 简约美观的加载动画 第四季

&#x1f60a; 第四季来啦 &#x1f60a; 效果如下: 只有三个文件,可以直接编译运行的 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]) …