【数据结构】强化部分笔记

第一章 绪论

考点1 时间复杂度与空间复杂度

时间复杂度:常对幂指阶

例题:

1.C

2.B

3.B

需要找递归的次数。

空间复杂度:

对于辅助空间大小,设变量i,j,k之类的,所需辅助空间为O(1)

注意:

例题:

王道书知识点总结

1.数据类型:原子类型、结构类型和抽象数据类型

2.数据结构

三要素:逻辑结构、存储结构和数据的运算

一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。

3.逻辑结构

分为线性结构和非线性结构。线性表是典型的线性结构,而集合、树和图是典型的非线性结构。

4.存储结构

主要有顺序存储、链式存储、索引存储和散列存储。

5.算法是对特定问题求解步骤的一种描述。

五个重要特性:

有穷性、确定性、可行性、输入、输出

好算法的目标:

正确性、可读性、健壮性、高效率与低存储量需求

6.

王道书选择题总结

1.1.3

1.可以用抽象数据类型定义一个完整的数据结构。

抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而可构成一个完整的数据结构定义。

2.以下属于路结构的是(C)

A.顺序表    B.哈希表     C.有序表      D.单链表

解析:顺序表、哈希表和单链表是三种不同的数据结构,既描述逻辑结构,又描述存储结构和数据运算。而有序表是指关键字有序的线性表,仅描述元素之间的逻辑关系,它既可以链式存储,又可以顺序存储,所以属于逻辑结构。

3.在存储数据时,不仅要存储数据元素的值,而且要存储数据元素之间的关系。

1.2.3

1.若某算法的空间复杂度为O(1),则表示该算法所需辅助空间大小与问题规模n无关。

2.计算语句频度,就是计算该语句在算法中被重复执行的次数。对于这道题,在计算n-2+n-3+···+1的时候,已经是在计算最后一行语句的语句频度了。

3.计算m++语句的执行次数,应该为2+4+···+2n=n(n+1)

4.这个时间复杂度计算比较困难。

第一个for循环共执行logn次,i=n/2

第二个for循环共执行2+4+···+n/2(共logn次),计算得n

需要注意的是,计算第二个for循环的次数时已经考虑了每一轮第一个for循环的情况,所以不再需要乘以O(n)

小结:

一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。

所以,如果已经计算出最内层语句的频度,那么就是该算法的时间复杂度,不需要乘以外层的时间复杂度。

第二章 线性表

考点2 线性表的顺序表示

顺序表的基本操作:

1.初始化

2.插入和删除

3.查找

考察方式:

1.顺序遍历查找

设置哨兵:

优点:不需要判断数组是否越界,效率略高。

查找判定树:

总结:

2.折半查找

查找效率分析:

查找判定树的构造:

时间复杂度:

总结:

3.快速排序

思想:

代码:

时间复杂度和空间复杂度分析:

结论:

总结:

算法表现主要取决于递归深度。若每次划分的越均匀,则递归深度越低;划分的越不均匀,递归深度越深。

稳定性:不稳定

4.归并排序

思想:

算法:

时间复杂度和空间复杂度:

总结:

考点3 线性表的链式表示

一般考察带头结点的单链表。

1.定义

2.头插法

3.尾插法

4.删除节点

王道书知识点总结

1.线性表是一种逻辑结构,表示元素之间一对一的相邻关系。而顺序表和链表是指存储结构。

2.顺序表的动态分配并不是链式存储,它同样属于顺序存储结构,物理结构并没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时动态决定。

3.单链表的长度不包括头结点

4.逻辑上实现对某一节点的前插操作:先在该结点后插入一个结点,再调换这两个节点的值。

5.如果题目要求删除p节点,但没有给出它前置结点的信息,可以通过删除p后的q节点来实现逻辑删p节点。

①q=p->next

②q->data=p->next->data        #将q的数据转移到p中

③p->next=q->next        #逻辑删除p节点(实际删的是q节点)

④free(q)

6.

7.双链表的删除操作

p->next=q->next

q->next->prior=p

free(q)

8.循环单链表

循环单链表最后一个结点的指针不是NULL,而改为指向头指针,使得整个链表形成一个环。

王道书选择题总结

2.1.3

1.线性表是具有n个数据元素的有限序列

2.3.7

1.链式存储设计时,节点内的存储单元地址一定连续

2.顺序存储方式不仅可以存储线性结构,还可以存储树和图

3.若先建立链表,再依次插入建立有序表,则每插入一个元素就需要遍历链表寻找插入位置,即直接插入排序,时间复杂度为O(n2)

