2021上学期数据结构期末考试重点整理
文章目录
数据结构复习笔记
选择填空
栈与队列
栈
先进后出
表尾——栈顶,表头——栈底,操作全在栈顶
Top指向栈顶元素的下一个位置
栈顶指针指向栈顶下一个元素,栈底指针指向栈底元素
判满:Top-Base=MaxSize
判空:Top=Base
置空:Top=Base
长度:Top-Base
增删改——链栈
查——顺序栈
应用——数值转换(进制转换)、判断回文、括号匹配、算术表达式求值
前缀表达式、后缀表达式
前缀表达式:找 运算符ab 计算
后缀表达式:找 ab运算符 计算
队列
先进先出
队尾进,队头出
双向队列——两头皆可以出入队
采用循环队列
队尾指针指向队尾的后一个元素,队头指针指向队头元素
移动的结果位置为 (原位置+1)%MaxSize 出队入队皆是
队空:头等于尾
队满:(尾+1)%MaxSize=头 即尾向下移以为到头
长度:(尾-头+MaxSize)%MaxSize
小总结
插入端的指针永远指向下一个位置
入先判满,出先判空
kmp算法
串的模式匹配
序号i从1开始
next[i]=不包含本位置字符的前缀和后缀最大重合字串长度+1(没重合写1,第一项写0)
nextval[i]=此位置(i)的字符与第next[i]处的字符是否一致,一致nextval[i]=nextval[next[i]],否则nextval[i]=next[i],第一项写0
时空间复杂度(选择)
排序 | 冒泡 | 选择 | 插入 | 希尔 | 归并 | 快速 | 堆 | 基数 |
---|---|---|---|---|---|---|---|---|
平均时间复杂度 | O(n²) | O(n²) | O(n²) | O(n²) | O(nlogn) | O(nlogn) | O(nlogn) | O(d(n+r)) |
最坏时间复杂度 | O(n²) | O(n²) | O(n²) | O(n²) | O(nlogn) | O(n²) | O(nlogn) | O(d(n+r)) |
空间复杂度 | O(1) | O(1) | O(1) | O(1) | O(n) | O(logn) | O(1) | O(n+r) |
时间:快归队(堆)是O(nlogn),其他全是O(n²),快速最坏也是O(n²)
空间:快是O(logn),归是 O(n),其他全是O(1)
查找 | 顺序 | 折半 | 二叉树 | 哈希 |
---|---|---|---|---|
时间复杂度 | O(n) | O(logn) | O(logn) | O(1) |
简答
堆排序
堆是一棵完全二叉树,大根堆根是整个左右子结点的最大值,反之为小根堆
1、建立初始堆——从上到下从左到右
2、排序的对象是整棵树的根,每次排完,根和最后一位交换,最后一位不再参与下一轮排序
3、对根的排序原则是,(以排成大根堆为例)根大于左右子树
4、自下而上,从最末端的子树开始排
5、在将符合条件的结点运送到根之后,还要检查没课子树是否为一个对应的根堆
二叉排序树BST和平衡二叉树AVL
BST二叉排序树
1、左小于根小于右
查找、建立、插入、删除
查找、删除——大于当前访问节点向右小于向左
删除——若所删结点仅一个孩子,则取孩子代替原来位置,若有两个孩子,则取右子树最小结点代替原来位置
建立——一般为建立平衡二叉树(特殊二叉排序树),在下面描述
AVL平衡二叉树
1、每一棵子树深度之差不超过一的二叉排序树
2、左小于根小于右
平衡化
LL型——某节点的L孩子的L子树多了一个节点致使失衡——AL成为根,ALR成为A的新L
RR型——某节点的R孩子的R子树多了一个节点致使失衡——AR成为根,ARL成为A的新R
LR型——某节点的L孩子的R子树多了一个节点致使失衡——ALR成为根,AL为左根,A为右根,ALRL作为AL的R,ALRR作为A的L
RL型——某节点的R孩子的L子树多了一个节点致使失衡——ARL成为根,AR为右根,A为左根,ALLR作为AR的L,ALRR作为A的R
建立
按给出数据的顺序(a,b,c,d…),把第一个数据a放在根处,b小于a向左反之向右,判断是否失衡(才两个结点必然不失衡,但还是要判断),再同理插入第三个节点,再使之平衡化,以此类推直到排完。
哈希表ASL(平均查找长度)的计算
构造哈希函数
传入一个数据吐出一个地址
冲突:不同数据吐出同一个地址
同义词:吐出同一地址的几个数据
构造方法:
直接定址法——H(key)=key(适用于地址大小等于数据量大小)
数字分析法——分析数据,提取若干位作为地址(适用于数据中数字出现频率可分析)
平方取中法——对数据的平方进行数字分析法
折叠法——取数据中的几位和另外几位叠加作为地址
除留余数法——数据除以P的余数作为地址,P<=表长M,且是素数
处理冲突的方法
1、开放定址法
线性探测法——遇见冲突往右边走找第1个空位(即增量序列d=1,一般取1)
二次探测法——遇见冲突移动d个位置(d=12,-12,22,-22……)
2、链式地址法
就是把哈希值一样的数据链起来
最短路径
单源点最短路径——迪杰斯特拉算法——取从单源点A出发到各点的最短边,把A和此点看作新的结点A1,再看从A和A1出发到各点最短路径,再重复上述过程直到A到所有点的最短路径被算出
全部结点间最短路径——弗洛伊德算法——先写出邻接矩阵,再逐个添加结点作为中介点更新矩阵
创建哈夫曼树并计算WPL
创建
最小的两个数作为左右子节点,和作为根节点,把此子树看作一个结点,数值与根相同,再参与最小两两合并,直至合并结束
左0右1,写出哈夫曼编码
WPL
结点权值*到根节点有几条边(就是有几条杠)累加之和
二叉树串接
二叉树转树——父连子右孙右,去原父与右子连线
树转二叉树——兄弟相连,除最左一个结点外父子断开
森林转二叉树——森林里的树转二叉树再相连