数据结构与算法 期末冲刺
第一章 数据结构概论
数据的基本单位是数据元素,一个数据元素由若干数据项组成。
数据结构由某一数据元素的集合和该集合中数据元素之间的关系组成。
数据结构的核心是分解与抽象。
数据有逻辑结构和物理结构。
数据结构的存储:顺序存储,链接存储,索引存储,散列存储。
算法特性:有输入、有输出、确定性、有穷性(程序不一定有此特性)、能行性。
第二章 线性表
第三章 栈和队列
前中后缀表达式的转换
递归工作栈,保存被调用程序内分配的局部变量及形式参数的副本和返回地址。
尾递归
递归与迭代的转换
第四章 数组,串,广义表
特殊矩阵压缩存储【找位置】【三对角记住一个2i+j,一个(k+1)/3下取整】
稀疏矩阵存储【三元组法,快速转置,矩阵加法】【正交链表】
字符串模式匹配
广义表
第五章 树
二叉树特性
完全二叉树深度
算法
二叉树递归删树
递归找父结点
递归遍历【求高度、深度、建树】
广义表栈建树【flag标记,读字符,括号则操作栈,逗号改flag,其余则链入子女】
根据前序和中序序列建树【找根,建根,递归】
栈版前序遍历【初始化,访问,右进栈,看左更新p】
层序遍历【初始化进队,出队并访问,子女进队】
栈版中序遍历【一直到左下进栈,退栈并访问,看右,重复这个过程】
栈版后序遍历
线索树特性
前序后序若根无左/右子树则有2个空指针,否则只有1个。中序一定有2个。
算法
中序线索树 找前驱后继【后继可以转化为右子树中序第一个,前驱可以转化为左子树中序最后一个】
中序线索树 线索化【函数有一个pre参数,左子树递归,建立当前节点前驱线索,pre结点的后继线索,然后右子树递归。递归结构外部,记得处理中序最后一个结点的后继】
中序线索树 前序遍历【左右有子女简单,若无,则沿后继直到有右子树】
中序线索树 后序遍历【找起点,找父亲,猜是左还是右,如果是右或者唯一的左,那么下一个就是它,否则去它的右子树重新进行这个过程】
对一般的树
父指针表示法
子女链表表示法
子女-兄弟链表表示法
算法
子女兄弟链表的建立算法【二元组输入序列。pointer[]数组用于保存各个树节点,lastChild[]数组用于保存各个树的最后一个子女结点的地址。建结点复制数据,根据数据找父亲,根据父亲有无孩子决定链接方式,更新lastChild数组,进入下一轮】
DFS【先根、后根】【分别对应转化后二叉树的前序、中序】
BFS【队列】
堆的形成【从非叶子的最后一个结点,自下而上,下滑】、插入【上滑】和删除【下滑】
Huffman树算法【HFNode包括key, data, lchild, rchild, parent。时刻更新最小/大权值、最小/大权值点。每轮更新完之后构造新的子树。】【别忘了Huffman树是数组存储的】
第六章 集合与字典
集合的位向量实现
集合的有序链表实现【升序排列】
并查集【Merge操作的两种改进】
字典【线性表组织、散列表组织】
涉及ASL计算
散列函数:除留余数法、数字分析法、平方取中法、折叠法
处理冲突的闭散列/开地址法:线性探查法、二次探查法【缺点:不能随便物理删除表中元素。】
处理冲突的开散列/链地址法
第七章 搜索结构
ASL的计算贯穿整个章节
顺序搜素、折半搜索。
二叉搜索树【搜索、插入、删除(若有空子树直接填补,否则找右子树中序第一个结点)】
AVL树【平衡因子,平衡化旋转:回溯,从发生不平衡的结点subL开始,下找两层确定旋转方式 从下往上看平衡因子符号 ++左单 --右单 +-左右 -+右左 简称正左负右】
第八章 图
邻接矩阵表示
邻接表表示
DFS【visited数组,子过程】【邻接表
BFS【队列】【邻接表
最小生成树算法【Kruskal(最小堆,并查集), Prim(最小堆)(适合稠密图)】
最短路径算法【Dijkstra(path数组注意), Floyd(邻接矩阵,
AOV网络 拓扑排序算法【删源法,inDegree数组记录入度,栈S记录入度为0的顶点】【链栈的应用】邻接表时间复杂度
AOE网络 寻找关键路径
第九章 排序
KCN, RMN的计算贯穿整个章节
插入排序
··直接插入排序 ——“一个个来”
··折半插入排序的算法
··Shell排序的算法【不稳定】 ——“跳跃分组”
交换排序
··起泡排序的算法和改进(改进就是排好了就别再检查了)
··快速排序的算法【不稳定】【算法细节要会!】
选择排序
··直接选择排序【不稳定】 ——“挑目前最小的”
··锦标赛排序
··堆排序的算法【不稳定】【最大堆实现从小到大】
二路归并排序
··二路归并排序的迭代算法
第十章 多级索引结构
m阶B树:根节点至少两个子女,其他节点至少有m/2上取整个子女,不超过m个子女,所有失败节点处于同一层。
B树的插入、删除【非叶结点、叶结点四种情况】
刷题
在已经有序的情况下快排最垃。
n个互异的整数排序最少最少log(n!)上取整次比较。
比如n=5时,每一次比较 产生的信息量之多是 -log(0.5)=log2;比较五个不同的数字需要3信息量是 -log(1/(5!))=log(120)=6.9 bit;所以有k*log2>=log120所以有 k>=7
快排的空间复杂度要知道。
快排分割的不同方案要知道。
图的顶点集不能空!
Prim最小生成树适合稠密图!
给边集分清有向图还是无向图
程序调用另一个程序,用一个栈保存被调用程序内分配的局部变量及形式参数的副本和返回地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?