而如果现将数组排好序,然后建立链表,建立链表的时间复杂度为O(n),数组排序最好的时间复杂度为O(nlogn),总时间复杂度为O(nlogn)

注:快速排序是效率最高的内部排序算法,最优时间复杂度和平均时间复杂度为O(nlogn),最坏时间复杂度为O(n2)

4.

5.C

解答:C:双链表能很方便的访问前驱和后继,故删除和插入数据较为方便

D:线性表是逻辑结构,对应存储结构有顺序存储和链式存储。顺序存储取第i个元素的时间与i的大小无关

6.C

解答:修改新结点指针(NULL),也算作修改指针域。

7.A

解答:带尾指针的单循环链表在插入节点的时候很方便,但是在删除节点的时候需要遍历链表,并不方便。

带头结点的双循环链表可以迅速定位到末尾节点,并进行插入或删除操作。

8.C

解答:如果是只有尾指针没有头结点指针的循环单链表,删除最后一个元素不方便,需要遍历整个链表。

只有头节点指针没有尾结点指针的循环双链表,四个操作都很方便。

注:带尾指针的循环单链表删除最后一个元素都不方便。

9.A

解答:静态链表采用数组表示,因此需要与先分配较大的连续空间。静态链表同时还具有一般链表的特点,即插入和删除不需要移动元素。

10.C

解答:a:1014H        f:1010H        e:1004H

注意题目顺序为“a、e、f”

第三章 栈、队列和数组

考点4 栈与队列的基本性质

1.常考题型:输出序列的合法性

注意:

即c->b>a顺序是固定的

考点5 栈和队列的存储结构

1.

2.

队列更常考顺序存储(假溢出),用循环队列解决

3.

4.

5.

6.

考点6 双端队列

1.双端队列主要考察方式:判断出队序列的合法性

考点7 栈和队列的应用

1.队列的应用

队列实现二叉树的层序遍历

2.栈的队列

3.

4.

中缀表达式转后缀表达式规则:

△优先级高于栈顶运算符,直接入栈;优先级低于或等于栈顶元素,依次弹出栈中优先级高于或等于当前运算符的所有运算符。

例题:B        A

B

考点8+9 特殊矩阵的压缩存储&多维数组的存储

1.例题

①C:22

②A:50

③A:三元组表和十字链表

④B:87

对阵矩阵的压缩:

三角矩阵的压缩:

三对角矩阵的压缩:

稀疏矩阵的压缩:

普通矩阵的存储:

通常结合行优先存储或列优先存储来考察缺页处理

王道书知识点总结

1.栈和队列都是操作受限的线性表,因此不是所有对线性表的操作都可以作为栈和队列的操作。比如,不可以随便读取栈和队列中间的某个数据。

2.

3.共享栈

4.链栈没有栈满上溢的情况,通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。

5.设置tag的依据:

每次删除操作成功,令tag=0;每次插入操作成功,令tag=1

只有删除操作,可能导致队空;只有插入操作,可能导致队满

王道书选择题总结

3.1.4

1.A

2.B

3.2.5

1.D

2.D

3.A

注:头指针只指向链表头,即使队头固定在链表尾,头指针仍然在链表尾。

3.4.5

1.

2.注意数组下标从1开始,对应关系中不需要-1

3.注意数组下标从1开始,对应关系中不需要-1

第四章 串

考点10 串的模式匹配算法

1.B        C

2.朴素模式匹配算法:i指针需要回溯

3.KMP算法:i指针不需要回溯

求Next数组:

串的下标从1开始时,next[1]写0,next[2]写1

串的下标从0开始时,所有next值都要减1,next[0]写-1,next[1]写0

KMP算法最坏时间复杂度O(m+n),其中求next数组时间复杂度为O(m),模式匹配过程最坏时间复杂度O(n)

4.KMP算法的优化

王道书知识点总结

1.串中字符的个数n称为串的长度

2.串中任意多个连续的字符组成的子序列称为该串的子串,包含子串的串称为主串

3.由一个或多个空格(空格是特殊字符)组成的串称为空格串(空格串不是空串),其长度为串中空格字符的个数

4.串的存储结构

①定长顺序存储

②堆分配存储

③块链存储

5.串的朴素模式匹配算法

从主串S的第一个字符起,与模式串T的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起,重新和模式串的字符比较,以此类推。

回溯方法:i=i-j+2         j=1

朴素模式匹配算法的最坏时间复杂度为O(mn)

6.KMP算法

使用next数组中,当模式串的第j个字符匹配失败时,令模式串跳到next[j]再继续匹配

当第j个字符匹配失败,由前1~j-1个字符组成的串记为S,则next[j]=S的最长相等前后缀长度+1.

特别的,next[1]=0,next[2]=1

第五章 树与二叉树

考点11 树的基本性质

1.

2.例题

1.C        3.B

2.

考点12 二叉树的定义与性质

1.对于完全二叉树,如果结点编号i≤n/2(向下取整),则该结点为分支结点;如果i>n/2(向下取整),则该结点为叶子结点

对于完全二叉树,如果n为偶数,则有一个度为1的结点;如果n为奇数,则没有度为1的结点

2.二叉树的顺序存储一定是按照结点编号存储

3.A        C        C

考点13 二叉树的遍历

1.

2.B        B

3.

考点14 树、森林和二叉树的转换

1.树和二叉树的转换

2.二叉树和森林的转换

3.

4.C        B        C        D

考点15 线索二叉树的基本概念和构造

1.

2.线索化:若左、右指针为空,左指针指向前驱,右指针指向后继,这种情况下将tag修改为1

3.D        A

4.D

考点16 哈夫曼树和哈夫曼编码

1.

2.注意多叉哈夫曼树的构造,如果叶子结点个数不够,应该补0

选B

3.选C

4.A        D

考点17 并查集

1.

2.定义&初始化

3.并&查

4.选择题考察

5.Union操作应用题

6.Find操作应用题

7.并查集判断图的连通性

8.并查集判断是否有环

9.并查集实现克鲁斯卡尔算法

王道书知识点总结

5.1 树的基本概念

1.树适用于表示具有层次结构的数据。树的某个结点(除根结点外)最多只和上一层的结点(即其父节点)有直接关系,根结点没有上层结点,因此在n个结点的树中有n-1条边。

而树中每个结点与其下一层的零个或多个结点(即其孩子节点)都有直接关系。

2.度为m的树和m叉树

3.树的性质

5.2 二叉树的概念

1.二叉树是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分它是左子树还是右子树。

2.

3.二叉树的性质

①非空二叉树上的叶结点数等于度为2的结点数加1,即n0=n2+1

4.

5.在含有n个结点的二叉链表中,有n+1个空链域

5.3.1 二叉树的遍历

1.三种遍历

①先序遍历

②中序遍历

③后序遍历

2.以上三种遍历算法中,递归遍历左、右子树的顺序都是固定的,只是访问根结点的顺序不同。

不论采用哪种遍历算法,每个结点都访问一次且仅访问一次,所以时间复杂度都是O(n)。

在递归遍历中,递归工作栈的栈深恰好为树的深度,所以在最坏的情况下,二叉树是有n个结点且深度为n的单支树,遍历算法的空间复杂度为O(n)

3.求树的深度

4.由层序序列和中序序列构造二叉树

5.3.2 线索二叉树

1.线索化二叉树中,中序遍历需要处理最后一个结点的右指针,将其置为NULL

先序遍历需要在T->ltag==0的情况下进行左指针线索化,否则会进入死循环

2.中序线索二叉树的遍历

找前驱:

5.4 树、森林

1.树的存储结构

①双亲表示法

双亲表示法利用了每个结点(根结点除外)只有唯一双亲的性质,可以很快地得到每个结点的双亲结点,但是求结点的孩子时则需要遍历整个结构。

注:二叉树可以用树的顺序存储结构来存储,而树却不都能用二叉树的存储结构来存储。

②孩子表示法

③孩子兄弟表示法

孩子兄弟表示法比较灵活,最大的优点是可以方便地实现树转换为二叉树的操作,易查找结点的孩子等,缺点是从当前结点查找其双亲比较麻烦。

5.5 树与二叉树的应用

1.

3.

王道书选择题总结

5.1.4

1.A

2.C

3.C

可以理解为连接10棵树只需要9条边。如果用9条边将各树连接起来,则会形成一整棵树,有15+9=24条边,此时正好有25个结点,结点个数比边数多1.

5.2.3

1.C

2.B

注意可以有一个度为1的结点

3.A

4.B

5.A

5.3.3

1.C

2.B

3.C

4.D

5.A

6.C

小结:

后序线索树仍不能有效解决求后续后继的问题,需要栈的支持

5.4.4

1.

注:以下是我用特解法求出来正确答案,但不知道具体正确原因的题目

1.

群u解析:

2.

5.5.3

1.

注意:度为m的(哈夫曼)树,至少有一个结点的度为m

2.

