数据结构(省选必须掌握)

合集下载

吉林省专升本数据结构习题及答案——第四章

吉林省专升本数据结构习题及答案——第四章

吉林省专升本考试数据结构分章习题及参考答案———选择题(第四章)1、多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为( )。

A、数组的元素处在行和列两个关系中B、数组的元素必须从左到右顺序排列C、数组的元素之间存在次序关系D、数组是多维结构,内存是一维结构2、串的长度是()A、串中不同字母的个数B、串中不同字符的个数C、串中所含字符的个数D、串中所含字符的个数,且大于03、串与普通的线性表相比较,它的特殊性体现在()。

A、顺序的存储结构B、链式存储结构C、数据元素是一个字符D、数据元素任意4、若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1……n(n+1)/2]中,则在B中确定aij(i<j)的位置k的关系为( )。

A、i*(i-1)/2+jB、j*(j-1)/2+iC、i*(i+1)/2+jD、j*(i+1)/2+i5、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。

A、60B、66C、18000D、336、若6行8列的数组以列序为主序顺序存储,基地址为1000,每个元素占2个存储单元,则第5行第3列的元素(假定无第0行第0列)的地址是()。

A、 1086B、 1032C、 1068D、答案A,B,C都不对7、下面的说法中,不正确的是()A、数组是一种线性结构B、数组是一种定长的线性结构C、除了插入与删除操作外,数组的基本操作还有存取修改、检索和排序等D、数组的基本操作有存取、修改、检索和排序等,没有插入与删除操作8、设有一个n*n的对称矩A,将其下三角部分按行存放在一维数组B中,而A[0][0]存放于B[0]中,那么第i行对角线元素A[i][i]存放于B中( ) 处。

A、(i+3)i/2B、(i+1)i/2C、(2n-i+1)i/2D、(2n-i-1)i/29、设模式T=“abcabc”,则该模式的next值为()A、{-1,0,0,1,2,3}B、{-1,0,0,0,1,2}C、{-1,0,0,1,1,2}D、{-1,0,0,0,2,3}10、下面()不属于特殊矩阵。

2021-2022学年浙江省杭州地区(含周边)重点中学高二(下)期中信息技术试卷+答案解析(附后)

2021-2022学年浙江省杭州地区(含周边)重点中学高二(下)期中信息技术试卷+答案解析(附后)

2021-2022学年浙江省杭州地区(含周边)重点中学高二(下)期中信息技术试卷1. 小华家门口有条小河,他想知道小河的宽度,决定用勾股定理来求解。

于是他在河岸边选取点A、点B、点C、点D,测得相关数据如图所示,最后求得小河宽度15m。

下列说法正确的是( )A. 上述表述中的30是数据,数据就是数字,本身没有意义B. ∠CAD=30°表示直线AC与河岸线形成的夹角为30度,这是知识C. 勾股定理是数学家通过归纳、演绎等手段对信息进行挖掘后形成的知识D. 用勾股定理求小河宽度是智慧的体现2. 下列有关大数据说法正确的是( )A. 学籍系统中存放着大量的学生数据,这些数据属于大数据B. 电商的个性化推荐体现了不强调事物的因果关系,而是注重它们相关性的大数据思维C. 分析全体数据,从而揭露隐藏在数据下的详尽信息是大数据处理的基本思想D. Hadoop是-一个分布式系统基础架构,适用于实时数据的批处理计算3. 下面有关数据结构的说法不正确的是( )A. 在程序设计中,数据结构设计时主要考虑对象之间逻辑关系的实现B. 链表结构适用于初始规模确定但在处理过程中频繁进行插入、删除操作的问题C. 数组结构中的数据访问效率要高于链表结构D. 大多数软件中都有“撤销”功能,在撤销操作中内部依托的数据结构是队列4. 一个十进制数m转化为十六进制数,其末位是“C”,下列说法正确的是( )A. m除以8的余数一定是4B. 无法判断m能不能被4整除C. 该数可能是个奇数D. 若该十进制数表示的是一个 ASCII码,则其最大值是2525. 录制一段时长为4:16的双声道音频,采样频率为44.1kHZ,量化位数为2个字节。

