涵盖了《王道论坛-2022年数据结构考研复习指导》里的几乎全部内容!

目录
1 绪论
2 线性表
2.1 线性表基本概念
2.2 线性表分类
3 栈和队列
3.1 栈和队列
3.2 特殊矩阵的压缩存储
4 串
5 树
5.1 树的基本概念
5.2 二叉树
5.3 树、森林的遍历
并查集
6 图
6.1 图的基本概念
图的分类
6.2 图的存储
6.3 图的遍历
6.4 图的应用
7 查找
7.1 查找的基本概念
7.2 查找算法
处理散列函数冲突的方法
7.3 B树和B+树
B树的插入和删除
8 排序
8.1 排序的基本概念
8.2 内部排序
8.3 外部排序——归并排序
推荐的Github库
1 绪论
基本概念 |
解释 |
数据 |
数据项(构成数据元素的不可分割的最小单位)∈数据元素(数据的基本单位)∈数据对象Ì数据 |
数据类型 |
原子类型、结构类型、抽象数据类型ADT |
逻辑结构 |
线性结构、非线性结构(集合、树、网) |
存储/物理结构/映像 |
顺序(可静态可动态分配,存储密度高,逻辑上相邻的元素物理上也相邻,适合线性结构、图、树等)、链式(比顺序存储更能方便表示各种逻辑结构,结点内的存储单元地址必须连续)、索引、散列/哈希存储(不能反映数据逻辑关系) |
数据结构三要素 |
逻辑结构、物理结构、运算;ADT定义了一个完整的数据结构 |
存取方式 |
指读写方式,顺序表可随机存取 |
算法——特性 |
有穷性(但程序可无穷)、确定性、可行性、输入、输出 |
算法——设计 |
正确性、可读性、健壮性、效率与低存储量要求 |
算法问题规模n |
算法中所有语句之和T(n)是n的函数 |
基本运算 |
最深层循环内的语句,其频度与T(n)同量级 |
时间复杂度T(n) |
最坏、最好、平均时间复杂度;一般指最坏情况下估计算法执行时间的一个上界;与实现算法的语言无关;O(n^k)<O(2^n)<O(n!)<O(n^n);递归程序的时间复杂度用递推公式来算 |
空间复杂度S(n) |
Space |
算法原地工作 |
空间复杂度=O(1) |
|
|
✓ |
同一个算法,实现语言的级别越高,执行效率越低 |
✓ |
在相同规模下,复杂度为O(n)的算法在时间上总是优于复杂度为O(2^n)的算法 |
✓ |
逻辑结构独立于存储结构,而存储结构不能独立于逻辑结构 |
✓ |
既描述逻辑结构,又描述存储结构和数据运算:顺序表、哈希表、单链表 |
|
O(m+n)=O(max(m,n)) |
2 线性表
2.1 线性表基本概念
|
解释 |
线性表L |
L=(a1,a2,…,a_n),a1为表头元素,a_n为表尾元素;除第一个元素外,每个元素有且仅有一个直接前驱 |
位序 |
从1开始 |
其他基本概念 |
表长、表头元素、表尾元素、直接前驱、直接后继 |
头指针 |
若有头结点,则指向头结点 |
头结点 |
线性表的表长不含头结点 |
前插操作 |
在某结点前面插入一个新结点 |
后插操作 |
在某结点后面插入一个新结点 |
|
|
InitList(&L) |
|
Length(L) |
|
LocateElem(L,e) |
|
GetElem(L,i) |
|
ListInsert(&L,i,e) |
|
ListDelete(&L,i,&e) |
PrintList(L) |
|
Empty(L) |
判空 |
DestroyList(&L) |
|
|
|
|
合并两个长度分别为m和n的有序表,最坏情况下需要比较m+n-1次 |
2.2 线性表分类
|
解释 |
插入基本操作 |
插入时间复杂度 |
删除基本操作 |
删除时间复杂度 |
顺序表 |
动态分配时若空间满,需另开辟一块更大的空间 |
元素移动 |
O(n) |
元素移动 |
O(n) |
单链表 |
可头插法、尾插法建立 |
查找 |
O(n) |
查找 |
O(n) |
双链表 |
每个结点有两个指针 |
|
|
|
|
循环单链表 |
最后一个结点指向首个结点 |
|
|
|
|
循环双链表 |
|
|
|
|
|
静态链表 |
借助数组的链式存储结构,其指针称为游标 |
|
|
|
|
|
比较操作的时间代价常弱于移动操作 |
|
|
|
|
3 栈和队列
3.1 栈和队列
|
栈 |
队列/队 |
操作特性 |
后进先出LIFO |
先进先出FIFO |
操作位置 |
栈顶 |
队头/首出/离队,队尾入/进队 |
主要指针 |
top=栈顶元素 |
front=队头元素但初始也为0,rear=队尾元素的下一个位置 |
顺序存储结构 |
顺序栈、共享栈(减少上溢,有2个指向栈顶元素指针 |
顺序队列(存在假溢出,即Q.rear==Maxsize时元素无法进队但数组中仍有空位;队空时front==rear==0)、循环队列 |
链式存储结构 |
链栈:表头为栈顶的单链表,无头结点 |
链队列(尾指针rear=队尾结点)、双端队列 |
出来元素的不同排列个数 |
Catalan数:1/(n+1) C(2n,n) |
|
应用 |
括号匹配、表达式求值(编译原理)、中缀表达式变后缀表达式(运算符在操作数后)、递归(DFS)、进制转换、迷宫求解、调用函数及其局部变量 |
层次遍历、计算机系统中资源分配(如缓冲区) |
其他 |
只可能发生上溢(因为插入删除都在栈顶进行) |
栈和队列的逻辑结构相同,都是线性结构 |
|
|
|
双端队列 |
进队时前端进的排在后端进的元素前,出队时无论前、后端,先出的排在前面 |
没限制的双端序列输入序列为1234....n,则输出序列有n!个 |
输入受限的双端队列 |
允许在一端进行插入和删除,但在另一端只允许插入 |
|
输出受限的双端队列 |
允许在一端进行插入和删除,但在另一端只允许删除 |
|
3.2 特殊矩阵的压缩存储
概念 |
解释 |
维界 |
数组元素的下标的取值范围 |
上、下三角区 |
i<j、i>j(也叫对角线以下) |
主对角线 |
i=j |
特殊矩阵 |
对称矩阵、三角矩阵(存储完一方的元素之后,再紧接着存储另一方的常量一次)、对角/带状矩阵、三对角矩阵 |
稀疏矩阵 |
逻辑:三元组;存储:数组、十字链表(将行单链表、列单链表结合) |
按行优先 |
先存储行较小的 |
按列优先 |
先存储列较小的 |
4 串
|
解释 |
字符串/串 |
可在串后加一个不计入串长的结束标记字符”\0” |
空串Ø |
|
子串/模式串 |
设为p_1 p_2 … p_m |
主串 |
包含子串的串,设为s_1 s_2 … s_n,子串在主串中的位置从1开始 |
存储结构 |
定长顺序(超过预定义长度的串值会被截断)、堆分配存储(地址连续但动态分配)、块链存储(每个结点(即块)可存放一个或多个字符) |
串的最小操作子集 |
串赋值StrAssign、StrCompare、Strlength、Concat、SubString |
|
|
前缀 |
除最后一个字符外,所有的头部子 |