前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的算法学习路线

我的算法学习路线

作者头像
用户9848496
发布2022-09-26 11:23:22
7510
发布2022-09-26 11:23:22
举报
文章被收录于专栏:算法不好玩

今天有读者要求我写我的「算法学习路线」。其实也没什么路线,干就完了,行动起来最重要。入门以后的训练和时间投入就完全看自己了,我所认识的现在还在刷题的朋友,他们现在都可以保持独立的思考,已经养成了习惯,会看题解,但不依赖题解。

简单来说算法学习路线就是:从易到难、先简单后中等、分类刷题、查漏补缺、边刷边学、题号靠前的题目很重要。

下面我结合自己的经历详细说一下我的算法学习路线。

首先还是一个免责声明,为了保证大家最顺畅的阅读体验,本文中提到的书、资料、网课,与我均无商业合作关系。对它们的评价有些比较片面,仅出于我的个人喜好。我今天写出来的东西就和大家聊天一样,是脱口而出的,是我最真实的经历和一些思考。

数次启动而未坚持

我有一个计算机专业的同学,在我转行以后一直给我建议,他多次提醒我,要我学习算法与数据结构。我也听了,以前买来很多书,但实际上很多都没有看进去。原因主要有:

  • 没有兴趣;
  • 书本身编排有问题,很可能我选的书不是一本好书;
  • 我没有迫切想要学好的需求和欲望。

还有一个场合我印象很深,2016 年,我到图书馆里拿着一个面经,这个面经上写了两个排序算法:选择排序、冒泡排序。我学习了一个早上,当时是搞懂了,但我却高兴不起来,因为 以后一定会忘记的。因为这已经不是我第一次学习这两个排序算法。

从 2017 年 5 月开始

我很能理解为什么上班的时候,没有时间和精力学习。只要在上班,我每天回到家什么都不想做,就想躺着。有几次回到出租屋,居然都忘记了吃饭,躺在床上一下子睡到了第二天早上,然后又去上班。打工人,要赚这个工资,也没啥好说的。

我真的开始系统学习算法是在 2017 年 5 月,那个时候我刚刚辞职。但是我并不觉得一定需要拿出一整块的时间学习,只是那段我恰好有时间而已。

在 2017 年前后,自媒体刚刚火了起来,很多人在那个时候就已经开始做知识分享,我也是在那个时间段才开始看各种视频,因为知识可以变现,所以会有人去做优质的内容,我就是受益者之一。现在分享知识的人太多了,

选择合适的资料

我买过很多网课、很多书,网课当中我认为讲的最好的,就是 liuyubobobo 老师在慕课网上讲的《算法与数据结构-综合提升 C++版》,当时这门课程叫《玩转算法》。即使是这么优秀的老师,我理解、吸收这些内容也花费了大量的时间,一个算法反复写,一个数据结构反复写,知识点自己复述、总结。反复的次数多了,就从原本的被动接受知识变成了主动的思考、验证和提出新的角度、知识迁移。

什么资料是最合适自己的,需要自己去找。我觉得一开始感兴趣比较关键,就是这本书的封面、图文安排能够吸引自己看下去,这本书的作用就达到了,所以《算法图解》和《算法(第 4 版)》我认为就是很好的书。

现在给我一个新的话题,我知道应该从什么角度去准备,更适合初学者,让初学者学习这个知识的曲线更加平滑、循序渐进,同时不把问题讲死,讲得很绝对。因为我已经有了很多的思考和讲解上的经验,我知道这个问题理解上的难点在什么地方,我应该设计什么样的问题去引导别人思考,想到思路。

万事开头难

刚开始的时候是很痛苦的,我记得这么一幕,我从自习室回到家的路上,脑子里就在想,就这些问题到底要做到什么时候,每一道题我都要做过去吗?但是现在回过头来看,其实都是坚持思考、总结和坚持练习的效果。

2017 年 9 月左右,我开始在 LeetCode 刷题(不是中文区「力扣」),不会做的问题我就在网上找,文字、视频都会有人出来分享,因为她们也是通过这种方式学习的。

2018 年 4 月左右,中文「力扣」上线了,我就在中文「力扣」刷题,2019 年 6 月左右,中文「力扣」开放了题解功能,我就在上面写题解,我最怀念那个时候,人很少,我和几个写题解的朋友互相之间的交流、点评都非常开心愉快,现在的题解区有点内卷的意思,一道题的题解上百篇,看都看不过来了,要想找到适合自己的,得费一点时间。

以前的文章和大家提到过,为什么我觉得《算法导论》好,那是因为入门以后我已经不需要兴趣驱动,并且我知道了哪一些知识是我想要的,所以我可以透过那些看起来枯燥无味的数学公式和伪代码去理解这本著作中对我有用的部分。

建立知识之间的联系

有一些算法和数据结构不是割裂开来的。就像最近我讲的「分治」「递归」「深度优先遍历」甚至我觉得「回溯」「动态规划」和它们也是一个体系的东西,我都把它们归纳为「拆分问题」与「组合问题的解」,说多了,我自己都信了。

建立知识之间的联系和总结概括的过程,对于绝大部分朋友来说,理解「算法设计的思想」和「解决问题的思路」是更关键的东西,而不是算法技巧。要让我归纳「算法与数据结构」中最重要的概念,我认为是「空间换时间」,我认为绝大多数的算法和数据结构干的事情都是在用空间换时间,如果时间不宝贵,时间不是问题,也许我们也没有必要学习算法

  • 「递归」把「拆分问题」与「组合问题的解」的顺序记在了「栈」中;
  • 所有的「数据结构」其实都是把数据结构放进了一个容器中缓存起来,并且定义了数据之间的联系,并且保持这个联系不变,这一点就是我们以前和大家介绍的循环不变量,也可以简单认为「保持了定义」。

