折半查找算法

  1. 折半查找判定树 是一颗 二叉判定树 也是 一棵二叉排序/查找树,即每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值;

  2. 折半查找判定树中的结点都是查找成功的情况
    而将每个结点的空指针指向的一个实际上并不存在的结点——称为外结点,所有外结点即是查找不成功的情况,
    如图7-2(e)虚线框所示。如果有序表的长度为n,则外结点一定有n+1个

  3. 在折半查找判定树中,某结点所在的层数即是查找该结点的比较次数。
    查找不成功时的比较次数即是查找相应外结点时与内结点的比较次数。

    或者换一种方式说:

    成功的折半查找过程,恰好是走了一条从根到被查记录的路径,比较次数恰为该记录在树中的层数。

    若查找失败,则其比较过程是一条根到某个外部结点的路径,比较次数是该路径上内部结点的总数。

  4. 整个判定树代表的有序表的平均查找长度即为查找每个结点的比较次数之和除以有序表的长度。例如,长度为10的有序表的平均查找长度为: ASL=(1×1+2×2+3×4+4×3)/10=29/10
    整个判定树代表的有序表在查找失败时的平均查找长度即为查找每个外结点的比较次数之和除以外结点的个数(1+n)。例如,长度为10的有序表在查找失败时的平均查找长度为: ASL=(3×5+4×6)/11=39/11

    查找成功:

    ①(每层结点数 × 比较次数(层数))/n

    查找失败:
    ① 补全外节点
    ②(每层外节点数×比较次数(上一层层数))/(n+1)

5.具体例子

构造折半二叉树的流程
例:画出(3,17,22,27,40,55,61,75,80,91,97)的折半二叉树

①序列总长度为 n = 11 > 2^3 -1 = 7,即可判定二叉判定树为4层,第4层不满
②先画满n-1的完全二叉树
③还剩几个结点,遵循先右后左补全
④根据中序遍历顺序填入

结果如图: 

查找流程:
比如查找75:
①查找成功,查找到第四层结点
②先拿75和55比较,75大,进入当前结点的左子树,反之进入右子树
③重复②,除非得到相等结果 或 找不到 以下一层的外节点表示。

​ 查找50:
​ ①查找失败,查找到第五层外节点
​ ②先拿50和55比较。55小,进入当前结点的右子树,反之进入左子树
​ ③重复②,除非得到相等结果 或 找不到 以下一层的外节点表示。

比较次数:
查找75:与55比较,与80比较,与61比较,与75比较得到结果——>4次
查找50:与55比较,与22比较,与27比较,与40比较得到外结点——>4次

查找成功时的平均查找长度:【查找每个结点的比较次数之和除以有序表的长度】
ASL=(1×1+2×2+3×4+4×4)/10=33/11=3

查找失败时的平均查找长度:【查找每个外结点的比较次数之和除以外结点的个数】
ASL=(3×4+4×8)/12=44/12=11/3

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值