根据PTA题目集整理知识点,进行期末备考。
前言
所谓复习,其实是预习。
这学期乱七八糟的事情真的太多了,学习真的很不在状态。
不过,还是要加油呀!
一、绪论
1、数据结构是带结构的数据元素的集合。
二、线性表
1、向一个有n个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为n/2。
2、将两个各有n个元素的递增有序顺序表归并成一个有序顺序表,其最少的比较次数是2n。
3、删除一个元素时所需移动元素次数的期望值(平均次数)为(n-1)/2。
4、时间复杂度
- O(1)顺序表修改、取值,循环链表合并,在单链表中查找直接后继,链式有序表的合并
- O(n)顺序表查找、插入、删除,单链表取值、查找、插入、删除、查找直接前驱,双向链表插入、删除
- O(m*n)线性表的合并
- O(m+n)顺序有序表的合并
5、头结点不计入链表长度
6、顺序存储结构具有随机存取的特点,单链表是非随机存取的存储结构,要获取第i个数据元素必须从头指针出发顺链进行寻找。
7、将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是n。
解释:当第一个有序表中所有的元素都小于(或大于)第二个表中的元素,只需要用第二个表中的第一个元素依次与第一个表的元素比较,总计比较n次。
三、栈和队列
1、若top
为指向栈顶元素的指针,判定栈S
(最多容纳m
个元素)为空的条件是:S->top == -1。
解释:顺序栈是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。通常,当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为top等于-1。注意:若栈顶top初始化为0,则指向栈顶元素的下一个位置,对此相应的定义操作也会变化。此处top初始化为-1。
2、斐波那契和Hanoi塔问题递归算法的时间复杂度都是O(2ⁿ),空间复杂度均为O(n)。
3、如果循环队列用大小为m
的数组表示,且用队头指针front
和队列元素个数size
代替一般循环队列中的front
和rear
指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:m。
解释:循环队列是队列的一种顺序存储结构,用队尾指针rear指向队列中的队尾元素,用排头指针front 指向排头元素的前一个位置。入队运算时,队尾指针进1(即rear+1),然后在rear 指针指向的位置插入新元素;退队运算时,排头指针进1(即front+1),然后删除front指针指向的位置上的元素。当front=rear=m时可以容纳的元素个数最多。
4、若循环队列的存储空间为(1:m),在循环队列运转起来后,如果front<rear,则队列中的元素个数为rear-front;如果front>rear,则队列中的元素个数为rear-front+m。
5、队空和队满的条件
为了区分队空还是堆满的情况,有多种处理方式:
- 方式1: 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,即约定以"队头指针在队尾指针的下一位置作为队满的标志"。
队满条件为:(rear+1)%QueueSize==front
队空条件为:front==rear
队列长度为:(rear-front++QueueSize)%QueueSize
- 方式2: 增设表示队列元素个数的数据成员size,此时,队空和队满时都有front==rear。
队满条件为:size==QueueSize
队空条件为:size==0
- 方式3: 增设tag数据成员以区分队满还是队空
tag表示0的情况下,若因删除导致front==rear,则队空;
tag等于1的情况,若因插入导致front==rear则队满
6、用链接方式存储的队列,在进行删除运算时头、尾指针可能都要修改。
7、已知链队列的头尾指针分别是f和r,则将值x入队的操作序列顺序正确的是14523.
1:s=(LinkedList)malloc(sizeof(LNode));
2:r->next=s;
3:r=s;
4:s->data=x;
5:s->next=r->next;
四、串、数组和广义表
1、串是一种特殊的线性表,其特殊性体现在数据元素是一个字符。
2、匹配最好情况下的时间复杂度是O(n+m),最坏情况下的平均时间复杂度是O(m*n)。
3、元素个数=每维个数*每维个数*每维个数;每维个数=上限-下限+1。
五、树和二叉树
1、无论是递归还是非递归遍历二叉树,因为每个结点被访问一次,则不论按哪一种次序进行遍历,对含n个结点的二叉树,其时间复杂度均为O(n),空间复杂度也是。
2、由二叉树的先序排列和中序排列,或由其后序排列和中序排列均能唯一地确定一棵二叉树,先序排列和后序排列不行!
3、二叉树的深度为左右子树深度的较大者加1。计算二叉树的深度是在后序遍历二叉树的基础上进行的运算。
4、结点个数为左子树的结点个数加上右子树的结点个数再加上1。
5、遍历搜索二叉树的时间复杂度为O(n),空间复杂度为 O(1)。
6、哈夫曼树的构造过程是每次都选取权值最小的树作为左右子树构造一棵新的二叉树,所以树中一定没有度为1的结点、两个权值最小的结点一定是兄弟结点、任一非叶结点的权值一定不小于下一层任一结点的权值。
六、图
1、n个顶点的连通图用邻接距阵表示时,该距阵至少有2(n-1 )个非零元素。
2、邻接矩阵的时间复杂度和空间复杂度都为O(n²),邻接表的时间复杂度和空间复杂度都是O(n+e)。
3、图的BFS生成树的树高比DFS生成树的树高小或相等。
解释:对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生成树的树高相等。一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。
4、 Prim算法适合构造一个稠密图G的最小生成树,时间复杂度为O(n²),与网中边数无关;Kruskal算法适合构造一个稀疏图G的最小生成树,时间复杂度为O( elog2e)。
5、广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。
6、深度优先遍历类似于二叉树的先序遍历,广度优先遍历类似于二叉树的层次遍历。
7、迪杰斯特拉算法的时间复杂度为O(n²),弗洛伊德算法的时间复杂度为O(n³),拓扑排序和求关键路径的时间复杂度为O(n+e)。
七、查找
1、折半查找法在查找成功时进行比较的关键字个数最多不超过树的深度,对2取对数向下取整加1,时间复杂度为O(log2n),只适用于有序表且限于顺序存储结构。
2、平均查找长度最坏情况(n+1)/2,最好情况log2(n+1)-1.
八、排序
1、快速排序的每趟排序能将作为枢轴的元素放到最终位置;冒泡排序的每趟排序能将最大或最小的元素放到最终位置;堆排序的每趟排序能将最大或最小的元素放到最终位置。
总结
菜就多练……