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

目录

目录

前言

阶段一:还不熟悉至少一门编程语言,掌握的算法和数据结构较少(建议时长: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语言网 (dotcpp.com)]

  • PTA | 程序设计类实验辅助教学平台 (pintia.cn)

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

学习网站

C++:

学习教程

  • C++入门教程,C++基础教程(更新完毕) (biancheng.net)

  • C++11教程:C++11新特性大汇总 (biancheng.net)

  • C++入门教程(配套编程题库) - C语言网 (dotcpp.com)

  • STL教程:C++ STL快速入门(非常详细) (biancheng.net)(重点)

参考手册

  • cplusplus.com/reference/

  • C++ 标准库标头 - cppreference.com

  • 标准库标头 - cppreference.com

Python:

学习教程

  • Python基础教程,Python入门教程(非常详细) (biancheng.net)

参考手册

  • Python 语言参考手册 — Python 3.12.0 文档

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

学习收获

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

做题量

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

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

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

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

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

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

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

  • 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台

  • 题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 题库 - 蓝桥云课 (lanqiao.cn)

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

算法竞赛学习指南(分阶段)_第1张图片

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

刷题建议

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

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

算法竞赛学习指南(分阶段)_第2张图片

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

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

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

推荐书籍

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

算法竞赛学习指南(分阶段)_第3张图片

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

做题量

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

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

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

学习资源

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

  • OI Wiki - OI Wiki (oi-wiki.org)

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

  • 题单广场 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • [kuangbin带你飞]专题1-23 - Virtual Judge (csgrandeur.cn)

  • 能力全面提升综合题单 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

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

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

算法竞赛学习指南(分阶段)_第4张图片

学习收获

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

  • 200题 — 省二

  • 400题 — 省一

  • 600题 — 国三

  • 1000题 — 国二

  • 1500题以上 — 国一

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

竞赛训练

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

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

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

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

学习习惯

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

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

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

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

  • 善于使用ChatGPT,对于大部分不懂的知识点,ChatGPT一般都能给出很好的讲解(代码能力可能不是很好,但是仍然非常推荐,这也是笔者一直在用的学习工具)

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

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

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

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

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

你可能感兴趣的:(数据结构与算法,算法,数据结构,经验分享)