算法竞赛该如何准备学习?

240 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作者之路。

「算法才是编程的灵魂」

学习算法,切记不要一上来就开始啃《算法导论》,毕竟这本书并不适合新手学习,如果你之前的算法基础比较薄弱,只会一直陷在“拿起来又放下”的循环里。

入门方式

主要从学习路径,即学习内容的先后顺序,进行介绍,后面会有学习资料推荐。

1)C语言的基本语法

2)简单语法题

3)基本算法和数据结构

4)进阶的算法以及复杂数据结构

5)....

由于本文主要是概括性的,详细的入门方式,如果大家需要(文末点赞和在看数量多的话),也会单出一篇文章分享。

书籍推荐

1、《挑战程序设计竞赛 第2版》

作者巫泽俊,是ACM-ICPC世界总决赛冠军。

个人感觉比下面的《算法竞赛入门经典-第2版》好入门一点,可能是因为图解多一点吧。

2、《算法竞赛入门经典-第2版》

竞赛选手常称,紫书。

我认识的竞赛选手大多都看过紫书,很多厉害的选手,刷了很多上面的习题。

3、《算法竞赛入门经典-训练指南》

配合紫书食用,里面很多UVA的题目,有的题目比较难。

刷题网站

acwing, 洛谷,codeforces, atcoder, leetcode, c语言网

刷题注意

选择自己实力相当的, 注意刷题频率,要注意赛前加练,赛后总结, 赛后补题 最后,一切的比赛策略要建立在实力的基础上,实力不足,谈策略没有任何意义。

别一口气吃成一个大胖子

最近不能出门,闲置在家,麻麻总是要唠叨两句:看你这面黄肌瘦的,以后怎么肩负养家的责任呢,还不多吃点?

为了寒假能在家生存下去,我只得唯唯诺诺(狗头保命),疯狂“加餐”,第二天,我测量了我的体重,毫无变化,但是我的胃明显在抗议了。

看来,一口气是不能吃成一个大胖子的。

层层深入,是对初学者最友好的办法

对于初学者,我不太推荐一种叫做“深水学习法”的东西(本人并没有反对这种学习方法,只是认为对于初学者不太友好)

ps:深水学习法大概就是,让一个不太会游泳的人,直接跳到深水里去游泳,从而达到快速学会游泳的目的\

学习算法前,你首先必须掌握至少一门编程语言,不必精通。如果达到了这个要求,就请开始你的算法之路吧!

一、算法最最基础 1、时间复杂度2、空间复杂度

二、基础数据结构 1、线性表
列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。
2、栈与队列
栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用)
3、哈希表(必学)

4、树
二叉树:各种遍历(递归与非递归)(必学) 哈夫曼树与编码(原理与应用) AVL树(必学) B 树与 B+ 树(原理与应用) 前缀树(原理与应用) 红黑树(原理与应用) 线段树(原理与应用)
5、数组
树状数组 矩阵(必学)
三、各种常见算法 1、十大排序算法
简单排序:插入排序、选择排序、冒泡排序(必学) 分治排序:快速排序、归并排序(必学,快速排序还要关注中轴的选取方式) 分配排序:桶排序、基数排序 树状排序:堆排序(必学) 其他:计数排序(必学)、希尔排序 对于十大算法的学习,假如你不大懂的话,那么我还是挺推荐你去看书的,因为看了书,你可能不仅仅知道这个算法怎么写,还能知道他是怎么来的。推荐书籍是《算法第四版》,这本书讲的很详细,而且配了很多图演示,还是挺好懂的。
2、图论算法
图的表示:邻接矩阵和邻接表 遍历算法:深度搜索和广度搜索(必学) 最短路径算法:Floyd,Dijkstra(必学) 最小生成树算法:Prim,Kruskal(必学) 实际常用算法:关键路径、拓扑排序(原理与应用) 二分图匹配:配对、匈牙利算法(原理与应用) 拓展:中心性算法、社区发现算法(原理与应用) 图还是比较难的,不过我觉得图涉及到的挺多算法都是挺实用的,例如最短路径的计算等,图相关的,我这里还是建议看书的,可以看《算法第四版》。
3、搜索与回溯算法
贪心算法(必学) 启发式搜索算法:A*寻路算法(了解) 地图着色算法、N 皇后问题、最优加工顺序 旅行商问题
4、动态规划
树形DP:01背包问题 线性DP:最长公共子序列、最长公共子串 区间DP:矩阵最大值(和以及积) 数位DP:数字游戏 状态压缩DP:旅行商
5、字符匹配算法
正则表达式 模式匹配:KMP、Boyer-Moore
6、流相关算法
最大流:最短增广路、Dinic 算法 最大流最小割:最大收益问题、方格取数问题 最小费用最大流:最小费用路、消遣