目录
平均查找时间
ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均 需要 和 待查找值比较的 关键字次数 称为平均查找长度。
它的定义是这样的:
其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。
-
①顺序查找
Ci(第i个元素的比较次数)在于这个元素在查找表中的位置,如第0号元素就需要比较一次,第一号元素比较2次…第n号元素要比较n+1次。所以Ci=i;所以
可以看出,顺序查找方法 查找成功的 平均比较次数约为表长的一半。
当待查找元素不在查找表中时,也就是扫描整个表都没有找到,即比较了n次,查找失败
-
②折半查找
- 要求待查找表是有序表,顺序存储结构
- 用二叉树描述查找过程,查找区间中间位置作为根,左子表为左子树,右子表为右子树,因为这颗树也被称为判定树(decision tree)或比较树(Comparison tree)。
- 查找方式为(找k),先与树根结点进行比较:
若k小于根,则转向左子树继续比较;若k大于根,则转向右子树,递归进行上述过程,直到查找成功或查找失败。
折半查找法在查找不成功时和给定值进行关键字的比较次数最多为树的高度。 -
在n个元素的折半查找判定树中,由于关键字序列是用树构建的,所以查找路径实际为树中从根节点到被查结点的一条路径,因为比较次数刚好为该元素在树中的层数。
而在这样的判定树中,会有n+!种查找失败的情况,因为将判定树构建为完全二叉树
又有n+1个外部结点(用Ei(0<=i<=n)表示),查找失败,即为从根结点到某个外部结点
也没有找到,比较次数为该内部结点的结点数个数之和
qi表示查找属于Ei中关键字的概率,level(Ui)表示Ei对应外部结点的层次。
所以,在一颗有n个结点判定树中,总数, 判定树高度为(向上取整)的满二叉树,第i层上结点个数为,查找该层上的结点需要进行i次比较。
因此,在等概率情况下ASL为 看个例子会更好理解。
例:给11个数据元素有序表(2,3,10,15,20,25,28,29,30,35,40)采用折半查找。则ASL成功和不成功分别是多少?
首先画出判定树,
查找成功时总会找到途中某个内部结点,所以成功时的平均查找长度为
即25查找一次,成功,10,30要查找2次,成功.
而不成功的平均查找长度为
为什么这么算呢,因为内部结点都能查找成功,而查找不成功的就是那些空的外部结点,所以到查询到2的左孩子,15的左孩子,
28的左孩子,35的左孩子,3的左右孩子,20的左右孩子,29的左右孩子,40的左右孩子时,都是查找不成功的时候。
如我要找1,比25小,转向左子树,比较一次,比10小,转左子树,2次,比2 小,转左子树,3次,此时2无左子树,所以失败。所以
③分块查找
- 建立一个索引表——索引项(关键字项<子表内最大的关键字>、指针项)
- 块内:只能顺序查找
- 平均查找长度:ASL=Lb(查找索引项确定所在块)+Lw(块内查找元素)
- 平均查找长度:ASL=Lb(查找索引项确定所在块)+Lw(块内查找元素)
树表的查找
1、二叉排序树
🎯 折半查找长度为n的顺序表的判定树是唯一的,而含有n个结点的二叉排序树不唯一
含有n个结点的二叉排序树平均查找长度和树的形态有关
- 树的高度越小,查找速度越快
维护表的有序性,二叉排序树更有效,无需移动记录,只需要修改指针
- 插入:不存在关键字等于key的结点才进行插入,O(log2 n)
- 创建:结束标志 n次插入操作:O(nlog2 n)
- 删除:缺左子树,缺右子树,缺左右子树 ,O(log2 n)
2、平衡二叉树 (AVL树)
判断「平衡二叉树」的 2 个条件:
- 1. 是「二叉排序树」
- 2. 任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)
3.1 平衡因子 BF
定义:左子树和右子树高度差
计算:左子树高度 - 右子树高度的值
别名:简称 BF(Balance Factor)
一般来说 BF 的绝对值大于 1,,平衡树二叉树就失衡,需要「旋转」纠正
3.2 最小不平衡子树
距离插入节点最近的,并且 BF 的绝对值大于 1 的节点为根节点 的子树。
「旋转」纠正只需要纠正「最小不平衡子树」即可
4. 二种旋转方式
左旋
旧根节点为新根节点的左子树
新根节点的左子树(如果存在)为旧根节点的右子树
右旋:
旧根节点为新根节点的右子树
新根节点的右子树(如果存在)为旧根节点的左子树
4 种「旋转」纠正类型:
LL 型:插入左孩子的左子树,右旋
RR 型:插入右孩子的右子树,左旋
LR 型:插入左孩子的右子树,先左旋,再右旋
RL 型:插入右孩子的左子树,先右旋,再左旋