【数据结构10】-查找

导读:本篇文章讲解 【数据结构10】-查找,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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. 填装因子α。冲突的概率与填充因子的大小成正比,所以要提高效率应该减少α
  • 提高散列表查找效率的核心是减少冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84597.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!