3000字干货经验分享,新手怎么学好算法和数据结构?

承志
承志
承志
19
文章
0
评论
2021-02-1911:41:21 评论 47 2432字
摘要

今天和大家聊聊算法和数据结构的提升问题,因为很多小伙伴找到我说自己即将面临面试或者是考研的机试,但是对于自己的实力没有信心,想问一问有没有什么提升的方法。所以今天就和大家简单分享一下我个人的一些经验心得。

一、刷题

首先要说的就是刷题,其实算法和数据结构也是一种技术,既然是技术那么练习自然是必不可少的。

但是很多人对于刷题并没有一个概念,乱刷一气,所以最终的结果是时间花了不少,但是带来的长进却不多。很多人因此非常气馁,对自己失去了信心。其实刷题是非常有技巧的,并不是打开LeetCode一阵猛刷就行的。

01 网站选择

我估计大家说到刷题首先想到的就是LeetCode,但老实讲尽管LeetCode名气很大,但是我个人认为它并不是很好的刷题平台,实际上acmer中的大牛往往也不刷LeetCode的(我在毕业之前就没有刷过)。因为LeetCode的Hard在acm里大部分也只能算是水题,而且LeetCode的难度分层做得很不好,Easy、Medium和Hard有时候并不能反映题目的真实难度。

另外一点是LeetCode当中考察的算法比较少,也相对基础,我至今刷了差不多两百题,来来回回就是那么几个算法。每一个算法都很少深入。当然对于想要找工作的同学来说问题不大,如果想要再钻研得深一些就不够了。

所以这里给大家推荐一些正规的算法练习的渠道,全都是免费的。一般这些算法练习的网站会被称作是OJ(online judge),也就是在线评测网站的意思。国内著名的OJ有很多,比如北大的poj,网址:poj.org。比如浙大的zoj,网址:https://zoj.pintia.cn/。再比如华中科大的hustoj,网址:hustoj.org,还有杭电的hduoj,网址:acm.hdu.edu.cn。多说一句,著名的Best Coder竞赛就是杭电搞的,其实就是模仿codeforces和topcoder的国内版本。但是是中文赛题。

上述介绍的都是国内的OJ,除了国内的国外的OJ也有不少,比如著名的codeforces和topcoder。topcoder的画风有些不太一样,会有一个专门的客户端,很多人上来就被劝退了。

总的来说OJ其实没必要选很多,选择自己比较喜欢的一两个就可以了。最早是北大的poj名气最大,最近华中科大和杭电迎头赶上,尤其是杭电的best coder比赛吸引了很多选手参加,题目质量也非常不错。

02 难度选择

先来和大家谈谈难度选择,我们在刷题的时候首先需要考虑的就是难度。我们自己大概在什么水平,能够做出来什么级别的题目,然后挑选比自己当前水平略微高一点点的题目进行锻炼,这样既不会太简单没有挑战,也不会太困难导致自己做不出来。

但是道理大家都会,真正实操可能还是不知道从何入手。其实有两个指标非常关键,我之前也在题解当中提到过一个是通过率一个是通过人数。我以ZOJ举个例子,大家看下下图:

3000字干货经验分享,新手怎么学好算法和数据结构?

这里的12题其实很能说明问题,像是1001这种全场通过万人以上的题目,不用看肯定是水题。如果对自己算法有信心其实可以没必要刷了,刷了带来的提升并不大。对于我而言,我可能会刷通过1000人左右的题,也就是说我自己的话这些题目当中只会选择1011和1012进行练习。

另外一个指标是通过率,比如1008题,虽然通过的人数有4000+看起来很多,但是通过率只有20%。说明这道题的难度不小,或者是有一些比较深的trick。那么在做这道题的时候就需要尤其小心,很有可能会被某一个 点卡住,并且卡很长时间。通过率一定程度上也可以反映题目的难度,结合通过人数一起看,基本上对于题目的情况就有了一个大概的了解。

大家可以在OJ当中选择一些做一做,找到自己的水平位置,大概能通过什么级别的题目,然后一点点调整自己的目标,这样刷题的效果才最好。

前面介绍的是刷题方法,这里要说的是学习方法。

我个人认为最有效果的其实不是刷题,而是专题训练。也就是说针对某一个专题进行深入的训练,把这个算法对应的一类问题从简到难做一遍。这样下来对于这个专题的理解必然会非常深刻,这样才算是真正把一个专题做透了,学透了。我们学了一堆算法,没有经过专门的练习,就指望要用到的时候能够超常发挥,这怎么可能呢?

但是专题训练怎么训练呢?我们怎么知道有哪些专题,专题当中有哪些题目呢?这个就需要前人大佬的总结和分享了,靠着菜鸟自己去准备专题训练是比较困难的。这里我推荐一个著名金牌大佬匡斌巨巨总结的专题训练,叫做kuanbin带你飞。网址:https://vjudge.net/article/187。

3000字干货经验分享,新手怎么学好算法和数据结构?

这当中一共有23个专题,当然有些专题非常难,不搞acm比赛的其实没有必要。但是其中的搜索和动态规划以及线段树专题都非常好,我自己是亲自动手练过的,做完之后感觉还是提升很明显的。

很多同学跟我说自己对于递归以及搜索算法理解不深刻,解决方法很简单,就是专题训练,如果你能把简单搜索和搜索进阶这两个专题刷完,那么估计大部分搜索问题都不再是问题了。

关于算法相关的书籍我之前推荐过,在知乎里也写过。很多人推荐看算法导论或者是算法什么的,我是非常不推荐的,因为这些书籍当中都只有理论没有实践。看完之后看似理论会了,但是距离真正能够应用还有很远。

所以对于新手而言,非常不推荐算法导论以及《算法第四版》这类书,可以在入门了之后用来巩固基础或者是当做工具书,不推荐硬啃作为学习工具。我个人推荐的话,还是这本:

3000字干货经验分享,新手怎么学好算法和数据结构?

我当年的acmer队友也推荐过这本,但我个人觉得这本难度稍稍大了一些,学习曲线相对比较陡峭。但是内容和质量都不错,是专业的算法竞赛教练写的。

3000字干货经验分享,新手怎么学好算法和数据结构?

算法领域还是偏小众,真正有实力的也都年薪很高,也不会为了一点小钱来写书分享,所以导致了市面上好的内容不多,这也是很无奈的事情。不过学习也并不一定要看书,其实好的博客和文章不少,当明确了当前要学习的算法之后,其实参考一些博客来学习也是不错的法子。

End.

爱数据网专栏作者:承志

作者介绍:前阿里人,推荐算法专家,一年更新400篇博文的勤奋作者

个人微信公众号:TechFlow(ID:techflow2019)

本文为挖数网专栏作者原创文章,未经允许禁止转载,需要转载请微信联系授权(微信号:lovedata0520)

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: