2022-2023 数据结构复习笔记
复习要点(不是考纲 而是考的概率比较高)
线性结构
时间复杂度(循环、nlog2n的复杂度、技巧)、
队列(循环队列:队列中的两个指针,判断队列中元素的个数,队首队尾的位置情况/循环队列中首在后尾在前的情况)、
栈(同上;一组数的输入和输出)、
二维数组(按行/列优先,求对应地址/元素;三对角矩阵:按行按列如何存放,上下三角)
排序(采用xx排序,执行1/2/3…趟后结果是什么)
跳表、hash函数(线性探测、处理冲突;给出一组数,hash函数,判断如何存放;查找某个数需要几次)(跳表和hash的优点和不足)
层次结构
**二叉树(度,关系,最大最小高度,叶子节点最多)
前中后序遍历(伪代码)(给定前中求后、中后求前)
huffman编码和树(画图、字符和树相比节省多少空间)
堆的调整(完全二叉树与一维数组,增删查改,调整最大最小堆;判断一维数组是否为最大最小堆)
平衡二叉树(增删查改)
二叉搜索树
平衡搜索树
B-树(插入算法,伪代码/思想)
m叉搜索树
网状结构
(题目必出一个)最小生成树(给定某一个点,加点 prim;加边kruskal;写出生成的过程)
最短路径(Dijkstra和Floyd;最短路径或时间复杂度)
拓扑排序
判断图是不是连通的(思想/算法)
算法题
25 10+15分
难:大概率在后面部分(贪心开始);
简单:链表、树(二叉排序树etc);
带权的路径长度
10: 3/4/3 ;15:?/6/?
程序设计的思想;用c++描述;时间(空间)复杂度分析
考研大题(做法:双指针移动(快慢指针或固定距离);空间换时间(如果不要求空间复杂度);保持最大/最小值的更新;借助队列/栈; )
已经出现过的文字题:
描述拓扑排序算法
B-树在元素插入过程中的算法思想
Kruskal算法/Prim算法的算法思想;Kruskal判断是否有回路(以及对应的复杂度)
请给出判断n个顶点的无向图是否为连通图的算法思想
动态规划和贪心算法的比较
散列与跳表的比较
请给出从加权无向图中生成最小耗费生成树的两种方法
栈与队列的相同点和不同点
时间复杂度计算技巧:
O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
看循环 以及是否涉及循环条件改变导致的对数次
递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间
顺序结构:
各种排序算法的思想、执行过程以及程序实现,
队列和栈中的入队出队入栈出栈顺序问题,
给定程序的时间复杂度,
Hash函数和线性探测执行过程以及查找一个元素需要比较的次数, p251
线性结构不同存储形式的特点,
几种特殊矩阵存储方式以及映射函数,
Hash表和跳表存储方式和查找方式。
层次结构:
任意给定两种二叉树的遍历序列可以画出二叉树,
哈夫曼树和哈夫曼编码,
最大堆和最小堆的概念以及插入删除元素的调整过程,
二叉搜索树的概念以及查找、插入和删除节点的操作过程和程序实现过程,
平衡二叉树的概念以及查找、插入和删除节点的操作过程等。
图结构:
给定图求解最小生成树的常用的两种算法思想以及求解过程,
拓扑排序的思想和过程,
动态规划中求最短路径的经典算法思路,
设计动态规划算法解决实际问题的算法思路和程序实现,
深度优先算法和广度优先算法的思想、过程和程序实现。
1、排序整理
名次排序(计数排序)(先遍历得到每个数在数组中的排名,在按排名排序)(O(n^2))
选择排序(每一轮选择出待排序范围内的最大/小数,放在数组末/首) O(n^2) 空间复杂度O(1) 不稳定
冒泡排序(每一轮不断把待排序范围内的最大值推到最右端) O(n^2) (最好有序O(n),平均n^2) 稳定(感觉未必,要看代码),空间复杂度O(1)
插入排序(从第二位(index=1)开始与前面已完成排序的内容进行判断,选择插入合适的位置)(其余同上)稳定
箱子排序(把分数相同的先放在同一个链表里,最后把这些不同的链表按顺序连起来)稳定排序 O(n+range)
基数排序(按照某种基数分解数字,然后对数字进行排序,书上按低位、次低位…的顺序进行排序,对小于N^c-1的数相当于c次箱子排序)稳定排序 O(cn)
堆排序(利用大小根堆的根节点特性进行排序)O(nlogn) 空间复杂度O(1)
归并排序(分治:将数组元素细化,分成n多个单个元素序列。合并:一步一步将分治的数组元素合并起来,合并的同时进行顺序排序。)时间O(nlogn) 空间O(n) 稳定
快速排序(利用支点元素,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以 递归 进行,以此达到整个数据变成有序序列) 时间 最快/平均O(nlogn) 最坏O(n^2) 空间O(logn)
2、线性结构不同存储方式的特点:
1.顺序结构
(1)结点中只有自身的信息域,没有关联信息域。因此,顺序存储结构的存储密度大、存储空间利用率高。
(2)通过计算地址直接访问任何数据元素,即可以随机访问。
(3)插入和删除操作会引起大量元素的移动。
2.链式结构
(1)结点除自身的信息域外,还有表示关联信息的指针域。因此,链式存储结构的存储密度小、存储空间利用率低。
(2)在逻辑上相邻的结点在物理上不必相邻,因此,不可以随机存取,只能顺序存取。
(3)插入和删除操作方便灵活,不必移动结点只需修改结点中的指针域即可。
使用场合的选择:
1、基于存储空间
顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模。链表不用事先估计存储规模,但链表的存储密度较低。顺序存储结构的存储密度是1,而链式存储结构的存储密度小于1。
2、基于运算
在顺序表中按序号访问的时间复杂度为O(1),而链表中按序号访问的时间复杂度为O(n)。
3、基于环境
顺序表容易实现,在任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲顺序表简单些。
3、几种特殊矩阵存储方式以及映射函数
1、对称矩阵压缩存储为上/下三角 n(n+1)/2个元素空间
2、(i,j从1开始,数组从0开始)上三角矩阵的行主映射 (2n-i+2)(i-1)/2+j-i
下三角矩阵的行主映射 i(i-1)/2+j-1
三角矩阵的行主映射2i+j-3
线性表(terms/row/col/value) 行链表
4、Hash表和跳表存储方式和查找方式
跳表 可以支持快速的插入、删除、查找操作。它在单链表的基础上, 对链表建立多级索引,进而提高查询效率(空间换时间),类似于基于链表的“二分查找”
hash表也叫散列表, 可根据key值通过某种映射关系而直接访问的数据结构 ,它支持按照下标随机访问的特性 ,实质上是数组的一种扩展 。
hash函数可以把字符串,数字等等映射为一个无符号整型,以便快速找到存储该元素信息的位置。
哈希冲突:可能多个不同的key值通过哈希函数最后映射得到的值为同一个数,找hash表中剩余的空间,然后将其插入
跳表的插入储存删除都是O(logn),插入操作用随机过程来决定一个数对的级,级的分配对于要插入的数对不考虑其关键字。
跳表的查询方式是使链表能进行类似二分搜索的操作。查找元素的过程是从最高级索引开始,一层一层遍历最后下沉到原始链表。所以,时间复杂度 = 索引的高度 * 每层索引遍历元素的个数。
散列函数给不同数对分配的桶是随机分布的,需要利用待插入数对的关键字。线性探查。
优缺点:跳表的元素是有序的,而散列是无序的;
跳表的插入和删除只需要修改相邻节点的指针;但需要维护额外的链表(多级索引)
查找某一关键字的时间复杂度:跳表为O(logn),散列为O(1);
散列不适合范围查找、不适合散列技术(只能一个关键字对应一个元素),需要设计恰当的hash函数,尽可能减少哈希冲突
5、最大堆最小堆的概念
一棵树,每个节点的值都大于(小于)或等于其子节点(如果有)的值;并且是完全二叉树。
插入:先放根节点再起泡上浮
删除:一般指删除根节点,先把最末的节点数据放在根节点,删除末节点的空间,再下沉调整数据(最大堆中子节点的更大者上移)
初始化:对建成的二叉树的i/2(向下取整)的最后一个有子节点的节点进行调整,O(nlogn) 调整一次logn
6、霍夫曼编码
霍夫曼树有最小的WEP(加权外部路径),对根到外部节点的路径进行编码得到霍夫曼编码,用于对数据压缩和编码长度的优化。
7、平衡二叉树AVL
TL和TR是AVL树,且|hR-hL|<=1
注意插入和删除的旋转操作
8、给定图求解最小生成树的常用的两种算法思想以及求解过程,
无权重:BFS DFS
有权重:Kruskal(按成本递增顺序,每步考察一条边,若该边加入边集后不会产生回路,即检查顶点u,v是否属于同一个顶点集,则加入边集合)
Prim(从剩余的边(边的有且只有一个顶点在已选点集中)中选择一条成本最小的边,并且加入到边集中形成一棵树) P437
9、拓扑排序的思想和过程
根据任务有向图建立拓扑序列。是对有向无回路图(顶点活动网络AOV网)进行排序,以期找到一个线性序列,这个线性序列可以表示某些事情完成的相应顺序。
a.在有向图中任选一个没有前趋的顶点输出;
b.从图中删除该顶点和所有以它为尾的弧;
c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓扑有序序列;或者直到图中没有无前趋的顶点为止,此情形表明有向图中存在环。
10、动态规划中求最短路径的经典算法思路
Floy算法 O(n^3)
利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。算法假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,算法检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
假设图G有n个顶点,且从1到n编号。c(i,j,k)表示从i到j经过不大于k编号的顶点的最短路径长度。即c(i,j,0)为图中边的长度,若不存在初始化为infinite,c(i,j,n)为最终i到j的最短路径。
11、设计动态规划算法解决实际问题的算法思路和程序实现
12、深度优先算法和广度优先算法的思想、过程和程序实现
BFS P408 队列
DFS P411 栈
本文来自博客园,作者:Meowki,转载请先取得作者许可并注明原文链接:https://www.cnblogs.com/meowki/articles/17124147.html


浙公网安备 33010602011771号