注意:加权平均长度除以所有叶结点频次之和

第六章 图

考点18 图的基本性质

1.

2.

3.B        C

考点19 图的存储结构及基本操作

1.

2.

3.如果确定了每个顶点的编号,则邻接矩阵的表示唯一,但邻接表的表示不唯一

4.B        C        C

考点20 图的遍历

1.

2.D

3.

4.D

5.

考点21 最小生成树

1.

2.

3.

4.A        C

考点22 最短路径

1.

2.迪杰斯特拉算法

3.B        C

4.Floyd算法

5.Floyd算法具体流程

依次以V0、V1、V2作为中转,求最短路径

6.

考点23 拓扑排序

1.

2.拓扑排序:用一个辅助数组存储每个结点的入度,找到入度为0的顶点,取出它并将和该点有关的点的入度减1,重复此过程。

3.D        D

考点24 关键路径

1.

2.求关键路径

3.C

考点25 有向无环图存储算数表达式

1.A

王道书知识点总结

6.1 图的基本概念

1.线性表可以是空表,树也可以是空树,但图不可以是空图。也就是说,图中不能一个顶点也没有,图的顶点集V一定非空,但边集E可以为空,此时图中只有顶点而没有边。

2.弧是顶点的有序对,记为<v,w>,其中v,w是顶点,v称为弧尾,w称为弧头,<v,w>称为从v到w的弧,也称v邻接到w

3.简单图:①不存在重复边 ②不存在顶点到自身的边

简单图和重复图的定义是相对的

4.

5.若一个图有n个顶点,且有大于n-1条边,则此图一定有环

6.2 图的存储及基本操作

1.邻接矩阵表示法的空间复杂度为O(n2),其中n为图的顶点数|V|。邻接矩阵表示法的空间复杂度只和顶点数相关,和实际的边数无关,适用于存储稠密图。

2.

3.

4.十字链表法:存储有向图

5.邻接多重表:存储无向图

6.

6.3 图的遍历

1.图的遍历是指从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。

2.对于无向图,调用BFS函数的次数等于连通分量数

3.BFS算法

①算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。

②如果没有函数BFSTraverse,对于非连通图,只采用BFS无法遍历完所有结点

解析:先访问再入队,队头元素不必再次访问,直接取出。

4.BFS求解单源最短路径问题

5.广度优先生成树

广度优先生成树反映了根结点到某点的最短路径长度

7.深度优先搜索

深度优先搜索类似于树的先序遍历,而广度优先搜索类似于树的层序遍历

8.深度优先生成树

9.图的遍历和图的连通性

6.4 图的应用

1.最小生成树的性质

2.最小生成树中所有边的权值之和最小,但不能保证任意两个顶点之间的路径是最短路径

3.

4.

5.DFS实现逆拓扑排序

6.

7.

王道书选择题总结

6.1.2

1.

2.

3.

4.

6.2.6

1.

6.3.4

1.

2.

3.

4.

6.4.6

1.

2.

3.

4.

第七章 查找

考点26 顺序查找、折半查找

1.

2.

3.

5.

6.

7.B        A

考点27 二叉排序树

1.

2.

3.

4.

5.B        C        A

考点28 二叉平衡树

1.

2.

3.D        C

考点29 红黑树

1.

2.

3.D

4.

5.

6.

7.

8.

9.无论是BST、AVL还是红黑树,按照不同的顺序插入,得到的形态可能不同

10.

考点30 B树和B+树

1.考察B树的基本性质,以及查找插入删除等基本操作,B+只考察基本概念

王道书知识点总结

7.1 查找的基本概念

1.静态查找和动态查找

2.

3.

4.分块查找

7.2 顺序查找和折半查找

1.

7.3.1 二叉排序树

1.

构造一棵二叉排序树的目的并不是排序,而是提高查找、插入和删除关键字的速度,二叉排序树这种非线性结构也有利于插入和删除的实现。

2.

二叉排序树作为一种动态树表,其特点是树的结构通常不是一次产生,而是在查找过程中,当树中不存在关键字值等于给定值的结点时再进行插入的。

3.

不同的关键字序列可能得到相同的二叉排序树,也可能得到不同的二叉排序树。

4.

5.

6.

7.3.2 平衡二叉树

1.

2.

7.3.3 红黑树

1.

2.红黑树:左右高度差最多两倍;AVL平衡二叉树:左右高度差小于1

3.性质

7.4 B树和B+树

1.B树的插入

2.B树的删除

3.插入和删除的总结

4.B+树

5.B和B+树的区别

