查找——折半查找(原理)

文章介绍了折半查找算法的工作原理,通过示例展示了在有序序列中查找特定元素的过程。同时,文章详细解释了如何计算平均查找长度,包括成功和不成功查找的情况,并提供了具体的计算公式。此外,还讨论了如何根据判定树分析查找过程中关键字的比较次数。
摘要由CSDN通过智能技术生成

折半查找算法原理

  • 别名:二分查找
  • 要求线性表是有序表
  • 查找思路:设R[low,…,high]是当前的非空查找索引区间(下界为low,上界为high),首先确定该区间的中间位置mid,mid=(low+high)/2。(向下取整)然后将待查的k值与R[mid].key进行比较:
        若:k=R[mid].key,则查找成功。
        若:k<R[mid].key,确定新的查找索引区间为[low,…,mid-1]。继续在新的索引区间进行折半查找。直到k=R[mid].key为止。
        若:k<R[mid].key,确定新的查找索引区间为[mid+1,…,high]。继续在新的索引区间进行折半查找。直到k=R[mid].key为止。

【例题】

在关键字有序序列(2,4,7,9,10,14,18,26,32,40)中采用折半查找方法查找关键字为7的元素。

查找过程如下:
在这里插入图片描述

有关折半查找涉及到的理论计算

折半查找中的各种理论计算,都可以通过画出判定树来得出结果。
所以,给出一个数据序列,会画出该序列的判定树是致胜的关键。


【判定树】
在折半查找的判定树中,为了方便后续的计算。给出了两个概念:内部结点和外部结点。
判定树中,所有结点的空指针都指向一个外部结点(用方形表示□),其它称为内部结点。(意思就是如果一个结点有左右子结点那它就是一个内部结点,要是缺了左子结点,就给它画一个用方形表示的左子结点,要是缺了右子结点,就给它画一个用方形表示的右子结点,要是缺了左子结点和右子结点,就给它画一个用方形表示的左子结点和右子结点。)

【例题】
给出一个有序序列(2,4,7,9,10,14,18,26,32,40),要求画出该有序序列进行折半查找的判定树。

判定树如下图所示:
在这里插入图片描述

给出一个有序序列(2,3,10,15,20,25,28,29,30,35,40),要求画出该有序序列进行折半查找的判定树。

判定树如下图所示:
在这里插入图片描述
给出一个有序序列(15,20,30,37,45,56,69,70),要求画出该有序序列进行折半查找的判定树。

判定树如下图所示:
在这里插入图片描述

1、求平均查找长度(ASL)

所谓平均查找长度,就是指数据序列中每个关键字的平均比较次数。平均查找长度是衡量一个查找算法效率优劣的重要依据

平均查找长度=每个关键字的查找次数之和/总的关键字数

由于查找的结果有查找成功和不成功两种情况。所以平均查找长度也分为:成功情况下的平均查找长度和不成功情况下的平均查找长度

ASL(成功)= 所有内部结点的关键字比较次数之和 内部结点总数 \frac{所有内部结点的关键字比较次数之和}{内部结点总数} 内部结点总数所有内部结点的关键字比较次数之和

                = ( 每一层的内部结点数 × 层数 ) 之和 内部结点总数 \frac{(每一层的内部结点数×层数)之和}{内部结点总数} 内部结点总数(每一层的内部结点数×层数)之和

ASL(不成功)= 所有外部结点的关键字比较次数之和 外部结点总数 \frac{所有外部结点的关键字比较次数之和}{外部结点总数} 外部结点总数所有外部结点的关键字比较次数之和

                    = ( 每一层的外部结点数 × ( 层数 − 1 ) ) 之和 外部结点总数 \frac{(每一层的外部结点数×(层数-1))之和}{外部结点总数} 外部结点总数(每一层的外部结点数×(层数1))之和

在一棵判定树中,外部结点的总数总是比内部结点的总数多1
成功的折半查找过程恰好是走了一条从判定树的根到被查结点(某个内部结点)的路径,经历比较的关键字次数恰好为该结点在树中的层数。
不成功的折半查找过程经历了一条从判定树的根到某个外部结点的路径,所需关键字的比较次数是该路径上内部结点的总数,或者说是该外部结点在树中的层数减1。


【例题】
给定11个元素的有序表(2,3,10,15,20,25,28,29,30,35,40),采用折半查找。试问:假设查找表中每个元素的概率相同,求查找成功时的平均查找长度和查找不成功时的平均查找长度。
解析:
第一步:画出对应的折半查找判定树(标注好内部结点和外部结点)
第二步:根据公式、内部结点数和外部结点数得出运算结果
在这里插入图片描述
由判定树可知,内部结点只存在在前4层。由题目可知内部结点的总数为11
第1层的内部结点数为1
第2层的内部结点数为2
第3层的内部结点数为4
第4层的内部结点数为4
由此,可得出:在等概率时,成功查找情况下的平均查找长度为:
ASL(成功)= 1 × 1 + 2 × 2 + 4 × 3 + 4 × 4 11 \frac{1×1+2×2+4×3+4×4}{11 } 111×1+2×2+4×3+4×4 = 3

由判定树可知,外部结点只存在在后两层。外部结点的总数总是等于内部结点总数+1,即12
第4层的外部结点数为4
第5层的外部结点数为8
由此,可得出:在等概率时,不成功查找情况下的平均查找长度为:
ASL(不成功)= 4 × 3 + 8 × 4 12 \frac{4×3+8×4}{12 } 124×3+8×4 = 3.67

2、求某个关键字的比较(查找)次数&&列出某个关键字将依次与序列中的哪些元素进行比较

【例题】
给定11个元素的有序表(2,3,10,15,20,25,28,29,30,35,40),采用折半查找。试问:
(1)若查找给定值为20的元素,将依次与表中的哪些元素比较?比较几次?
(2)若查找给定值为26的元素,将依次与表中的哪些元素比较?比较几次?

解析:
第一步:画出对应的折半查找判定树(标注好内部结点和外部结点)
第二步:根据原理,得出判断结果。
对应的折半查找判定树如下所示:
在这里插入图片描述
第一小问:若查找给定值为20的元素,将依次与表中的哪些元素比较?比较几次?
在这里插入图片描述
由图可知,将会依次与表中的25,10,15,20元素比较,共比较4次。(成功的折半查找过程恰好是走了一条从判定树的根到被查结点(某个内部结点)的路径,经历比较的关键字次数恰好为该结点在树中的层数。)

第二小问:若查找给定值为26的元素,将依次与表中的哪些元素比较?比较几次?
在这里插入图片描述
解析:在整个判定树中并不存在26这个元素,所以查找一定是不成功的。而不成功的查找一定是落在某个外部结点上面,因为26大于根结点25,所以26一定是在25的右子树上,依次往下,26最接近小于28,所以位于28的左子树。(对于一个折半查找判定树来说,根结点的左子树上所有的结点均小于根结点,根结点的右子树上所有的结点均大于根结点)。
由此,通过标注出路径图可知:查找26时,将会依次与表中的25,30,28元素比较,共比较3次。
(不成功的折半查找过程经历了一条从判定树的根到某个外部结点的路径,所需关键字的比较次数是该路径上内部结点的总数,或者说是该外部结点在树中的层数减1。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

立志Java工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值