读书笔记之《数据结构》---第九章 查找

本章目录:
1.静态查找表
2.动态查找表
3.哈希表

基本概念:
查找表:是由同一类型的数据元素构成的集合
静态查找表:只进行“查找”操作的表
动态查找表:在查找过程中,对不存在的数据元素进行插入,或从表中删除已存在的数据元素,此类操作的表称为动态查找表

关键字:是数据元素某个数据项的值,可以标识一个数据元素,
主关键字:可以唯一标识一个记录的关键字
次关键字:可以识别若干记录的关键字

查找:根据给定的某个值,在表中确定一个其关键字等于给定值的记录或数据元素。

静态查找表

顺序查找表:用顺序表或链表标识静态查找表的查找过程,从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若找到相等的则查找成功,否则查找失败。
在这里插入图片描述
在这里插入图片描述

定义:为确定记录在查找表中的位置,需要和给定值进行比较的关键字个数的期望值称为查找算法在查找成功是的平均查找长度。Pi是找到第i个记录的概率,Ci是找到与给定值相等的关键字时需要与跟定值比较的关键字的个数。
在这里插入图片描述
在等概率的情况下顺序查找的平均查找长度为:
在这里插入图片描述

有序表的查找:
1.折半查找:先确定待查记录的所在的范围,然后逐步缩小范围直到找到或找不到该记录为止
在这里插入图片描述
在这里插入图片描述
当每个记录的查找概率相等时,折半查找的平均查找长度:
在这里插入图片描述
h:是查找判断树的深度

斐波那契查找:按照斐波那契数列来确定分割点,假设表中记录个数比某个斐波那契数小于1,即n=Fu-1,则查找分割点为斐波那契数F(u-1)的值,如此将表中记录分为了n1和n2两部分,其中n1中元素数目等于斐波那契数F(u-1) - 1 的值,而n2中元素的个数为斐波那契数F(u-2) - 1的值。如果给定值等于n则查找成功,如果给定值大于n则在n2中进行斐波那契查找,如果跟定值小于n则在n1中进行斐波那契查找。

斐波那契查找的平均性能高于折半查找。

静态树表的查找:当有序表中个记录的查找概率不相等时,普通折半查找的性能很可能不是很高。需要创建静态最优查找树。
查找性能最佳的判定树是其带权内路径长度之和PH值取最小的二叉树
在这里插入图片描述
n:是二叉树上结点的个数
hi:是第i个结点在二叉树上的层次数
wi=c * pi,pi是结点的查找概率,c是某个常数。

由于构造静态最优查找树花费的时间代价较高,所以只讨论一种PH值近似为最小的次优查找树的构造法
在这里插入图片描述
取∆Pi最小的结点 ri 作为根节点进行划分,然后分别对左右子序列{rlow,rlow+1,…,ri-1}和{ri+1,…,rh}分别构造次优查找树。以此不断递归,直到叶子结点。
在这里插入图片描述

索引顺序表的查找:索引和子表之间有序,子表之内无序,查找过程分两步进行
1.确定待查记录所在的子表
2.在子表中进行顺序查找
在这里插入图片描述

动态查找表
在动态查找表的查找过程中,若找到则查找成功,否则插入关键字等于给定值的记录

二叉排序树的性质:
1.若左子树不空,则左子树上的所有结点均小于根结点
2.若右子树不空,则右子树上的所有结点均大于根结点
3.左右子树分别为二叉排序树
在这里插入图片描述
二叉排序树是一种动态树表,其结构通常是在查找过程中生成的。
在这里插入图片描述
在这里插入图片描述
二叉排序树删除结点时,需要将被删除的结点的左右子树按一定规则连在被删结点的双亲结点上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当对有序数据进行构造二叉树时,会生成单支树,这时的查找性能和顺序查找一样。所以在构造二叉排序树的过程中需要进行“平衡化”

平衡二叉树:左右子树都是平衡二叉树,且左右子树的深度只差的绝对值不超过1。
二叉树的平衡因子BF:值为-1,0, 1,当左子树比右子树深度大1层时值为1,相等为0,小一层为-1。当大于1或小于-1时,则为失去平衡,需要调整
在这里插入图片描述
失去平衡进行调整的4种情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B-树的特性(m阶):
1.树中每个结点至多有m棵子树
2.若根节点不是叶子结点,则至少有两棵子树
3.除根之外的所有非终端结点至少有 (m/2)(向上取整)棵子树。
4.所有非终端结点中包含下列信息数据
在这里插入图片描述
其中n是该结点的关键字数,An是指向子树的指针,Kn是关键字。kn关键字小于An子树中的关键字,An-1中的关键字都小于Kn。
在这里插入图片描述
B-树的查找包含两个基本操作:
1.在B-树中找结点,该动作在磁盘上进行
2.在结点中找关键字,该动作在内存上进行