7.5 散列表

1.

2.

3.散列查找

单个查找成功:

单个查找失败:

平均查找长度:

4.散列函数设计

①除留余数法

除以质数的目的:让不同的关键字的冲突尽可能少

②直接定址法

③数字分析法

④平方取中法

小结:

5.处理冲突的方法

①线性探测法

线性探测法的查找:

线性探测法删除是逻辑删:

查找成功次数和失败次数分析:

②平方探测法

③开放定址法

总结:

④再散列法

6.着重理解线性探测法和平方探测法

7.散列表:根据关键字直接进行访问的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。

理想情况下,对散列表进行查找的时间复杂度为O(1),即与表中元素的个数无关。

8.

9.

10.线性探测法:很容易造成大量元素在相邻的散列地址上聚集(或堆积)起来,大大降低了查找效率

11.平方探测法,又称二次探测法。平方探测法是一种处理冲突的较好方法,可以避免出现堆积问题,它的缺点是不能探测到散列表上的所有单元,但至少能探测到一般单元。

12.拉链法适用于经常插入和删除的情况。

13.开放地址法,是指表中可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。

拉链法,对于不同的关键字可能会通过散列函数映射到同一地址,为了避免非同义词发生冲突,可以把所有的同义词存放在一个线性链表中,这个线性链表由器散列地址唯一标识。

王道书选择题总结

7.2.4

1.

2.

3.

4.

7.3.4

1.

2.

3.

4.C

5.

6.

7.4.3

1.

2.

3.

4.

7.5.5

1.

2.这道题需要注意,散列表无法查找到地址为7的数据,所以它只能计算0~6的散列地址失败查找长度

3.

小结:在计算开放地址法的ASL时,除以的应该是散列表的长度,而不是整个表的长度。

在查找失败的平均查找长度的计算上,只关心有无关键字,不关心关键字到底是多少,怎么映射过来的。(所以关键字12的失败查找次数为2)

第八章 排序

王道书知识点总结

8.1 排序的基本概念

1.排序算法的性能指标

 2.排序分类

3.总结

4.框架

5.内部排序一般都需要两种操作:比较和移动。但是并非所有排序算法都需要比较操作,比如基数排序。

8.2.1  插入排序

1.

2.算法实现

哨兵优化:

3.算法效率分析

4.直接插入排序适用于顺序存储和链式存储的线性表,采用链式存储时无需移动元素

8.2.2 折半插入排序

1.

2.

3.

4.折半插入排序仅适用于顺序存储的线性表

8.2.3 希尔排序

1.

2.算法流程

总得来说:

增量也可以不是2:

3.算法

4.效率分析

5.总结

6.希尔排序仅适用于顺序存储的线性表

8.3.1 冒泡排序

1.

2.

3.

4.

8.3.2 快速排序

1.

2.

3.

4.

5.

6.

7.快速排序不稳定

8.

9.

8.4.1 简单选择排序

1.

2.

3.

4.

5.

8.4.2 堆排序

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.堆的插入

12.堆的删除

13.

14.

简单选择排序是一种不稳定的排序算法

简单排序算法适用于顺序存储和链式存储的线性表,以及关键字较少的情况

堆排序适合关键字较多的情况

堆排序仅适用于顺序存储的线性表

8.5.1 归并排序

1.

2.m路归并

3.

4.

5.

6.归并排序是稳定的

7.归并排序适用于顺序存储和链式存储的线性表

8.

8.5.2 基数排序

1.

第一趟:按个位大小进行分配

第二趟:按十位的大小进行分配

第三趟:按照百位的大小进行分配

2.

3.

4.

5.

6.

7.基数排序是一种很特别的排序算法,它不基于比较和移动进行排序,而基于关键字各位的大小进行排序。

8.基数排序适用于顺序存储和链式存储的线性表。

8.6 各种内部排序算法的比较及应用

1.时间复杂度&空间复杂度

2.稳定性

3.适用性

4.

5.

8.7.1 外部排序

1.

2.

3.

4.优化方案:多路归并

5.

6.

7.

8.7.2 败者树

1.

2.

3.

8.7.3 置换选择排序

1.

2.

3.

8.7.4 最佳归并树

1.

2.

3.

4.

5.

王道书选择题总结

8.1.3

1.

2.

8.2.4

1.

8.3.3

1.

2.

8.5.4

1.

2.

3.

8.6.3

1.

2.

3.

4.

5.

6.

8.7.6

1.C


至此,数据结构二轮强化初步完成~

祝诸君一切顺利!

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值