若不进行压缩,则存储容量约为( )A. 43MBB. 21.5MBC. 5.4MBD. 2.7MB6. 扫地机器人事先并不知道场所布局和物品摆放,是在运动中不断从环境中学习,经过一段时间的交互,就可获悉环境的全貌。

吉林省专升本数据结构习题及答案——第八章

吉林省专升本数据结构习题及答案——第八章

吉林省专升本考试数据结构分章习题及参考答案———选择题(第八章)1、若数据元素序列{11,12,13,78,9,23,4,5}是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是( )A、冒泡排序B、插入排序C、选择排序D、归并排序2、若将两个各有n个元素的有序表归并成一个有序表,则最少比较次数是()。

A、 nB、 2*n-1C、 2nD、 n-13、已知数据表中每个元素距其最终位置不远,则采用()方法最节省时间A、堆排序B、插入排序C、快速排序D、直接选择排序4、下列排序算法中,()算法可能会出现下面情况:在后一趟开始之前,所有元素都不在其终的位置上。

A、堆排序B、冒泡排序C、快速排序D、插入排序5、下述几种排序方法中,要求内存量最大的是()。

A、插入排序B、快速排序C、归并排序D、选择排序6、就排序算法所用的辅助空间而言,堆排序,快速排序,归并排序的关系是()A、堆排序<快速排序<归并排序B、堆排序<归并排序<快速排序C、堆排序>归并排序>快速排序D、堆排序>快速排序>归并排序7、快速排序方法在( )情况下最不利于发挥其长处。

A、要排序的数据量太大B、要排序的数据中含有多个相同值C、要排序的数据已基本有序D、要排序的数据个数为奇数8、对关键字由大到小进行冒泡排序,在下列()情况下比较的次数最多。

A、从小到大排序B、从大到小排序C、元素无序D、元素基本有序9、对5个不同的数据元素进行直接插入排序,最多需要进行()次比较。

A、 8B、 10C、 15D、 2510、如果只想得到1000个元素组成的序列中第5个小元素之前的部分排序的序列,用()方法快。

A、起泡排序B、快速排列C、堆排序D、简单选择排序11、设有1000个无序的元素,希望用最快的速度挑选出其中前十个最大的元素,在以下的排序方法中采用哪一种最好?()A、快速排序B、归并排序C、堆排序D、基数排序12、下列排序算法中,()可能会出现下面情况:在最后一趟开始之前,所有元素都不在最终位置上。

数据结构1-3习题

数据结构1-3习题

第1章绪论1.1选择题1. 算法的时间复杂度取决于()A)问题的规模B)待处理数据的初态C)A和B2.计算机算法指的是解决问题的步骤序列,它必须具备()这三个特性。

A)可执行性可移植性可扩充性B)可执行性、确定性、有穷性C)确定性、有穷性、稳定性D)易读性、稳定性、安全性5.从逻辑上可以把数据结构分为()两大类。

A)动态结构、静态结构B)顺序结构、链式结构C)线性结构、非线性结构D)初等结构、构造型结构6.在下面的程序段中,对x的赋值的语句频度为()for(i=0;i<n;i++)for(j=0;j<n;j++) x=x+1;A)O(2n) B)O(n) C.O(n2) D.O(log2n)7.下面的程序段中,n为正整数,则最后一行的语句频度在最坏情况下是()for(i=n-1;i>=1;i--)for(j=1;j<=i;j++)if (A[j]>A[j+1])A[j]与A[j+1]对换;A. O(n)B)O(nlog2n) C)O(n3) D)O(n2)1.2填空题2. 对于给定的n个元素,可以构造出的逻辑结构有_____________,_____________,_____________,_____________四种。

4.数据结构中评价算法的两个重要指标是_____________。

5. 数据结构是研讨数据的_____________和_____________,以及它们之间的相互关系,并对与这种结构定义相应的_____________,设计出相应的_____________。

6.一个算法具有5个特性:_____________、_____________、_____________,有零个或多个输入、有一个或多个输出。

9.已知如下程序段for(i=n;i>0;i--) {语句1}{ x=x+1; {语句2}for(j=n;j>=i;j--) {语句3}y=y+1; {语句4}}语句1执行的频度为_____________;语句2执行的频度为_____________;语句3执行的频度为_____________;语句4执行的频度为_____________。

吉林省专升本数据结构习题及答案——第六章

吉林省专升本数据结构习题及答案——第六章