B-树的插入和删除:
1.插入过程:对于m阶树,先确定插入位置,然后插入该结点,如果结点的关键字数目小于m,则插入该结点,若关键字数目不小于m,则将中部的一个关键字提至双亲,然后剩余关键字分裂为两个子树,连接在双亲中,如下图
在这里插入图片描述
在这里插入图片描述

2.删除结点过程:
a. 若删除关键字所在的结点关键字数目不小于[m/2]则只需删除该关键字ki和相应指针Ai。
b. 若结点关键字数目等于[m/2] - 1时,而相邻的右兄弟(左兄弟)结点中关键字数目大于[m/2] - 1时,则需将其兄弟结点中最小(最大)的关键字上移到双亲结点中,且将双亲中小于(或大于)并紧靠该上移关键字的关键字下移到被删关键字的结点中。
c. 如果被删关键字所在结点,的兄弟结点关键字数目都等于[m/2]-1,假设该结点有右兄弟,且其右兄弟结点地址由双亲结点中的Ai所指,则删去关键字后,它所在的结点中剩余的关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟节点中。如果因此使得双亲结点的关键字数目小于[m/2]-1,则以此类推做相应处理。
如下图
在这里插入图片描述

B+树:是B-树的变型树,差异在于:
1.有n棵子树的结点中包含有n个关键字
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小到大的顺序链接。
3.所有非终端结点可以看成是索引部分,结点中仅含有其子树中的最大或最小关键字
在这里插入图片描述
B+树的查找、插入和删除的过程和B-树类似

键树:又称为数字查找树,树中的每个结点只含组成关键字的一个字符。
在这里插入图片描述
键树的孩子兄弟表示法:
在这里插入图片描述

多重链表表示键树:
在这里插入图片描述

哈希表
在记录的存储位置和它的关键字之间建立一个对应关系f,使得每个关键字和结构中一个唯一的存储位置相对应。f称为哈希函数。

一个哈希函数对关键字集合中的任一个关键字,经过哈希函数映像到地址集合中的任何一个地址的概率是相等的,则层此类哈希函数为均匀的哈希函数。
哈希函数的构造方法:
1.直接定址法:取关键字或关键字的某个线性函数值为哈希地址,例如从1岁到100岁人口数字统计表中,取年龄为关键字,哈希函数取关键字自身。
在这里插入图片描述
2.数字分析法:如果在哈希表中可能出现的关键字事先知道,则可取其中适合的一部分进行哈希。
3.平方取中法:取关键字平方后的中间几位为哈希地址。
4.折叠法:将关键字分割成相同的几部分,然后取这几部分的叠加和(舍去进位)作为哈希地址。
5.除留余数法:取关键字被某个不大于哈希表长m的数p除后所得的余数作为哈希地址
在这里插入图片描述

采用哈希函数通常考虑的因素:
1.计算哈希函数所需时间
2.关键字的长度
3.哈希表的大小
4.关键字的分布情况
5.记录的查找频率

哈希函数在哈希过程中可能出现冲突,即不同关键字哈希后的值相同
处理冲突的方法:
1.开放定址法:例如在除留余数法中,如果不同关键字的余数相同,则将关键字加上i后继续哈希,每冲突一次i加1时就是线性探测再散列方法。
在这里插入图片描述
2.再哈希法:当冲突产生时,则采用另一个哈希函数进行哈希,直到冲突不再发生。
3.链地址法:将产生冲突的同义词,记录存储在同一线性链表中
在这里插入图片描述
4.建立一个公共溢出区:在哈希过程中,若产生冲突,则将其填入溢出表。

哈希表的查找及分析:将给定的K值,根据造表时的哈希函数求得哈希地址,若此位置上没有记录,则查找不成功,否则比较关键字,若相等则查找成功,若不相等,则根据处理冲突的方法找到下一个地址,知道哈希地址为“空”或等于给定值。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值