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

文章目录

    • 折半查找算法原理
    • 有关折半查找涉及到的理论计算
      • 1、求平均查找长度(ASL)
      • 2、求某个关键字的比较(查找)次数&&列出某个关键字将依次与序列中的哪些元素进行比较

折半查找算法原理

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

【例题】

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

查找过程如下:
查找——折半查找(原理)_第1张图片

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

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


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

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

判定树如下图所示:
查找——折半查找(原理)_第2张图片

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

判定树如下图所示:
查找——折半查找(原理)_第3张图片
给出一个有序序列(15,20,30,37,45,56,69,70),要求画出该有序序列进行折半查找的判定树。

判定树如下图所示:
查找——折半查找(原理)_第4张图片

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),采用折半查找。试问:假设查找表中每个元素的概率相同,求查找成功时的平均查找长度和查找不成功时的平均查找长度。
解析:
第一步:画出对应的折半查找判定树(标注好内部结点和外部结点)
第二步:根据公式、内部结点数和外部结点数得出运算结果
查找——折半查找(原理)_第5张图片
由判定树可知,内部结点只存在在前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的元素,将依次与表中的哪些元素比较?比较几次?

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

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

你可能感兴趣的:(算法,数据结构,c++)