吉林省专升本考试数据结构分章习题及参考答案———选择题(第六章)1、在一个有向图中,所有顶点的度入之和等于所有顶点的出度之和的( ) 倍。

A、1/2B、1C、2D、42、一个具有n个顶点的有向图最多有()条边。

A、n×(n-1)/2B、n×(n-1)C、n×(n+1)/2D、n23、在一个具有n个顶点的无向图中,要连通全部顶点至少需要( )条边。

A、nB、n+1C、n-1D、n/24、在一个图中,所有顶点的度数之和等于图的边数的( )A、1/2B、1C、2D、45、为便于判别有向图中是否存在回路,可借助于()。

A、广度优先搜索算法B、最小生成树算法C、最短路径算法D、拓扑排序算法6、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。

A、1/2B、1C、2D、47、对于有n个顶点、e条边且使用邻接表存储的有向图进行广度优先遍历,其算法的时间复杂度是( )。

A、O(n)B、O(e)C、O(n+e)D、O(nxe)8、在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则下列情形不可能出现的是()。

A、G中有弧<Vi,Vj>B、G中有一条从Vi到Vj的路径C、G中没有弧<Vi,Vj>D、G中有一条从Vj到Vi的路径9、用邻接表表示图进行深度优先遍历时,通常借助( ) 来实现算法。

A、栈B、队列C、树D、图10、具有n个顶点的有向图最多有( ) 条边。

A、nB、n(n-1)C、n(n+1)D、n211、下面哪一方法可以判断出一个有向图是否有环(回路):A、深度优先遍历B、拓扑排序C、求最短路径D、求关键路径12、3下列关于AOE网的叙述中,不正确的是()。

A、关键活动不按期完成就会影响整个工程的完成时间B、任何一个关键活动提前完成,那么整个工程将会提前完成C、所有的关键活动提前完成,那么整个工程将会提前完成D、某些关键活动提前完成,那么整个工程将会提前完成13、图的BFS生成树的树高比DFS生成树的树高( )A、小B、相等C、小或相等D、大或相等14、任何一个无向连通图的最小生成树。

计算机专业基础综合(数据结构)模拟试卷8(题后含答案及解析)

计算机专业基础综合(数据结构)模拟试卷8(题后含答案及解析)

计算机专业基础综合(数据结构)模拟试卷8(题后含答案及解析) 题型有:1. 单项选择题 2. 综合应用题单项选择题1-40小题,每小题2分,共80分。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

1.若某线性表中最常用的操作是在最后一个结点之后插入一个结点和删除第一个结点,则下面最节省运算时间的存储方式是( )。

A.单链表B.带有头指针的单循环链表C.双链表D.带有尾指针的单循环链表正确答案:D解析:在链表中的最后一个结点之后插入一个结点要知道终端结点的地址,所以,单链表、带有头指针的单循环链表、双链表都不合适。

考虑在带有尾指针的单循环链表中删除第一个结点,其时间性能是O(1),所以答案是D。

知识模块:数据结构2.已知两个长度分别为l和s的降序链表,若将它们合并为一个长度为l+s 的升序链表,则最坏情况下的时间复杂度是( )。

A.D(l)B.D(ls)C.D(min(l,s))D.D(max(l,s))正确答案:D解析:在合并过程中,最坏的情况是两个链表中的元素依次进行比较,比较的次数最少是m和n中的最大值。

知识模块:数据结构3.线性表中存放的主要是( )。

A.整型常量B.字符C.数据元素D.信息元素正确答案:C解析:线性表中主要存放的是数据元素,而数据元素可以是整型也可以是字符型,但对于一个线性表来说,所有的数据元素的类型必须相同。

知识模块:数据结构4.下面的叙述中正确的是( )。

I.线性表在链式存储时,查找第i个元素的时间同i的值成正比Ⅱ.线性表在链式存储时,查找第i个元素的时间同i的值无关Ⅲ.线性表在顺序存储时,查找第i个元素的时间同i的值成正比A.仅ⅠB.仅ⅡC.仅ⅢD.Ⅰ、Ⅱ、Ⅲ正确答案:A解析:在线性表链式存储结构中,查找第i个元素的时间与i的位置成正比。

而在顺序存储结构中查找第i个元素的时间与i的位置无关。

