数据结构第一轮强化笔记
根据天勤高分笔记所做
1 绪论
C / C++
-
函数传参
-
普通变量引用型
- void f(int &x)
-
指针型变量
- void f(int *&x)
-
二维数组
- void f(int x[][length], int length)
-
总结
- 变量需要改变则加 &(数组) / *&(指针)
-
数据结构(三要素)
-
逻辑结构
-
线性结构
- 线性表、队列、栈
-
非线性结构
- 集合、树、图
-
-
物理结构(存储结构)
- 顺序存储、链式存储、索引存储、散列存储
-
数据的运算
复杂度排序
- 1 < log2n < n < nlog2n < n^x < 2^n
算法的特性
- 有穷性、确定性、输入、输出、可行性
算法的设计目标
- 正确性、可读性、健壮性、高效率与低存储量
2 线性表
循环单链表最后一个结点的指针域指向头结点 / 开始结点(无头结点)
带头结点循环双链表无空指针
存储结构
-
顺序表
- 支持随机访问
- 地址空间连续
-
链表
-
存储空间利用率较低
-
动态分配,不支持随机访问
-
形式
- 单链表,双链表,循环单链表,循环双链表,静态链表
-
链表适合增删
顺序表适合随机访问
- 第 i 位插入新元素,移动n-i + 1个元素
- 第 i 位元素删除,移动n-i 个元素
3 栈和队列
最适合用作链队的结构是只带队尾指针的循环单链表
栈
-
FILO
- 卡特兰数:(1/(1 + n ))* C(n,2n)
-
存储结构
- 顺序栈
- 链栈
- 共享栈
-
运算
- 进栈 / 出栈
- 栈满 / 栈空
队列
-
FIFO
-
存储结构
-
顺序队列
-
循环队列
-
删除元素,队首指针+1
- Q·front=(Q·front+1)%MaxSize
-
插入元素,队尾指针+1
-
出队入队都按顺时针进1
-
全满 元素:(rear-front+MaxSize)% MaxSize
-
空位 元素:(rear-front+1+MaxSize)% MaxSize
-
-
双端队列
-
-
链式队列
-
-
运算
- 进队 / 出队
- 队满 / 队空
矩阵的压缩存储
-
压缩存储
- 指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间
-
特殊矩阵
-
对称矩阵
-
三角矩阵
-
对角矩阵
-
各矩阵的下标
对称矩阵 k=i(i-1)/2 + j - 1 【下三角和主对角线】 k=j(j-1)/2 + i - 1 【上三角】
三角矩阵 下三角 k=i(i-1)/2 + j - 1 【下三角和主对角线】 k= n(n+1) /2 【上三角】 上三角 k=(i-1)(2n-i+2)/2 + j - 1 【上三角和主对角线】 k= n(n+1) /2 【下三角】三对角矩阵(带状矩阵) k=2i+j-3 已知下标求矩阵中的位置:i=┗(k +1)/3+1┛ j =(k -2i )+3数组下标k均从0开始
-
稀疏矩阵
-
三元组表示法
-
伪地址表示法
-
链式存储
- 领接表表示法
- 十字链表表示法
4 串
1.空格串不是空串
概念
- 主串
- 子串
- 串长
存储结构
- 字符数组
模式匹配算法
-
暴力
- O(nm)
-
KMP算法
-
O(n +m)
- 掌握KMP算法的滑动
- 前缀匹配,next数组
-
-
KMP算法进一步优化
- nextVal
5 树与二叉树
二叉树前中后序遍历中,所有叶子节点在遍历序列中的先后顺序完全相同
二叉树采用二叉链表存储,交换所有分支结点左右子树位置,利用后序遍历方法最合适
单个根结点也算作叶子结点
叶子结点数为n,度为m的哈夫曼树非叶子结点个数为【n-1/m-1】
度 = n - 1
存储结构
-
顺序存储
-
双亲表示法
- 数组
-
-
链式存储
-
孩子表示法
- 邻接表
-
孩子兄弟表示法
-
二叉树
-
概念
-
度为2的树和二叉树
- 度为2的树至少有3个结点
- 度为2的树若只有一个孩子无须确定左右次序
-
完全二叉树
- 除最后一层为满二叉树,最后一层结点从左到右
-
-
性质
- 结点数 n = n0 + n1 + n2
- 出度为0(叶子结点)数 n0 = n2 + 1
- 第 i 层上至多有2^(i-1)个结点
- 高度为h至多有(2^h-1)个结点
- Catalan:n个结点能构成 C(n,2n) / (n+1)
- 具有n个结点的完全二叉树高度为log2n + 1
-
存储
-
顺序存储
- 数组,最适合用于完全二叉树
-
链式指针
-
-
操作
-
遍历
-
前序遍历
- 中左右
-
中序遍历
- 左中右
-
后序遍历
- 左右中
-
层次遍历
- 从上到下,从左到右
-
-
线索化二叉树
-
目的:利用指针空链域,方便遍历
-
前序线索二叉树
-
中序线索二叉树
- 左空指前驱,右空指后继,双指针遍历
-
后序线索二叉树
-
-
树/森林
-
转换
-
树->二叉树
- 左孩子右兄弟表示法
-
森林->二叉树
- 先树->二叉树,再连接森林
-
二叉树->树
- 逆孩子兄弟表示法
-
二叉树->森林
- 根靠右边孩子断开
-
-
遍历
-
先序遍历
- 先根后子树
-
后/中序遍历
- 先子树后根
-
应用
-
二叉排序树
-
平衡二叉树
-
插入
- 找离插入点最近的平衡因子>1的结点
- 四种旋转
-
查找
-
比较次数最多是树的深度
-
深度为h 最少结点: nʰ=n⁽ʰ⁻¹⁾+nʰ⁻²+1
- 非叶子结点的平衡因子均为1
-
-
-
-
Huffman树
- 特点:带权路径最短,n1 = 0,有同权则不唯一
- 构造方法:每次取最小的两个结点生成新结点
-
Huffman编码
- 最短前缀码
-
Huffman N叉树
- 补充0结点个数为 ?
-
并查集
- Union
- Find
-
红黑树
6 图
最小生成树的结构不唯一,但图中各边权值不相等时,最小生成树唯一
最小生成树的权值之和总是唯一
最小生成树的边数等于顶点数-1
存在边权值相等的最小生成树也可能唯一,无相等边权值必唯一,有相等边权值可能唯一
DFS和拓扑排序可以检测环
各边权值都相等时可以用BFS解决单源最短路径问题(退化为跳数
回路不是简单路径
存在拓扑序列则图无回路
概念
-
简单图
- 不存在重复边
- 不存在顶点到自身的边
-
完全图
-
无向完全图
- n(n-1)/2条边
-
有向完全图
- n(n-1)条边
-
-
简单路径
- 路径序列中顶点不重复
-
无向图
-
连通图
- 任意两个顶点连通
-
连通分量
-
非连通图中的极大连通子图
- 包含连通子图所有的边,可能成环
-
-
极小连通子图
- 边数最少的连通子图,必无环,加一条边必成环
-
边数小于n-1必是非连通图
-
-
有向图
-
强连通图
- 任意两顶点之间互相有路径
-
强连通分量
- 非强连通图中的极大强连通子图
-
存储结构
-
邻接矩阵
- 顺序存储,时间复杂度:O(V²)
-
邻接表
-
链式存储,时间复杂度: O(V+E)
-
多重链表
- 加个标志域,每个结点只存一次
-
-
十字链表
图的遍历
-
深度优先遍历 DFS
- 先序遍历 递归
-
广度优先遍历 BFS
- 层次遍历 队列
-
连通图直接遍历,非连通图多次遍历
图的应用
-
无向图—最小生成树
-
Prim
- 选择当前代价最小的顶点加入
- 时间复杂度O(V²)
-
Kruskal
- 选择全局代价最小的顶点加入
- 时间复杂度取决于排序算法(与边有关),适用稀疏图
- 并查集判断是否成环
-
-
有向图—最短路径
-
Dijkstra
-
单源最短路径
- 单个顶点到其余各顶点的最短路径
-
每一轮加入一个路径最短的结点,类似Prim
-
时间复杂度O(V²)
-
-
Floyd
- 任意一对顶点间的最短路径
- 动态规划,判定A[i][j]>A[i][k]+A[k][j]
- 三重循环,时间复杂度O(V³)
-
-
AOV网
-
顶点表示活动,边表示先后次序的有向无环图
-
拓扑排序
- 找入度为0的顶点输出
- 序列不唯一
-
逆拓扑排序
- 找出度为0的顶点输出
- DFS得到逆向的拓扑有序序列(优先出度0)
-
-
AOE网
-
顶点表示事件,边表示活动,边权表示时间的有向无环图
-
对于一个工程而言,只有一个入度0的源点和一个出度0的汇点
-
关键路径
-
源点到汇点的最长路径,也是工程的最短完成时间
-
ve(k)事件k最早发生时间
- Max
-
v()最晚开始时间
- 终点的vl-持续时间
-
e(i)活动 i 最早开始时间
- 等于该狐起点的ve
-
vl(k)事件k最晚发生时间
- Min
-
-
关键活动
- 关键路径上的活动
-
7 查找
m阶B树叶子结点在同一层
B树和B+树都可用于文件的索引结构
B树不支持顺序查找
m阶B树是m叉平衡查找树
平衡二叉树最少结点 Nh=Nh-1+Nh-2+1
N0=0;
N1=1;
N2=2;
N3=4;
N4=7;
N5=12;
N6=20;
概念
-
记录|关键字
-
平均比较次数|平均查找长度 ASL
- 成功
- 失败
线性结构
-
顺序查找
-
无序线性表
- 成功,(n+1)/2
- 不成功,n+1
-
有序线性表
- 成功,(n+1)/2
- 不成功,n/2+n/(n+1)
-
-
折半查找
-
适用于有序的顺序表
-
判定树
-
n个非叶子结点,n+1个叶子结点(失败结点)
-
查找成功平均查找长度近似
- (1x1+2x2+3x2²+…+hx2⁽ʰ⁻¹⁾)/n = log2(n+1) - 1
-
-
-
分块查找|索引顺序查找
- 线性表分成若干块,块间有序,块内无序
- 建立索引表存储块信息及关系,先折半,再顺序查找
树形结构
-
二叉排序树 BST
-
二叉链表,中序遍历得到非递减序列
-
插入
- 查找失败位置增加新节点
-
删除
- 叶子结点,直接删除
- 只有左子树或右子树,删除连接
- 找到次大于或次小于结点更换值
-
-
平衡二叉树 AVL
-
平衡因子
- 左右子树高度之差
-
树中所有结点平衡因子≤|1|的二叉排序树
-
插入平衡调整
-
每次调整离插入结点最近的不平衡子树
-
LL型|RR型
- 右单旋|左单旋
-
LR型|RL型
- 先左后右|先右后左
-
-
删除和二叉排序树类似
-
-
红黑树
-
性质
- n个结点的红黑树高度至多:2log2(n+1)
- NIL叶子结点
-
插入
-
新插入结点为红色
-
叔父红
- 叔父涂黑,爷变红
-
-
删除
-
-
B树|多路平衡查找树
-
n个分支的结点有n-1个关键字
-
m阶结点关键字个数范围为m/2 - 1 ~ m - 1
-
插入
- 总是在终端结点上
-
删除
- 兄弟够借,父子换位
- 兄弟不够,父子合并
-
-
B+树
- n个分支的结点有n个关键字
- 非叶子结点只是索引,不含有该关键字地址信息
- 叶子结点指针相连构成记录链表
散列结构
-
散列
- 根据给定的关键字来计算关键字在表中地址
-
散列表
-
散列函数
- 直接定址法|数学分析法|平方取中法|除留余数法
-
处理冲突的方法
-
开放定址法
-
线性探测
- 容易堆积
-
平方探测
- 减少堆积
-
再散列法|伪随机序列法
-
-
拉链法
- 不堆积
-
-
-
效率指标
-
散列函数
-
装填因子
- 关键字个数和表长的比值
-
处理冲突的的方法
-
8 排序
最佳归并树计算I/O次数需×2(读写)
概念
-
稳定性
- 相对位置不发生改变
-
衡量标准:时间复杂度|空间复杂度
内部排序
-
插入排序|空间复杂度O(1)
-
直接插入排序
- 思想:每次挑选一个数插入到部分有序序列中
- 最坏比较次数n(n-1) / 2,适用于基本有序序列
-
折半插入排序
- 折半查找寻找插入位置,O(n²)
-
希尔排序
-
思想:子序列插排逐步有序,最后直接插入排序
-
步长选取
- 希尔:n/2向下取整,O(n²)
- 帕斯:2^k + 1 < n,O(n^1.5)
- 最后一步一定是1,直接插入排序
-
-
-
交换排序
-
冒泡排序|空间复杂度O(1)
- 思想:每趟排序确定一个最大值/最小值
- 最坏比较次数n(n-1) / 2,移动次数3n(n-1) / 2
-
快速排序|空间复杂度O(log2n)
- 思想:每次确定一个关键字界限,两边向中间交换
- 越无序效率越高,排序趟数与初始序列相关
-
-
选择排序|空间复杂度O(1)
-
简单选择排序
- 思想:每次选择最小值/最大值加入有序序列
- 比较次数与初始状态无关,始终是(n-1)n / 2次
-
堆排序
- 大根堆:L(i) ≥ L(2i) 且 L(i) ≥ L(2i+1),完全二叉树
- ①建堆:子树筛选,向上冒泡
②插入:插入到最底层最右边,向上冒泡
③删除:最底层最右边结点赋值,向下冒泡
④排序:输出堆顶,最底层最右边结点赋值,向下冒泡 - 适用于关键字较多场景
-
-
归并排序|空间复杂度O(n)
- 二路归并
- 分治递归
-
基数排序|空间复杂度O(rd)
-
多关键字排序,适用关键字很多但基数较少的场景
-
最高位优先
- 从高到低依次有序|先排后直接插入排序
-
最低位优先
- 从低到高依次有序
-
外部排序
-
思想:将内存作为工作空间来辅助外存数据排序
-
归并排序
-
最常用
-
k路归并
- 每k个记录分为一组
-
子算法
-
置换-选择排序
- 获得初始归并段
-
最佳归并树
- 使归并次数最少
-
败者树
- 从当前k个值中挑选最值
-
-
-
置换-选择排序
- 每次从缓冲区中选出最小的V
- 若V<归并段最大值,跳过继续选择
- 缓冲区所有V都小于归并段最大值,开始下一轮
- 所有归并段长度不一定相等
-
最佳归并树
-
思想:归并段长度不等,构造Huffman树最小化归并次数
-
对k路归并构造k叉Huffman树
- (n - 1) % (k - 1) = 0,可以构成k叉树
- (n - 1) % (k - 1) = u,说明u个多余,加k-u-1虚段
-
-
败者树
-
不引入败者树每次需比较k-1次找最值,引入之后减少到log2k次
-
叶子结点
-
当前参与归并的归并段段首记录
-
k路归并叶子结点个数为k
- 结点数不是偶数则每次剩余一个放下一趟比较
-
-
非叶子结点
- 二叉树,度为2,值为叶子结点序号
-
胜者做父节点的父节点,败者做父节点
-
调整
- 叶子结点更新,非叶子结点向上比较
-
总结
-
不稳定算法
- 希尔|快排|简单选择|堆
-
每次排序确定一个关键字位置
- 冒泡|快排|简单选择|堆
-
关键字比较次数和原始序列无关
- 简单选择|折半插入
-
排序趟数和原始序列有关
- 交换排序:冒泡|快排
XMind: ZEN - Trial Version
本文详述了数据结构的基础知识,包括线性结构、非线性结构、存储结构和数据运算。深入探讨了线性表、栈、队列、串、树与二叉树、图以及排序和查找算法,涵盖了它们的逻辑特性、物理存储、操作方法及复杂度分析。同时,提到了特殊矩阵的压缩存储、字符串模式匹配算法以及哈希表和二叉搜索树等高级主题。
570

被折叠的 条评论
为什么被折叠?



