【数据结构10】-查找

1. 查找的基本概念

在这里插入图片描述

注意:判定树用来算ASL。

* 查找的分类
	1. 线性结构
		1. 顺序查找
		2. 折半查找
		3. 分块查找
	2. 树形结构
		1. 二叉排序树
		2. 二叉平衡树
		3. B树、B+树
	3. 散列结构
		* 散列表

2. 线性结构

2.1 顺序查找

2.1.1 顺序查找算法实现

将要查找的元素放在0号位置,逆向顺序查找的方式称为哨兵顺序查找。这种方式只是减少了越界的判断,没有实际性的改变。

在这里插入图片描述

2.1.2 顺序查找的判定树

在这里插入图片描述

2.1.3 小结

在这里插入图片描述

注意:

  1. 顺序查找中,无论元素有序或者无序,其时间复杂度都一样。(可以计算其ASL成功和失败的情况)

2.2 折半查找

2.2.1 折半查找算法实现

在这里插入图片描述

注意:折半查找只适用于关键字有序顺序表。其他的都不适用。

2.2.2 折半查找的判定树

折半查找的判定树的构造过程如下:
在这里插入图片描述

在这里插入图片描述

注意:

  1. 折半查找的下标默认是从0开始,而不是1。
  2. 折半查找的判定树是一个平衡二叉树【因为关键字是按照中序,且每次折半左右子树相差不超过1】。所以其时间复杂度为O(logn),其中n是结点数【非失败结点】。所以其计算高度为:
    1. 最低: h >= log2(n + 1)
    2. 最高:n0 = 0, n1 = 1, n2 = 2, nh = nh-1 + nh-2 + 1
  3. 若有n个结点,则判定树有n + 1失败结点。
  4. 虽然折半查找的效率比顺序查找效率高,但是不是折半查找一定比顺序查找快,而是大部分情况下快。
  5. 默认的折半查找是mid = (low + high) / 2向下取整。但是,也可以设计mid = (low + high) / 2向上取整。两个的区别在于最后两层的结点方向不同。
    在这里插入图片描述
    知道上面这个特点就可以做下面这一题:

在这里插入图片描述

2.2.3 小结

在这里插入图片描述

2.3 分块查找

2.3.1 分块查找的思想(不考代码,掌握思想)

在这里插入图片描述

如果在索引表中查找所处的块使用的是折半查找,则如下:
在这里插入图片描述

注意:折半查找索引表时,若索引表中不包含目标关键字,且low没有越界,则取low的索引。

2.3.2 效率分析

在这里插入图片描述
可能考的点:
在这里插入图片描述

注意:

  1. 顺序查找时,将表分级时,每级多少元素,由n开根号决定,这样查找的效率更高。(在OS中多级页表中可能遇到该问题)
  2. 分块查找的ASL分两部分计算,一部分是索引表,另一部分是选一个块。【注意是一个块,不是所有的】
    在这里插入图片描述
    注意最好情况时选折半查找(顺序/折半)在这里插入图片描述

2.3.3 小结

在这里插入图片描述
扩展:
在这里插入图片描述

3. 树形结构

3.1 B树

3.1.1 B树相关定义

在介绍B树之前,我们先介绍一下5叉查找树。它和判定树的构造方式类似,也是将(-∞, +∞)分割成很多个区间,对比线性结构查找的判定树多了如下两个点:

  1. 每个结点可以存4个关键字,最多有5个分叉。
  2. 结点内部的关键字是有序的,一般由小到大。
  3. 整体类似于: 左子树 < 根 < 右子树

在这里插入图片描述
同时,m叉树还有如下两个重要规定:
在这里插入图片描述

事实上满足以上特征的m叉树就是B树B树的具体定义如下:
在这里插入图片描述

注意:由于B树也属于判定树,即用n个结点将(-∞, +∞)划分成n+1个区间,所以其叶子结点个数必定为n+1

整理一下,B树的重要信息如下:
在这里插入图片描述
在这里插入图片描述

3.1.2 B树的插入

在这里插入图片描述

在这里插入图片描述

注意:如果是根结点分裂会导致树高+1

3.1.3 B树的删除

在这里插入图片描述

在这里插入图片描述

3.1.4 小结

在这里插入图片描述
在这里插入图片描述

3.2 B+树

3.2.1 B+树基本概念

在这里插入图片描述

注意:

  1. B+树,可以通过p指针实现顺序查找,也可以从根结点出发使用多路查找
  2. B+的分支结点存放的是索引,不是实际的值,所以其无论查找成功与否,最终一定都要走到最下面一层结点。而在B树中,可能在分支结点处就停了。
  3. B+树不是判定树,所以n个结点的B+树其叶子结点不满足n+1

补充说明:
在这里插入图片描述

3.2.2 B+树 VS B树

在这里插入图片描述

注意:B树和B+树都可以用于文件索引结构,但是B+树的读写代价更低,更加稳定。

在这里插入图片描述

4. 散列结构

4.1 散列查找

4.1.1 基本概念

在这里插入图片描述

解决冲突的方法:
	1. 拉链法
	2. 开放定址法
	3. 再散列法

注意:

  1. 冲突是无法避免的,与填充因子无关。
  2. 散列表的平均查找长度与填充因子有关,与表长无关。
  3. 散列表中删除一个元素,不能简单的将元素删除。因为如果散列表采用的是开放地址法,会导致查找中断,删除元素的地方需要做标记。
  4. 冲突不等于聚集,聚集是元素扎堆存放,其他位置没有元素。只有开放地址法中的线性探测法任意引起聚集现象,其他的都不会。

在这里插入图片描述

4.1.2 拉链法

在这里插入图片描述

4.1.3 开放定址法

在这里插入图片描述

注意:开放地址法,在第一次确定关键字的位置时,MOD的长度是<=表长m的质数,冲突时才MOD表长m。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:平方探测法中,散列表⻓度m必须是一个可以表示成4j + 3的素数,才能探测到所有位置

4.1.4 再散列法

在这里插入图片描述

4.1.5 小结

在这里插入图片描述

注意:

  1. 散列表的查找效率取决于以下三个因素:
    1. 散列函数。
    2. 处理冲突的方法
    3. 填装因子α。冲突的概率与填充因子的大小成正比,所以要提高效率应该减少α
  • 提高散列表查找效率的核心是减少冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值