知识模块:数据结构5.对于某线性表来说,主要的操作是存取任一指定序号的元素和在最后进行插入运算,那么应该选择( )存储方式最节省时间。

山西省2018年专升本选拔考试(C程序设计数据结构)历年真题详解

山西省2018年专升本选拔考试(C程序设计数据结构)历年真题详解说明:本试题分C程序设计和数据结构(C语言版)两部分,各占100分,满分200分,考试时间150分钟。

第一部分C程序设计一、单项选择题( 本大题共10小题,共小题3分,共计30分,在每小题的四个备选答案中,只有一个答案是正确的,请将代表正确答案的字母填入下列表格内)1.在每个数据声明和语句的最后一个必须有一个(A)A.分号B.逗号C.顿号D.句号2.合法的字符常量是(D)A.5B."D”C.’\081'D.’\t’3.已知“int b=5".则执行“int a=(b= =5);"后,a的值是(C)A5 B.0 C.1 D.24.已知" int a,b,s;",对于语句“scanf ("a=%d,b=%d,c=%d”,&a, &b, &c);” ,能够正确为变量值的输入是(B)A.1 3 2B.a=1,b=3,c=2C.a=1 b=3 c=2D.a=1,b=3,c=25.若存在语句”int a; " ,则表达式(a= =1)|| (a!=1)的值是(B)A.0B.1C.2D.不确定6.关于break相continue语有叙述正确的是(A)A. continue语句只结束本次循,但不能够结束整个循环执行B. continue语句只结束本次循环,且同时结束整个循环执行C break语句月结束本次循环,但不能够结束整个循环执行D.内循环中的break语句可以结束整个外循环的执行7.已知"int a[10]={1,2,3,4};”,则a[4]的值是(C)A.4B.3C.0D.不确定8.设有语句“double a[5],*p=a;",则与数组元素a[3]等价的是(B)A.( *p)[3] B. *(p+3) C. *p[3] D. *p+39.下列语句正确的是(D)A.char s{20};s={”C Language”}B.char s{20};s=”C Language”;C.char *s;s={”C Language”};D.char *s;s=”C Language”;10.下列叙述正确的是(A)A.一个自定义函数中可以根据不同情况设置多条return语句B.一个自定义函数中必须有一条return语句C.定义为void类型的函数中可以有带返回值的return语句D.没有return语句的自定义函数在执行结束时不能返回二、填空题(本大题共8小题,每空3分,共计24分。

吉林省专升本数据结构习题及答案——第二章

吉林省专升本考试数据结构分章习题及参考答案———选择题(第二章)1、将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。

A、nB、2n-1C、2nD、n-12、假设线性表只有四种基本操作,删除第一个元素;删除最后一个元素;在第一个元素前插入新元素;在最后一个元素后插入新元素,则最好使用( )A、只设尾指针的循环单链表。

B、只设尾指针的非循环双链表。

C、只设头指针的循环双链表。

D、同时设置头指针和尾指针的循环单链表。

3、已知一个顺序存储的线性表,设每个结点需要占m个存储单元,若第一个结点的地址为da,则第i个结点的地址为:()A、 da+(i-1)*mB、 da+i*mC、 da-i*mD、 da+(i+1)*m4、线性表是具有n个()的有限序列(n>0)。

A、表元素B、字符C、数据元素D、数据项5、创建一个包括n个结点的有序单链表的时间复杂度是( )。

A、O(1)B、O(n)C、O(n2)D、O(nlog2n)6、从表中任一结点出发,都能扫描整个表的是()。

A、单链表B、顺序表C、循环链表D、静态链表7、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入一个结点s,则执行()。

A、s->next=p->next;p->next=s;B、p->next=s->next;s->next=p;C、q->next=s;s->next=p;D、p->next=s;s->next=q;8、以下说法错误的是()。

A、求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低B、顺序存储的线性表可以随机存取C、由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活D、线性表的链式存储结构优于顺序存储结构9、在非空线性链表中p指向的结点后面插入一个q指向的结点,应依次执行()A、q->next=p;p->next=q;B、q->next=p->next;p->next=q;C、q->next=p->next;p=q;D、p->next=q;q->next=p10、线性表的链接实现有利于()运算。

《数据结构》填空作业题(答案)

《数据结构》填空作业题答案第1章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。