所以我现在看一些问题,如果这个问题要求「常数空间」「

O(1)

空间」我就会认为这样的方法是反常规的方法,开阔一下视野,看看就行。

有问题不用马上弄清楚

我的问题清单里留了很多问题,这些问题我不打算马上弄清楚,我觉得也没有必要马上弄清楚。

事实上,它们从问题清单中消失有两种可能:

  • 以后的某个时间,我又开始思考这个问题,因为有了一些知识的积累和思考,唤醒了我解决这个问题的角度;
  • 后来我觉得这些问题不是我需要解决的问题以后,我就把它们从问题清单里删除了。

自己的感觉通常都不靠谱

我在和网友交流的过程中遇到最多的问题就是:别人发给我看一段代码,告诉我他认为这段代码应该是什么什么效果,但实际上是什么什么效果。我通常先不急着解释,把别人的代码复制到 IDEA 中,写一个测试用例,把变量的值打印出来看一下。

我在的微信刷题群里就有大佬分享过一个观点:绝大多数的问题都可以通过调试解决。

「自己的感觉通常都不靠谱」这句话我不知道是不是 liuyubobobo 老师的课上说的,但我一直在说这句话。我们以为的很多时候不是真实的,算法是可以通过「眼见为实」来验证自己的想法的

今天下午我还和网友讨论一个问题,我从两个角度解释了两遍,他最后告诉我是通过 Debug 解决的。

我用的最多的一个技巧还有打草稿(以前也讲过),我做题的时候旁边一定会放一张纸,把思考的过程写下来,这也是一种「空间换时间」的思想。整数乘法放在脑子里想就是困难题,但写在纸上就是简单题。方法要对,有的时候不可以偷懒,偷懒也许会走更多的弯路。

归纳核心思想

「力扣」上的很多问题代码量并不多,我对解题的要求是:思路一定要清楚。所以我会很努力地去总结解决一个问题的思路,以前和负雪明烛开讨论会的时候,我们想到一个点子,给每句话写一个「一句话题解」就很好呀。

我的题解下很多网友都会帮我归纳解这道问题最关键的一句话。

所以很多时候,我自己也在尝试总结,我现在写的题解都会有「解释题意」和「思路分析(或关键)」这两个模块,让看这个问题的题解的朋友可以一下子抓住这个问题的重点。网友和我讨论对一个算法和数据结构的理解,基本我都认同和鼓励,因为这没啥好挑刺的,即使有的时候他说得没那么准确,我觉得有一点点沾边,甚至是他打了一个很奇怪的比方,我都觉得非常棒,因为我的理解也不一定就完全正确和准确,我也有很多看不到的地方。我会尝试站在他的角度理解他对这件事情的认识。

整理代码

我都是在 IDEA 中整理代码的,因为 IDEA 可以帮助我发现很多低级错误,哪些变量没有用到,哪些变量声明早了,这就是我比较注意的地方。

还有变量的命名,函数的命名,要做到尽量不写注释,也能做到见名知义,这些都是我以前在北京一家公司的领导对我的影响。

整理代码的过程也是整理思路的过程,依然是一开始我肯定会模仿,你也可以认为我在抄代码,但是我一定要让自己抄懂,把原作者的代码思路理顺,不能是代码歪歪扭扭的。有一些网友把我的代码改了一下,觉得他那个样子写更好懂,他肯定是有了自己的思考。

现在对算法的态度

算法很重要,算法题很多时候并没有那么重要。学到的知识够用就好,如果以后用得上,再去学习。

我见到的最和谐的、小团体刷题群的状态是:群主最后宣布一声「鉴于所有人都上岸,此群解散,祝各位早日发财!」。

最早和我一起刷题的朋友现在很多都不刷题了,有很多朋友进了心仪的公司,我都为他们感到高兴,现在有些朋友只是把刷题作为一种爱好。所以我和刷题认识的朋友现在都不聊问题了,聊一点明星八卦,油盐酱醋。

最后分享一个理论,我觉得放在刷题这件事情上还是蛮适用的。

  1. 动机非常不纯:为了升职加薪、找工作,说白了就是为了钱啊,不是为了学习算法本身、提升算法思维、感受算法的美;
  2. 目标非常容易达成:做题得到通过,反馈很快,就很容易啊;
  3. 对自己的评价高到离谱:以前不会的问题、我觉得很难的问题,我居然做出来了,这多好啊;
  4. 进度管理适度宽松:有时间就刷一刷,没时间可以放一放;
  5. 努力追求乐趣:好玩我才学。

不知道今天是不是跑题了,不过我一开始就说了算法刷题路线了。并且也只是和大家随便聊聊天,这两天如果有时间,我会发一篇推送,标题初定为《算法和数据结构在我眼中的样子》,把我脑子里能想起来的样子,画给大家看,很轻松,全是动画和图片。

如果有什么漏掉的,大家有什么想让我分享的,也可以和我留言。

希望今天大家看得开心。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法不好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数次启动而未坚持
  • 从 2017 年 5 月开始
  • 选择合适的资料
  • 万事开头难
  • 建立知识之间的联系
  • 有问题不用马上弄清楚
  • 自己的感觉通常都不靠谱
  • 归纳核心思想
  • 整理代码
  • 现在对算法的态度
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档