7.1查找的基本概念
在哪查找?
查找表
什么是查找?
主关键字:只能对应一个;次关键字:可以对应多个 ;
查找是否成功?
查找的目的
- 查询某个特定的数据元素是否在查找表中
- 检索某个特定的数据元素的各种属性
- 在查找表中插入一个数据元素
- 删除查找表中的某个数据元素
查找表的分类
- 静态查找表:不改变查找表的数据
- 动态查找表:改变查找表的数据
如何评价查找算法
7.2线性表的查找
7.2.1顺序查找
算法的其他形式
算法7.1的改进
改进:把待查关键字key存入表头(“监视哨”),从后往前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。
时间效率分析:比较次数与key位置有关
- 查找第i个元素,需要比较n-i+1次
- 查找失败,需比较n+1次
顺序查找的特点
优点:算法简单,逻辑次序无要求,且不同存储结构均适用
缺点:ASL太长,时间效率太低
7.2.2折半查找(二分或对分查找)——有序表
折半查找:每次将带查找记录所在区间缩小一半。
折半查找算法(非递归算法)
思想
具体算法
递归算法
前半区:Search_Bin(SSTable ST, keyType key, int low, int mid-1);
后半区:Search_Bin(SSTable ST, keyType key, int mid+1, int high);
折半查找的性能分析——判定树
优点:效率比顺序查找高
缺点:只适用于有序表,且有限于顺序存储结构
7.2.3分块查找(索引顺序查找)
性能分析
顺序法:ASL=(n+1)/2
折半法 :ASL=log2(n+1)
分块查找的优缺点
查找方法比较
7.3树表的查找![](https://i-blog.csdnimg.cn/blog_migrate/651d9833ed95b71e79f329bb605d394d.png)
7.3.1二叉排序树
例题
左:48不符合“左子树上所有结点小于根结点”
右:bang不符合“右子树上所有结点大于等于根结点”(按字母先后顺序)
二叉排序树的操作——查找
思路
算法描述
时间跟树的形态(高度)有关
二叉排序树的操作——插入
思路
二叉排序树的操作——生成
二叉排序树的操作——删除
- 删除叶子结点:直接删除该结点,其双亲结点中相应指针域的值为“空”
- 删除的结点只有左子树或右子树:用其左子树或右子树替换它,其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树”
- 被删除的结点既有左子树又有右子树
总结:
1、前驱进行替换:再根据该前驱结点属于删除的哪三种情况进行相应的删除
2、后继进行替换:再根据该后继结点属于删除的哪三种情况进行相应的删除
7.3.2平衡二叉树(AVL树)
定义
平衡因子
例题
总结:
1、要保证平衡二叉树里面的每个结点都是一个平衡树
2、当发现两个结点都失衡,选择根结点的子树较少的那个结点(越靠下的)
失衡二叉排序树的分析与调整
平衡调整的四种类型:
调整原则:1)降低高度 2)保持二叉排序树的性质
1、LL型调整过程
例题
2、RR型调整过程
3、LR型调整
例题
4、RL调整过程
例题
7.4散列(哈希)表的查找
7.4.1散列表的基本概念
散列表相关术语
7.4.2散列函数的构造方法
考虑的因素
- 执行速度
- 关键字的长度
- 散列表的大小
- 关键字的分布情况
- 查找频率
直接定址法
除留余数法
处理冲突的方法
- 开放定址法
- 链地址法
- 再散列法
- 建立一个公共溢出区
1、开放定址法(开地址法)
1.1. 例题:线性探测法
总结:存入和查找原理类似
1.2二次探测法
1.3 伪随机探测法
2、链地址法(拉链法)
7.4.4散列表的查找
例题
使用平均查找长度ASL来衡量查找算法,ASL取决于
- 散列函数
- 处理冲突的方法
- 散列表的装填因子a(a=表中填入的长度/哈希表的长度)
总结:
1、散列表技术具有很好的平均性能,优于一些传统的技术
2、链地址法优于开地址法
3、除留余数法作散列函数优于其他类型函数