2.程序包括两个内容:数据结构和算法。

3. 数据结构的形式定义为:数据结构是一个二元组: Data Structure =(D,S)。

4. 数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。

5. 数据的逻辑结构可以分类为线性结构和非线性结构两大类。

6. 在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。

7. 在树形结构中,数据元素之间存在一对多的关系。

8. 数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。

9. 数据的逻辑结构包括线性结构、树形结构和图形结构 3种类型,树型结构和有向图结构合称为非线性结构。

10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。

11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。

12. 数据的存储结构可用4种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。

13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。

14. 数据结构在物理上可分为顺序存储结构和链式存储结构。

15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。

16. 数据元素可由若干个数据项组成。

17. 算法分析的两个主要方面是时间复杂度和空间复杂度。

18. 一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。

19. 算法具有如下特点:有穷性、确定性、可行性、输入、输出。

20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。

山西省2015年专升本选拔考试(C程序设计数据结构)历年真题详解


main()
{int i,sum=0,a[10];
float p;
//类型定义正确,得3分
for (i=0;j<10;i++)
{
scanf("%d",&a[i]); //数据正确读入,得4分
sum=sum+a[i];
}
p=sum/10; //平均分计算正确,得4分
sum=0;
for (i=0;i<10;++)
10.下列定义语句不正确的是( C )
A.double x[5]={2.0,4.0,6.0,8.0,10.0}; B.char c1[]={‘1’,‘2’,‘3’,’4’, ‘5’,‘1’}; C. int yf[5]=(0,1,3,5,7,9); D.char c2[]={‘\10’,’\xa’,’\x8’};
3.假设定义 int x,y;且执行scanf("%d%3d",&x,&y) ;语句时,从第一列开始输入数据1234 56789<回车 >,则x和y的值分别是( A ) A.1234 567 B.1234 56789 C.1 234 D.1234 89
4.执行下面程序时,将M,N分别赋给c,d,正确的输入
山西省2015年专升本选拔考试(C程 序设计数据结构)历年真题详解
第一部分C程序设计
一、单项选择题(本大题共10小题,每小题1分,共计10分)
1.下列标识符中,不合法的标识符是( B )
A.CHAR B.-ab C.Sum D.a_b
2.下列不是合法字符常量的是( B ) A.'+' B. "m" C.'?' D.'6'
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构线性数据结构栈队列字符串串树形数据结构树状数组可并堆线段树并查集平衡树动态树函数式线段树分块分块与树有关的算法算法标记维护标记

栈:栈的应用非常广,如递归调用的就是系统栈。栈具有后进先出的特点,即对于栈的操作只有对于栈顶元素的操作,所以我们只需用一个指针指向栈顶就够了。

基本操作:(设栈顶指针为top,栈为d[])入栈:;提取栈顶元素:x=d[top],top--;判断栈是否为空:returntop>0;由于栈的后进先出的规则,在处理一些问题时,栈有很重要的作用:

例:中缀表达式->后缀表达式我们平时见到的表达式都是中缀表达式,而计算机是无法直接处理这种表达式的,因为运算顺序不是严格的从左到右,还有括号,优先级等限制,而后缀表达式则没有这种问题,对于一个后缀表达式,计算机只需不断的读取元素,然后根据元素出现的顺序进行运算,下面举个例子:中缀表达式:(4+3*5)*(5-2)后缀表达式:435*+52-*后缀表达式的运算:对于后缀表达式,我们采取以下策略:若遇到数,则直接压栈,遇到运算符,则将栈顶的两个数取出来,通过这个运算符进行运算,然后将运算结果压栈,最后栈中剩下的元素就是结果。下面说一下如何将后缀表达式转为中缀表达式:首先,我们要将运算符之间的优先级确定出来,如+和-是平级的,*和/是平级的且优先级大于加和减,(优先级高于所有的,)优先级低于所有的,我们将数和运算符分开放置,遇到运算符就进行压栈,如果该运算符优先级高于栈顶的,说明该运算符要先算,所以直接压,而如果该运算符优先级低于栈顶的运算符,则要先算栈顶的运算符,就将栈顶元素不断退栈直到栈顶元素的运算符优先级小于等于当前要进栈的运算符,左右括号直接退栈但不加入后缀表达式。

栈的优化——双栈操作。现要维护两个栈,两个栈的元素个数总和不大于3S,但一个栈内的元素个数可能达到2S以上,而现在只能开最大4S的栈空间,问如何解决。由于一个栈内的元素可能超过2S个,所以一个栈只开2S个是不够的,这时我们注意到总元素个数不超过3S,所以我们可以只开一个数组,两个栈分别以数组的两头为栈底进行操作,这样由于元素总个数不超过3S,空间是不会爆的,这就是双栈操作。

队列:队列的应用也很广泛,BFS的状态记录就是一个队列。队列满足先进先出的原则,也就是队头支持调用和删除,队尾支持插入,这个性质满足了对头一定在队尾之前加入,这是一个很重要的性质,如拓扑排序,BFS找最优解都应用到了这个性质。另外,由于这个性质,队列中元素的坐标就具有了单调性,这个性质与二份查找结合起来,可以将很多算法的复杂度由O(n2)降为O(nlogn)如LIS的O(nlogn做法)。

基本操作:提取队头:s=q[head],head++;插入队尾:tail++,q[tail]=s;判断对列是否为空returnhead<=tail;

串:串是一种很重要的数据结构,通常我们所说的串大多是指的字符串,但是也有时候我们将序列描述为串。

字符串的使用:C++中一般使用字符数组,而不用字符串:charst[]读入使用%sC++中字符串的读入有一个优点:自动忽略空格和换行符,当然,有时这也是个缺点。

字符串有的应用很广,但在OI中,与字符串有关的算法并不多,下面对串的一些常用算法进行总结。

Trie树Trie树又称字典树,与一般的二叉树不同,键不保存在节点上,而是保存在通向节点的路径上,也就是说,到达一个节点的路径就代表着一个字符串的前缀,也就是说,使用trie树我们可以同时进行多串的操作。我们通常Trie树都是对每个节点开26个数组,表示从该节点经过’a’..’z’会到哪个节点,在插入的过程中,遇到不存在的节点就新开辟一个,这样节点数就是O(n)的。

用Trie数实现最大xor和我们考虑将已算掉的数按其二进制的各位建一棵Trie树,然后对于当前的数,我们要找到之前一个与它xor和最大的数就可以使用贪心的思想,显然,我们要从高到低位考虑,每次如果某个节点存在与当前位相反的儿子就尽量走那一边,这样就可以找到当前最大的数了,复杂度O(n)

模式匹配:KMP:通常是在较长的母串S中寻找子串T,最朴素的算法是枚举S的每一位,然后用T与其匹配,这样的最坏复杂度是O(nm),我们可以显而易见地发现,在匹配的过程中,我们浪费了大量已有的匹配信息,也就是说,在失配之后,我们没必要从下一位重新开始匹配,而可以利用已有的匹配信息,将T串向后“滑”动一段区间。

AC自动机:AC自动机可以看作是trie树上的KMP,我们和KMP一样的定义一个next数组,表示如果在第i号节点失配,下一步应当走向哪里,打法和KMP也类似。(代码较长,就不贴了)

后缀数组:串的后缀在字符串中有着十分重要的地位,很多算法都是基于后缀而进行的,通常情况下我们需要将后缀进行排序再进行分析,而对后缀进行排序使用后缀数组是十分简洁高效的算法:O(nlogn)倍增求后缀数组:我们在将后缀数组进行排序时,按照长度从小到大排,而每一次我们没有必要重新比较,而可以充分利用前面比较的结果来进行当次比较,我们将每次排序的结果存在sa[]数组中,具体流程如下:1.我们将所有的后缀的前1个字符串进行排序比较2.我们枚举长度k(每次乘2),然后对于他们进行两个关键字的基数排序,令len=2^(k-1),则排序第一关键字为S[i..i+len–1],第二关键字为S[i+len..i+2*len–1],排完之后我们就得到了所有的后缀开头的长度为2^k的串之间的大小关系。枚举长度的时间复杂度为O(logn),基数排序复杂度为O(n),总的时间复杂度就是O(nlogn)。后缀数组求出来的结果存在一个sa[]数组中,sa[i]表示后缀数组中排名第i小的是从哪一位开始的后缀,有了sa[i],rank[i](以i开头的后缀的排名)就很好求了,显然rank[sa[i]]=i通常情况下,光是有一个sa[]和rank[]还远远不够,大部分的问题都解决不了,我们通常还需要求一个height[]数组:height[i]表示后缀中sa[i]和sa[i–1]的最长公共前缀,设h[i]=height[rank[i]],我们有一个很优美的性质h[i]>=h[i–1]+1于是我们就可以在O(n)的时间内求出height

字符串hash:将字符串看成压成一个序列,对于一个序列,我们可以通过一定的hash函数设计将其压成一个hash值,那么同样的,对于一个字符串的某个区间,我们也可以算出它的hash值。通过求出hash值,我们可以判断两个串是否相等(可能出现冲突,但是概率很低),然后就可以完成很多有关字符串的操作及询问了。

最长回文子串O(n)做法:Manacher算法:我们设f[i]表示以f[i]为中心的最长回文子串的一边的长度,设x为当前求出的所有的i+f[i]中最大的i,那么如果i满足if[i]>=min{f[i*2–x],x+f[x]–i},因为关于x对称的i*2–x的最长回文子串的部分/全部会与i重复,然后我们从i+f[i]向外扩展,求出f[i],要注意实时更新x,由于每一个点最多被扫一次,所以复杂度是O(n)的。

并查集:定义:在信息学中,经常会要用到集合,但由于语言自带的集合类型功能十分有限,所以就诞生了许多与集合有关的数据结构,并查集就是一种。

基本模型:我们将集合中的每一个元素看做一个节点,对于同一个集合中的元素,我们选取一个代表元,这个代表元就用共同的父亲来代替。

基本操作:1.初始化:对于每一个节点,我们定义它的父亲为fa[i],一开始,第i个节点的fa[i]为i,表示i所在集合的代表元为i。2.查询元素所在集合对于一个节点i,我们要查询它属于哪个集合,可以使用一个getfather函数Intgetfather(into){If(fa[o]!=o)fa[o]=getfather(fa[o]);returnfa[o];}我们发现,上述代码在判断fa{o}!=o时,并没有直接返回getfather(fa[o]),而是先将代表元记录下来再返回,这里我们就应用到了一个路径压缩的原理,因为对于集合中的每一个元素,我们只需直到它们的代表元是哪一个就可以了,而不需要将路径上的每一个元素都访问一遍,那样在链很长的时候查找会相当的慢,所以我们在一次查找过后就将该信息记录下来,那么下一次访问就可以大大缩短时间了,均摊的时间复杂度是常数级的。3.询问两个元素是否在一个集合有了代表元的定义和上面的查询操作,该问题就非常简单了,我们只需找出两个元素所在的集合的代表元,然后判断是否相等即可了。4.合并集合该问题也比较简单,我们找出代表元之后,如果代表元相同显然没有必要合并,如果代表元不相同,我们就需要将其中一个代表元的父亲改成另一个代表元,这里必须要修改代表元,而不能仅仅修改子节点的父亲节点,因为修改子节点只能改变一部分元素,而修改代表元就可以修改所有的元素了。

带权并查集:带权并查集的思想不算特别难,只是在由子节点到根节点的路径上加上了权值,实际操作中只需注意在路径压缩的时候把权值也累加就好了。

树状数组:树状数组是一种很强大的数据结构,它可以在很小的常数时间内支持单点修改和前缀和查询的功能,实际上,树状数组同样可以利用差分实现区间加值和单点查询(单点修改和区间查询)。设原数组为a[i],设s[i]=a[i]–a[i–1],特别的,s[1]=a[1],下面我们来处理操作:给区间[L,R]加上C,也就是a[L..R]变为a[L]+C,a[L+1]+C…a[R]+C,对应的s数组变为d[L]+C,d[L+1]…d[R],d[R+1]–C,也就是在L处+C,在R+1处减C,如果要询问第i项的和,也就是a[i]=d[i]+d[i–1]+……+d[1],就是询问d的前缀和了。

树状数组通常情况下是作为信息维护的工具出现的,树状数组的问题通常都需要将询问进行变形,使得询问和修改时的变量都有确切的值,且查询的范围刚好是一个不等关系,这样的问题我们都可以使用树状数组维护,对于>的情况,我们可以使用补集转化的思想,用总的减去<=的就可以了。

相关文档
最新文档