前置内容1:算法与数据结构

我是研究僧i 提交于 2019-12-06 08:42:38

信息学竞赛的主要考点就是算法与数据结构。

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

简单来说,算法用于解决一个具体的问题,应该具有几个性质:确切性,有限性,输入输出,可行性。

也就是说,一个算法应该首先是确定的,而不是模棱两可的;其次是可以在有限的时间和步数内完成;另外需要有输入和输出(输入可以没有,但输出必然需要);所有的基本操作都是可以完成的。

属于OI范围的算法主要包括:

  1. 基本算法:包括枚举,模拟,贪心,二分,排序等。它们是其他算法或数据结构的基础;
  2. 搜索算法:包括深度优先搜索(DFS),广度优先搜索(BFS)及其优化。搜索是比较接近暴力的算法,但是又有很多优化型内容,例如迭代加深搜索(ID-DFS),A*算法等,在NOIP普及组和提高组中非常重要;
  3. 动态规划(DP):包括线性动态规划,多维动态规划,树形动态规划,状态压缩动态规划,图论动态规划等,还有一些拓展的类型,如期望DP,插头DP,数位DP,动态DP等。动态规划是较难的算法,无论是什么等级的比赛中动态规划都是极其重要的;
  4. 图论算法:包括最短路算法(SP),最小生成树(MST),拓扑排序,无向图的割边和割点,有向图的强连通分量(SCC),二分图匹配,还包括网络流中的最大流,最小费用最大流等。图论算法是一个比较新的领域,从易到难有很多板块,也很重要(尤其在NOIP提高组中图论算法所占分值很大,不过NOIP普及组极少考到图论题目);
  5. 树相关算法:包括最近公共祖先(LCA),轻重链剖分,点分治算法,树上差分,树形动态规划等。这部分算法通常与动态规划和高级数据结构共同作为比赛中的主要考点,以NOIP提高组2018为例,六道题中有三道题以树为主;
  6. 字符串算法:包括KMP匹配,Manacher回文串算法,后缀排序,最长公共前缀(LCP)等,通常与字符串数据结构结合,NOIP基本不考,而省选和更高级比赛中通常会有字符串算法的题目;
  7. 数学算法:包括数论,组合数学,线性代数,概率期望,博弈论,计算几何,多项式理论等。其中数论中包括欧拉定理/费马小定理/裴蜀定理等著名数论定理,BSGS算法,扩展欧几里得算法,乘法逆元和莫比乌斯反演等内容;组合数学中主要包括卢卡斯定理,斯特林数,容斥原理等内容;线性代数主要包括高斯消元,线性空间,线性基,矩阵乘法,矩阵递推等;计算几何研究坐标系中的几何对象,包含凸包,向量乘法,旋转卡壳,半平面交等内容;多项式理论的核心是快速傅里叶变换。数学类算法与数学关系紧密,通常不作为NOIP考点(除少量数论基础内容),主要在省选和更高级比赛中出现。

从某种意义上说,数据结构也是由算法构建起来的。

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

简单来说,数据结构就是将一系列数据组织联系起来的方式,设计好的数据结构可以大幅度提高计算效率。数据结构以算法为基础,而数据结构也可以反过来优化算法的效率。

属于OI范围的数据结构主要包括:

  1. 线性数据结构:包括数组,栈,队列,链表,双端队列等,单调栈,单调队列等优化数据结构也属于线性数据结构。特点是每一个数据有一个前驱和后继,通过一条链的形式组织数据。单纯的这类数据结构在NOIP普及组可能会考,更高级别竞赛中通常会和算法结合;
  2. 树形数据结构:包括Trie字典树,并查集,哈夫曼树等。树是一种非线性的数据结构,和图论中的树不完全相同,一个结点可以对应多个后继(子结点),但除根结点外每个结点有且只有一个父结点;
  3. 二叉树结构:包括二叉堆,左偏树,线段树,二叉索引树(BIT,树状数组,它也可以理解为普通的树形结构),二叉查找树(BST),各种平衡树(Treap,无旋Treap,Splay,替罪羊树,AVL,红黑树等),0-1Trie,以及上述数据结构的可持久化版本。二叉树结构可以说是最重要的一类数据结构,大量的高级题目都需要用它们来维护,其中线段树,平衡树尤其重要;
  4. 辅助型树形结构:包括动态树(LCT),支配树,最短路树,最小割树,圆方树,K-DTree等。不常见(除LCT外),通常解决树或图论的一类特殊问题;
  5. 块状数据结构:包括块状数组(分块),块状链表以及各种分块维护型的数据结构。分块可以解决非常多样的问题,可扩展性极强,很多其他数据结构的功能也可以使用分块来完成,但是复杂度较高;
  6. 其他:包括处理字符串问题的AC自动机,后缀自动机(SAM),后缀数组(SA),回文自动机(PAM),也包括一些处理询问的离线数据结构如cdq分治,整体二分,莫队等。其中后缀数组,后缀自动机,cdq分治,莫队等数据结构较为重要,但这些数据结构通常不在NOIP中出现,只会在省选及以上竞赛中出现。

当然,这么多算法和数据结构也不是一下子能学完的,而且还不断有新的算法与数据结构被发明。对于不同的等级,有不同的掌握要求。

对于NOIP普及组水平,掌握枚举、模拟、线性数据结构等基础可以保证你做对第1-2题,而掌握搜索,动态规划(当然是基础动归),贪心,二分和很简单的几种树形结构就可以在3-4题也拿到不错的成绩。

对于NOIP提高组水平,要补的就多一些,尤其是树相关算法和二叉树结构,树是当前提高组考题趋向的一个主流,而同时图论也是非常重要的,掌握这些与图和树有关的内容非常重要,同时结合更加难的动态规划,可以在提高组中答对3-4题左右(还得看发挥和运气...),通常D2T2是一道数学题,所以适当学一些简单数论和组合数学也可以帮你在提高组加分。

省选/NOI比提高组难得多了,基本上面提到的所有内容都会出现,相比提高组而言增加了字符串算法和字符串数据结构(字符串一般是省选/NOI的大难题,不把SA或SAM这种东西搞清楚很难做出来),同时对于高级数据结构要求也提高很多,例如平衡树,可持久化线段树,可持久化平衡树,可持久化0-1Trie,cdq分治,莫队等,同时图论的难度也大幅提高,考到二分图和网络流等复杂的专题(如果考到SCC或DCC还算简单...),另外数学方面也有难度提升,不过有时却可能根本不考数学题,考到也通常是一些概率期望/博弈论神题或莫比乌斯反演。动态规划和树上问题主要是一个强化,难度上有增强。强省的省选还可能加入计算几何,多项式理论,仙人掌树等非常复杂的内容,不过弱省(包括上海)一般不考。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!