算法竞赛学习指南(分阶段)

目录

前言

阶段一:还不熟悉至少一门编程语言,掌握的算法和数据结构较少(建议时长:4周)

语言的选择

语言的学习

学习网站

学习收获

做题量

阶段二:熟悉一门语言,需要进一步提高自己的算法水平(建议时长:8周)

刷题建议

推荐书籍

做题量

阶段三:已经有了基础算法和基础数据结构的能力,需要更多的进阶知识(建议时长:4个月以上)

学习资源

学习收获

竞赛训练

学习习惯

阶段四:已经熟悉大部分数据结构与算法,希望掌握更多高阶知识


前言

什么是算法?程序 = 数据结构 + 算法。一个好的算法可以更高效率地解决问题

由于大家的算法水平不尽相同,所有需要根据每个人现阶段不同的能力来制定不同的学习计划。从下面选择一个你觉得自己目前的学习阶段(也可以根据你的做题量来选择):

阶段一:还不熟悉至少一门编程语言,掌握的算法和数据结构较少(建议时长:4周)

怎么才算是熟悉一门编程语言呢?至少给你一篇题解,你要能够看懂,然后是会用

语言的选择

算法竞赛首选的编程语言是C++,其次是Python(也有部分Java选手,如果你目前还没有明确的编程语言选择,不推荐选Java

C++之所以是首选语言是因为它有非常强大的库(STL),而Python的优点则是简单,易学,代码少。(C++还有一个不是它自身自带的优点,就是用C++的人很多,你可以很容能够以找到C++的题解,但是其它语言的题解并不一定有,简而言之就是C++的学习资源多

语言的学习

学习程序设计竞赛不需要掌握一门语言全部的知识,因为程序设计竞赛追求的是代码少,效率高,像C++的类(面向对象)的知识,就是你不需要去学的,因为在竞赛中,你根本不需要设计一个类,用数组都能代替。那么竞赛究竟需要学习一门语言的哪些知识呢?

以C++为例,你只需要学习基础语法,和STL就够了,其中STL(standard template library)是重中之中,它为你提供了许多的算法,以及容器,当你需要某个算法或者数据结构的时候,你只需要把库中给你写好的拿过来用就行了。而Python则是containers模块,和一些好用的语法需要重点关注

语言的学习一定要和做题结合着来

如果只学语言,不做题那么你学的知识都是死的,不会真正的掌握,这个阶段可以做一些简单的题来锻炼自己的语言能力,这里给出做题网站:

由于是初期阶段,难题肯定是不会做的,先做一些难度较低的题来锻炼自己的语言能力,如果不会写了,看题解即可

学习网站

C++:

学习教程

参考手册

Python:

学习教程

参考手册

网上好的教程还有资料有很多,这里不一一列举(也列举不完),可以找自己喜欢的看,看一两个就够了,也不用都学完,只用学需要学的就够了

学习收获

学习语言是基础,是程序设计的前提,那么学完一门语言后能获得什么奖项呢?以我参加竞赛的经历来看,当你对一门语言掌握熟练后,能够熟练地写出代码,蓝桥杯省三是没问题的,因为省三真的很水,我参加蓝桥杯获得了省二,而且预估做出来的题不超过4道(总共10道题),所以省三/省二还是很简单的。只要你有一个语言基础就够了

做题量

这一阶段做题量大概不到50道。

阶段二:熟悉一门语言,需要进一步提高自己的算法水平(建议时长:8周)

其实语言的学习也可以是和算法和数据结构的学习结合着来的,就是你可以这样理解:学习语言就是在学习数据结构与算法,学习数据结构与算法也是学习语言的过程

这里推荐一个很好的算法与数据结构入门的教程(也是我入门算法的地方):数据结构与算法教程,数据结构C语言版教程! (biancheng.net)

这个网站有的教程是要收费的,当然我们没必要付费(没钱),去网上找这个知识点的其它教程就OK啦,这个教程的代码都是以C/C++为基础的,如果你是Python选手,可以先学思想,然后再在其它地方找代码实现。

后面可以看这个更难的教程:算法竞赛教程 - C语言网 (dotcpp.com)(先找好理解的看,看不懂的先跳过)

对基本的算法与数据结构有一个基本的了解后,接下来要做的就是大量的做题了,做题是一个锻炼自己思维对已学知识强化理解的过程。这里推荐几个做题网站:

学习顺序可以按照这个流程图来:

这个阶段还是找相对简单,而且对算法和数据结构要求不高的题来做,锻炼编码能力

刷题建议

主要还是根据自己的能力来,有能力、有时间就多刷点。刷适合自己的题,怎么判断哪些是适合自己的题呢?

一个根本的判别标准就是它的难度:如果一个题你读完题之后很快就能想到思路,那就不要去刷它,浪费时间。反之,如果一个题你看完之后始终没有思路,想了半天、一天、甚至更多天还是没有思路,这说明这道题的难度显然不在你的能力范围之内,也就没有必要强求了,跳过它,等之后又思路了再来做。在LeetCode里面,这样的题会增加一个“尝试过”标签:可以筛选出来:

这些题就是你曾经试过但是当时没有做出来的题,可以以后再去解决。而在这两者难度之间(不简单,也不太难)的题就是你需要不断去做的题。

值得一提的是,一个好的刷题顺序也是可以帮助你提高学习效率的。最好是一个专题一个专题地去刷,因为在一个专题的刷题过程中,你可以更好地理解某个知识点的核心以及题型特点。这是至关重要的。因为这正是我们的刷题目的

一定要有善于看题解的习惯,对于不会的题,一个最好的办法就是看题解,如果题解看不懂,可以换一篇。如果是知识点不知道,那就去查阅相关算法知识。

这一阶段我强烈建议购买算法竞赛的书籍,因为只有书籍可以带你系统地学习算法竞赛

推荐书籍

这本书是所有的书里面最好的(上交大acm教练写的),如果不想买太多,可以只买这一套

其它书籍我不再做推荐了,有兴趣可以参考这个网站:学习资源 - OI Wiki (oi-wiki.org)

做题量

这一阶段推荐做题量在50~150道左右

阶段三:已经有了基础算法和基础数据结构的能力,需要更多的进阶知识(建议时长:4个月以上)

从这一阶段开始,你就算是真正进入算法竞赛的“门”了。也是从这一阶段开始,你所需要做的就只是:找题 -> 做题 -> 找题 -> …,或者:找题 -> 遇到不会的问题 -> 学习 -> 找题 -> …不断地重复这个过程。听起来很枯燥,但是这是提升能力的最好途径。做题的过程也是积累新知识,提升思维的过程。

学习资源

这里推荐一个知识点网站,非常全(其实不仅有知识点,还有学习指南)

有一个好的题单是必不可少的

每个题单的Part都对应一些知识,推荐有计划地去学和做(你可以选择两周做一个Part

下面再给出这个阶段的学习路线图:

学习收获

显然是做的题越多收获越大,这里给出一个刷题量和蓝桥杯奖项的大致对应关系:

  • 200题 — 省二

  • 400题 — 省一

  • 600题 — 国三

  • 1000题 — 国二

  • 1500题以上 — 国一

注意:这里的题量是对应适合你的难度的刷题量,如果你一直做简单题,不做难题来拔高自己,那刷题量这个纸面数据也就没用了。

竞赛训练

刷题是训练的过程,竞赛是检验的过程。推荐多去参加一些网站的在线竞赛来锻炼自己,也可以看到自己在全国或者全世界的rank。这里推荐两个,一个国内的一个国外的:(都是知名度较高的)

力扣竞赛:每周有周赛,每两周有双周赛:全球竞赛 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台

CF:Codeforces(需要一定的英语水平,要不然看不懂题)

还有很多很好竞赛网站,比如牛客竞赛、AtCoder等等。找一个自己喜欢的,坚持下来是最重要的。

学习习惯

除了好的学习资源外,养成好的学习习惯也是必不可少的。好的学习习惯有哪些呢?

  • 多去积累模板,积累模板是一个非常有意义的事情,它既是你学习的笔记,也是你比赛的工具(acm赛制下可以拿来用)

  • 多去和优秀的人交流,“他山之石,可以攻玉”,有时候你对一个问题没有好的思路,不如去请教大佬们。可以多在网上加一些算法学习的交流群之类的,和里面的伙伴一起交流问题。

  • 保持思考,学习算法是一个需要坚持的过程,你要有持续思考的习惯,这样你的思维能力才会有提升(就像你跑步需要锻炼一样),具体落实就是遇到难题了(能力范围内的)要坚持想下去。

  • 善于使用学习工具。比如近年大火的ChatGPT,对于大部分不懂的知识点,ChatGPT一般都能给出很好的讲解(代码能力可能不是很好,但是仍然非常推荐,这也是笔者一直在用的学习工具)。除此之外的学习工具就是一些好的网站,比如一些算法可视化的网站,对于很多抽象的算法,在这些网站中都可以找到非常直观的动画演示。非常适合新手过渡。

  • 多去看优秀的代码,比如你刚在CF或者牛客打完一场比赛,这时候你就可以打开排行榜查看他人的代码,尤其是排行前几名的大神的代码,你一定可以从中学到很多东西!哪怕是自己已经做出来的题也要看。因为学习他人的代码不仅是在学习它的代码内容,也是在学习它的代码风格一个好的的代码风格和对于解题效率的影响是巨大的!这点我想做题多的同学一定会深有体会。题解区也是一个非常主要的获取他人优秀代码的渠道。

阶段四:已经熟悉大部分数据结构与算法,希望掌握更多高阶知识

能达到这个阶段的人至少已经是全国排名前5%的人了。再往后其实就没有什么学习建议了,因为到了这个阶段的人已经对竞赛怎么学很熟悉了。

对于高阶知识的学习从来不是一件容易的事情,因为哪怕只是一个知识点都可能要花费你一周以上的时间去消化。大佬们的水平肯定比笔者要高(笔者其实水平并不高)。想要更高的成绩其实只是一个坚持时间长短的问题了,遇到难题不能放弃而是坚持把它想明白,这样才能突破瓶颈。

对于高阶知识的学习自然也需要更高阶的学习资源,其实上面已经列举过了(其中的比较难的知识就是高阶的知识)。继续努力地刷题吧~

一些心得

算法水平是一个合格程序员的“基本功”,因为它直接和一个人的编程水平相挂钩。一个能在算法上造诣很高的人,将来也一定能成为一位优秀的程序员。学习算法其实是个又枯燥但是又充满乐趣的过程,枯燥是因为学算法很难,常常要面对着枯燥的代码一坐做一天还没什么收获,有乐趣是因为当你学会一个新算法的时候,你很难不有一种获得感。算法真正的乐趣其实是它本身,而不是你能通过它获得什么成就。

最后附上一张自己整理的思维导图,全网最全!在文章顶部即可下载。

  • 37
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫谨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值