不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

为什么要学习算法

开始这篇文章之前,我特别查了learnstudy的区别,虽然两者都表示学习,但当我查了learn 和study有什么区别?的结果后,决定用learn,因为我们学习算法肯定是要学有所得,而不是重视学算法的过程!

引用一些大佬的话(持续更新)

覃超

亮老师

大家好,我是陪伴大家7天学习的算法训练营助教,大家可以叫我亮老师,我学习算法多年,在大学阶段多次代表学校参加ACM竞赛,并取得铜奖,也曾获得过蓝桥杯个人赛国二,平常喜欢研究算法知识。7天的学习过程中有问题可以随时提问。

在开始学习之前,我想结合我自身学习算法和参加竞赛的经验,以及作为助教期间的心得体会,和你一起聊一聊算法的重要性和如何高效学习算法,希望能对你的学习有所帮助。 算法为什么重要呢?

我想一千个程序员有一千种理解,首先它是面试的敲门砖,每期训练营都有很多同学通过算法训练营的学习成功的进入了大厂,在座的各位我相信不少人也是基于此考虑报名参加。其次我想用以下几点说明算法的重要性:

如果不熟悉复杂度分析,如何做容量规划?

如果不清楚B+树, 又如何能够真正理解innodb的索引,并对查询过程了如指掌?

如果不能理解hash算法帮助我们如何在O(N)时间复杂度解决两数和的问题,又怎么能有信心去理解redis的hash结构在短链接生成等各种场景下实践?

等等

其实比如mysql、redis、es等等这些开源项目中的很多核心细节,都能从leetcode算法题目中找到影子,如果我们有足够的理论知识,可以帮助我们比较快的理解,否则,将寸步难行甚至根本找不到重点。所以,我认为, 算法不仅仅是面试的敲门砖,更是理解优秀中间件,甚至有一天自己造轮子的,不可缺少的工具。

反过来讲,学习好算法知识,才能帮助更快的真正理解优秀的开源实现,才有机会将这些宝贵的资源为我所用,而不是任其牵引,即使它也许并不是一个好的实现,我们仍然没有一个评价和拒绝的能力。相反可能会在写bug,解决bug的循环中悲壮前行。

同时,这也提示我们如果觉得自己掌握了某个算法,可以回溯到相关的开源工程实践中,看看大牛们如何优化我们朴素的算法实现, 另外业界大牛又是如何做到物尽其用,有了这个过程我相信你再也不会怀疑算法的作用。所以,从今天起我们一起来学习算法,也是给自己一个向大牛们学习的机会,给自己一个真正掌控各种业务和技术要点的机会。

说完为什么学算法,接下来我们聊聊怎样学习算法。条条道路通山顶,雄鹰可以直接飞过去,但是蜗牛也可以爬过去。我自认为是蜗牛,结合我见过的几届学员学习方法给大家分享以下几点:

  • 第一,摆正态度,正视问题。目前我们接触到的算法虽然基本上都能在二三十行解决,这意味着它不难被跟踪甚至以为理解,当然我们可以在战略上藐视它,但是也因为如此,也更容易轻视它,觉得自己懂了,其实自己想的并不全面甚至是错误的,所以需要我们重视它,通过交流、通过集体的力量、通过反复回忆、通过挖掘相关题型、通过总结等等,最终,想全了、记深了、也理解透了;

  • 第二,理论和实践要两条腿走路。理论部分就是老师的视频,要反复听,每个知识点要十分熟悉,不明白的地方在群里提出来;实践部分就是老师讲过的经典习题和布置的作业要落地到实践,亲自做一做,同时千万不要忘了过遍数,另外平时经常回过头看看自己的代码,也很有效;

  • 第三,高质量的完成。开课之后,你会发现习题的数量很多,但是希望大家采用五毒神掌方法练习题目,题不在多,有精则灵,另外千万别死磕,给自己一个时间限制,好多学员“一副我最牛逼,这题目一定能拿下”从而花费大量时间,但如果你认真听老师的课程就知道这样是没有必要的;

  • 第四,多讨论多交流多提问。这个是融会贯通的机会,可以是组员,也可以是老师或者助教,有任何问题都不放过,一定要抓好班级群,小组群这个平台,跟大家一起交流相互学习提升,每期班主任都会组织学员做社群分享,也欢迎大家到时在群里分享你的学习经验、面试经验、工作心得等等;

  • 第五,蓦然回首那题却在 灯火阑珊处。曾经的你众里寻它千百度,所以来到这里。我坚信通过以上付出,通过7天的努力,养成刷题习惯不畏惧刷题,等到毕业以后,再来复盘这段时间的收获,一定不同往日。

我的各阶段学习算法的目的

  • 高中:没啥感觉,就是觉得有趣;
  • 大学:赚钱,因为学院非常鼓励那些参加竞赛的学生,省一会给4000元的奖金,所以我当时参加一次算法竞赛,把我一学年的学费+住宿费+伙食费全部付清了;
  • 职场(大学毕业五年内):接触更牛逼的大佬&更高的薪资。
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!