文章目录
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 小结
注意:
- 顺序查找中,无论元素有序或者无序,其时间复杂度都一样。(可以计算其ASL成功和失败的情况)
2.2 折半查找
2.2.1 折半查找算法实现
注意:折半查找只适用于关键字
有序
的顺序表
。其他的都不适用。
2.2.2 折半查找的判定树
折半查找的判定树的构造过程如下:
注意:
- 折半查找的下标默认是从0开始,而不是1。
- 折半查找的判定树是一个平衡二叉树【因为关键字是按照中序,且每次折半左右子树相差不超过1】。所以其时间复杂度为
O(logn)
,其中n是结点数【非失败结点】。所以其计算高度为:
- 最低: h >= log2(n + 1)
- 最高:n0 = 0, n1 = 1, n2 = 2, nh = nh-1 + nh-2 + 1
- 若有
n
个结点,则判定树有n + 1
失败结点。- 虽然折半查找的效率比顺序查找效率高,但是不是折半查找一定比顺序查找快,而是大部分情况下快。
- 默认的折半查找是
mid = (low + high) / 2
向下取整。但是,也可以设计mid = (low + high) / 2
向上取整。两个的区别在于最后两层的结点方向不同。
知道上面这个特点就可以做下面这一题:
2.2.3 小结
2.3 分块查找
2.3.1 分块查找的思想(不考代码,掌握思想)
如果在索引表中查找所处的块使用的是折半查找,则如下:
注意:折半查找索引表时,若索引表中不包含目标关键字,且
low
没有越界,则取low
的索引。
2.3.2 效率分析
可能考的点:
注意:
- 顺序查找时,将表分级时,每级多少元素,由n开根号决定,这样查找的效率更高。(在OS中多级页表中可能遇到该问题)
- 分块查找的ASL分两部分计算,一部分是索引表,另一部分是选一个块。【注意是一个块,不是所有的】
注意最好情况时选折半查找(顺序/折半)
2.3.3 小结
扩展:
3. 树形结构
3.1 B树
3.1.1 B树相关定义
在介绍B树
之前,我们先介绍一下5叉查找树
。它和判定树的构造方式类似,也是将(-∞, +∞)
分割成很多个区间,对比线性结构查找的判定树多了如下两个点:
- 每个结点可以存
4
个关键字,最多有5个分叉。 - 结点内部的关键字是有序的,一般由小到大。
- 整体类似于: 左子树 < 根 < 右子树
同时,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+树基本概念
注意:
B+
树,可以通过p
指针实现顺序查找
,也可以从根结点出发使用多路查找
。- B+的分支结点存放的是索引,不是实际的值,所以其无论查找成功与否,最终一定都要走到最下面一层结点。而在B树中,可能在分支结点处就停了。
B+
树不是判定树,所以n个结点的B+
树其叶子结点不满足n+1
补充说明:
3.2.2 B+树 VS B树
注意:
B
树和B+
树都可以用于文件索引结构,但是B+
树的读写代价更低,更加稳定。
4. 散列结构
4.1 散列查找
4.1.1 基本概念
解决冲突的方法:
1. 拉链法
2. 开放定址法
3. 再散列法
注意:
- 冲突是无法避免的,与填充因子无关。
- 散列表的平均查找长度与填充因子有关,与表长无关。
- 散列表中删除一个元素,不能简单的将元素删除。因为如果散列表采用的是开放地址法,会导致查找中断,删除元素的地方需要做标记。
- 冲突不等于聚集,聚集是元素扎堆存放,其他位置没有元素。只有开放地址法中的线性探测法任意引起聚集现象,其他的都不会。
4.1.2 拉链法
4.1.3 开放定址法
注意:开放地址法,在第一次确定关键字的位置时,MOD的长度是<=表长m的质数,冲突时才MOD表长m。
注意:平方探测法中,散列表⻓度m必须是一个可以表示成4j + 3的素数,才能探测到所有位置
4.1.4 再散列法
4.1.5 小结
注意:
- 散列表的查找效率取决于以下三个因素:
- 散列函数。
- 处理冲突的方法
- 填装因子α。冲突的概率与填充因子的大小成正比,所以要提高效率应该减少α
- 提高散列表查找效率的核心是减少冲突。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84597.html