折半查找判定数及平均查找长度

折半查找判定数及平均查找长度

折半查找的过程看,可用二叉树来描述,二叉树中的每个结点对应有序表中的一个记录,结点中的值为该记录在表中的位置。通常称这个描述折半查找二叉树的过程称为折半查找判定树。

例如:长度为10的折半查找判定树的具体生成过程:
都遵循这个规律,左孩子结点<根结点<右孩子结点
    (1)在长度为10的有序表中进行折半查找,不论查找哪个记录,都必须和中间记录进行比较,而中间记录为
(1+10)/2 =5  (注意要取整)   即判定数的的根结点为5,如图7-2(a)所示。
     (2)考虑判定树的左子树,即将查找区域调整到左半区,此时的查找区间为[1,4],那么中间值为(1+4)/2 =2 (注意要取整) ,所以做孩子根结点为2,如图7-2(b)所示。
     (3)考虑判定树的右子树,即将查找区域调整到右半区,此时的查找区间为[6,10],那么中间值为(6+10)/2 =8 (注意要取整) ,所以做孩子根结点为8,如图7-2(c)所示。
       (4)重复以上步骤,依次去确定左右孩子、


1.折半查找是一棵二叉排序树,每个根结点的值都大于左子树的所有结点的值,小于右子树所有结点的值。
2.折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向一个实际上不存在的结点————外结点,所有外界点都是查找不成功的情况,如图7-2(e)所示。如果有序表的长度为n,则外结点一定有n+1个
折半查找判定数中,某结点所在的层数就是即将要比较的次数,整个判定树代表的有序表的平均查找长度即为查找每个结点的比较次数之和除以有序表的 长度。
  例如:长度为10的有序表的平均查找长度为
        ASL=(1*1+2*2+3*4+4*3)/10=29/10;

折半查找判定数中,查找不成功的次数即为查找相应外结点与内结点的比较次数。整个判定树代表的有序表的平均查找长度。查找失败时的有序表的平均查找长度即为查找每个外结点的比较次数之和除以外结点的个数。
如图7-2(e)所示
   例如:查找失败时,。长度为10的有序表的平均查找长度为
 ASL=(3*5+4*6)/11=39/11;

<think>嗯,用户问的是如何计算二分查找的平均查找长度(ASL)。我需要先回顾一下二分查找的基本原理和ASL的定义。ASL分为成功和失败两种情况,但用户可能主要关心成功的情况。根据引用中的信息,二分查找的时间复杂度是O(logn),平均查找长度应该和这个相关。 首先,平均查找长度是指在所有成功查找的情况下,比较次的平均值。对于有序组,二分查找每次将搜索范围减半。可能需要用二叉树模型来分析。比如,一个有序组对应的判定树是一棵平衡二叉树,每个节点的查找次就是其所在的层。 根据引用[2],ASL的计算公式可能与树的深度有关。比如,具有n个节点的判定树深度为⌊log₂n⌋+1,所以每个节点的查找次不超过这个深度。平均查找长度应该是所有节点的层之和除以节点。 可能需要具体例子来说明。比如,当n=7时,判定树是满二叉树,每个节点的查找次是层。第一层1个节点,比较1次;第二层2个节点,比较2次;第三层4个节点,比较3次。总次是1×1 + 2×2 + 4×3=1+4+12=17,平均查找长度是17/7≈2.43。 但如果是n不是2的幂减一的情况,比如n=6,判定树可能不完全平衡。这时需要计算每个节点的层之和,再除以n。可能需要通用公式,如ASL=(1×1 + 2×2 + 4×3 + ... + 2^(h-1)×h)/n,其中h是树的高度。 引用[4]提到二分查找的ASL由平均查找长度公式推导而来,可能涉及对计算。不过用户可能需要更具体的推导过程,比如通过学归纳法或递推关系。 另外,用户提供的引用中有不同的信息,需要整合。例如,引用[2]指出平均时间复杂度为O(log n),而ASL的具体计算可能涉及到判定树的结构。因此,需要将理论公式与实际例子结合,帮助用户理解如何手动计算ASL。 总结步骤可能包括:1. 构建判定树;2. 计算每个节点的比较次;3. 求平均值。对于不同的n,可能需要不同的处理方式,如满二叉树或非满的情况。同时,可能还需要区分成功和失败的情况,但用户主要问的是成功的ASL。</think>### 折半查找平均查找长度计算方法 #### 一、基本概念 折半查找平均查找长度(ASL)定义为**所有成功查找时关键字比较次的平均值**。对于包含$n$个元素的有序组,折半查找通过判定树(平衡二叉搜索树)模型进行计算[^2][^4]。 #### 二、判定树模型 1. **树结构特性** - 每个节点对应组中的一个元素 - 树的高度$h = \lfloor \log_2 n \rfloor + 1$[^2] - 第$k$层节点为$2^{k-1}$(当树为满二叉树时) 2. **比较次与层关系** 元素位于第$k$层时,查找需要比较$k$次 #### 三、计算公式推导(以满二叉树为例) 对于$n=2^h-1$个节点的满二叉树: $$ASL = \frac{1}{n} \sum_{k=1}^{h} k \times 2^{k-1}$$ 展开计算: $$ \begin{align*} \text{当} \ h=3 \ (\text{即}\ n=7) \\ ASL &= \frac{1×1 + 2×2 + 4×3}{7} = \frac{17}{7} \approx 2.43 \end{align*} $$ #### 四、通用情况计算步骤 1. **确定树高度** $h = \lfloor \log_2 n \rfloor + 1$ 2. **分层计算节点** - 前$h-1$层构成满二叉树,节点$2^{h-1}-1$ - 最后一层节点$n - (2^{h-1}-1)$ 3. **分层计算比较次** $$ASL = \frac{1}{n} \left[ \sum_{k=1}^{h-1} k \times 2^{k-1} + h \times (n - 2^{h-1} + 1) \right]$$ **示例**:$n=6$时 - 树高度$h=3$ - 前2层节点$3$,第3层节点$3$ - $ASL = \frac{1×1 + 2×2 + 3×3}{6} = \frac{14}{6} \approx 2.33$ #### 五、近似公式 当$n$较大时可采用近似公式: $$ASL \approx \log_2(n+1) - 1$$ 该公式误差在$0.1$以内[^4][^2]。 #### 六、性能对比 - 最坏情况查找长度:$O(\log n)$[^2] - 平均情况时间复杂度:$O(\log n)$
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值