查找算法之二分查找(插值查找)

  对半查找和斐波那契查找对于元素关键字的整体分布没有要求,可以均匀分布,也可以不均匀分布。对于关键字分布不均匀且没有规律的情况,确实很难找到更好的方法提高算法的查找效率;但是如果查找序列的关键字分布均与,那么是可以利用这种均匀性来提高算法效率的,例如使用插值查找。
  在关键字值分布均匀的情况下,使用插值查找可以提高效率,那插值查找的原理是怎样的?下面举一个例子:

关键字2468101214161820
元素值11121513141618202524

  这组序列的关键字在2~20之间均匀分布,这时如果要查找关键字为18的元素值,是不是可以直接计算出关键字为18的元素的存储位置呢?
  用数组来存储这组序列:

数组下标0123456789
关键字2468101214161820
元素值11121513141618202524

  用 (18-2)/(20-2) 可以计算出关键字18在整个关键字序列中的相对位置,是在关键字序列的 8 9 \frac89 98位置,然后用这个相对位置乘上整个序列长度,即(18-2)/(20-2)*(9-0),就可以转换为该关键字在子表中的相对位置,当然这个式子严格意义上并不完整,完整的应该是 (18-2)/(20-2)*(9-0)+0。

在这里插入图片描述

  所以在插值查找算法中的 i i i的计算公式为:
i = l o w + k e y − K l o w K h i g h − K l o w ∗ ( h i g h − l o w ) i = low+\frac{key-K_{low}}{K_{high}-K_{low}}\ast(high-low) i=low+KhighKlowkeyKlow(highlow)

  这是个极端例子,关键字是完全均匀分布的,所以只需计算一次 i i i值就可以查找到对应元素;但是这种情况极为少见,更多的是相对均匀的情况,一次计算并不能解决,这时仍然要采用二分查找的策略,将查找范围一步步划分为更小的子表。

  从这个例子来看,在关键字值分布均匀的情况下,插值查找的平均性能优于对半查找;但是如果关键字值分布非常不均匀的情况下,插值查找的平均性能会差很多。

本篇完 😉

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值