数据结构期末复习重点
一、线性结构
1、串的模式匹配(区分目标串和模式串、nextval数组值、KMP算法匹配过程)
区分目标串和模式串、nextval数组值
KMP算法匹配过程:
2、利用栈对表达式求值
将所给的表达式转换成后缀表达式的过程
然后解析后缀表达式,对表达式求值的过程
二、非线性结构
1、树与二叉树
(1)哈夫曼树(思想)、哈夫曼编码和带权路径长度求解
思想:在n0个带权叶子节点构成的所有二叉树中,带权路径长度WPL最小的二叉树成为哈夫曼树或者是最优二叉树。
(2)二叉树的先序、中序和后序遍历的思想和求解。
先序(DLR):先遍历根,再遍历左子树,最后遍历右子树。
中序(LDR):先遍历左子树,再遍历根,最后遍历右子树。
后续(LRD):先遍历左子树,再遍历右子树,最后遍历根。
例题:
1.给定5个字符a~f,他们的权值集合W={2,3,4,7,8,9},是构造关于W的一颗哈夫曼树,求其带权路径长度,WPL和各个字符的哈弗曼编码。
取两个最小的值相加形成新的权值。
第一步
第二步
第三步
第四步
最终结果
这样哈夫曼树就被构造出来了。
加上对应字符。
哈夫曼编码思想,从根节点出发,(根节点为零),在左边写0,右边写1。
比如d:000(根左左)。根表示根节点。
e:001(根左右)
f:010(右左)
c:0110(右右左)
a:01110(右右右左)
b:01111(右右右右)
WPL求值思想,根节点为零层,对应字符的层数乘与对应的值然后相加。
WPL=(2+3)*4+4 *3+(7+8+9)*2=80
遵从,左小右大。数值小的放左边,数值大的放右边。相同的,谁先出现,在左边。
纠正一个小错误:组件构成的新的树,放在元素最后面,所以数值9在新组成数值9的左边。
2、图
(1)图的存储结构(邻接矩阵表示、邻接表表示、邻接矩阵的特点(有向图))
(2)图的遍历(DFS、BFS的算法思想和结合某种存储结构进行遍历求解)
(3)图的最短路径(单源点):Dijkstra算法思想、最短路径求解,求解时一定要给出求解步骤。
图的遍历
图的遍历:从给定图中任意指定的顶点(成为初始点)出发,按照某种搜索方式沿着图的边,访问图中的所有顶点,是每一个顶点仅被访问一次。
深度优先遍历:深度优先遍历简称DFS(Depth First Search)
广度优先遍历:广度优先遍历简称BFS(Breadth First Search)
例题:
1.在某交通运输网络中有8个城市,城市的分布情况如图1所示,顶点1-8分别表示8个不同的城市,城市间的交通路线用有向边表示,边上的数值代表城市间的距离权重。请完成以下操作:
(1)写出图1的邻接矩阵和邻接表;
(2)结合邻接矩阵存储结构,写出从城市1出发的一个深度优先遍历序列和一个广度优先遍历序列;
(3)给出从城市1到其它城市的最短路径及最短路径长度;
(4)求出图1的一个拓扑序列;
(5)写出从城市1到城市8的关键路径。
1-1邻接矩阵
1-2邻接表
2-1深度优先遍历
结果为:v1 v2 v3 v8 v4 v5 v7 v6
结合邻接表理解。
简单解析:v1下一个地址指向v2,v2下一个地址指向v3,v3下一个地址指向v8,v8下一个地址为null,返回到v3,v3都访问过了,返回到v2,v2里边v3,访问过了,访问v4,v4下一个地址是v5,v5指向v3,v3全都访问过,访问v7,v7指向v8,v8下一个地址为null,返回到…就是按这种思想进行遍历。
2-2广度优先遍历
结果为:v1 v2 v4 v6 v3 v5 v7 v8
结合邻接表理解。
简单解析:把v1当顶点,v1下一个地址指向v2,v2指向v4,v4指向v6,v6下一个地址为null,返回到v1的下一个地址的索引(也就是v2),把v2当顶点,v2下一个指向v3,v3指向v4,v4指向v5…知道所有顶点都被访问过一遍。
三、查找与排序
1、查找
哈希表查找(哈希表的基本概念、3个因素、线性探测法解决冲突、哈希表的求解与建立)
哈希表的基本概念:
哈希表(hash table)又称三列表,其基本思路是,设要存储的元素个数为n,设置一个长度为m(m>=n)的连续内存单元,以每个元素的关键字ki(0<=i<=n-1)为自变量,通过一个称为哈希函数(hash function)的函数h(ki)吧ki映射为内存单元的地址(或下标)h(ki),并把该元素存储在这个内存单元中,h(ki)也成为哈希地址(hash address)。把如此构造的线性表存储结构称为哈希表。
三个因素:
①哈希函数。
②处理冲突的方法。
③哈希表的装填因子。
哈希函数的好坏首先影响出现冲突的频繁程度。
假定哈希函数是“均匀的”,即不同的哈希函数对同一组随机的关键字,产生冲突的可能性相同。
对同一组关键字,设定相同的哈希函数,则不同的处理冲突的方法得到的哈希表不同,它的平均查找长度也不同。
若处理冲突的方法相同,其平均查找长度依赖于哈希表的装填因子。
线性探测法
线性探测法是从发生冲突的地址(设为d)开始,依次探测d的下一个地址(当到达下标为m-1的哈希表表尾时,下一个探测的地址是表首地址0),直到找到一个空闲单元为止(当m≥n时一定能找到一个空闲单元)。线性探测法的数学递推描述公式为:
d0=h(k)
di=(di-1+1) mod m (1≤i≤m-1)
用线性探测解决冲突的例题:
解题过程如下:
构建哈希表:
除留余数法:
除留余数法是用关键字k除以某个不大于哈希表长度m的数p所得的余数作为希地址的方法。除留余数法的哈希函数h(k)为:
h(k)=k mod p (mod为求余运算,p≤m) ,p最好是质数(素数)。
采用除留余数法解决冲突例题:
采用除留余数法哈希函数建立如下关键字集合的哈希表:{16,74,60,43,54,90,46,31,29,88,77}。
除留余数法的哈希函数为:
h(k)=k mod 13
对构造的哈希表采用线性探测法解决冲突。
解:h(16)=3,h(74)=9,h(60)=8,h(43)=4,
h(54)=2,h(90)=12,h(46)=7,h(31)=5,
h(29)=3 冲突
d0=3,d1=(3+1) mod 13=4 冲突
d2=(4+1) mod 13=5 仍冲突
d3=(5+1) mod 13=6
h(88)=10
h(77)=12 冲突
d0=12,d1=(12+1) mod 13=0
建立的哈希表ha[0…12]如下表所示。
2、排序
直接插入排序和折半查找(直接插入排序思想、折半查找的思想、直接插入排序和折半查找的求解过程)
直接插入排序思想:
假设待排序的记录存放在数组R[0…n-1]中。初始时,R[0]自成1个有序区,无序区为R[1…n-1]。从i=1起直至i=n-1为止,无序区的头元素,与有序的最后一个元素比较,一次从后往前比较,符合条件插入有序区,知道无序区元素个数为0.
折半查找的思想:(效率较高)
折半查找时, 先求位于查找区间正中的对象的下标
mid,用其关键码与给定值k比较:
Element[mid].key == k,查找成功;
Element[mid].key > k,把查找区间缩小到表的前
半部分,继续折半查找;
Element[mid].key < k,把查找区间缩小到表的后半部分,继续折半查找。
如果查找区间已缩小到一个对象,仍未找到想要查
找的对象,则查找失败。
例如:
1.在关键字有序序列{2,4,7,9,10,14,18,26,32,40}中采用折半查找法查找关键字为7的元素。
折半查找的平均查找长度:
折半查找例题:
1、折半查找有序表(4,6,10,12,20,30,50,70,88,100),若查找表中元素38,则它将依次与表中哪些元素比较大小,查找结果是失败。
A. 20,30,50
B. 20,70,50,30
C. 20,70,30,50
D. 30,20,50
答案选 C
2、折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 __________比较大小。
答案:28,6,12,20
拓扑排序的思想:
①从有向图中选择一个没有前驱(入度为零)的定点并且输出他。
②从图中删去该顶点,并且删去从该顶点发出的全部有向边。
③重复上述两步,直到剩余的图中不再存在没有前驱的顶点为止。
联系方式qq:1287440358 微信:Burial_DH