运用插值法解决静态查找问题

静态查找问题描述为:给定一个整数和一个数组,查找该整数在这个数组中的位置或返回一个不存在的标志,在查找过程中数组中的数据是不变的。例如在一个电话号码本里查找某一个人。如果数组中的数据是无序的,我们只能用顺序查找来检查数组中的每一个值,直到找到一个匹配的为止。如果数组中的数据已经排过序,就可以使用二分搜索来代替顺序查找。二分搜索每次都是从给定查找范围的中间开始而不是从端点开始,这样可以提高查找效率。二分搜索在查找一个有序的静态数组时很快,是我们经常使用的方法。但是如果我们要查找的值在靠近端点的位置,这时再使用二分搜索显然是不明智的。这时就可以使用更快的一种查找方法插值法。插值法不是简单地使用中间值来查找,而是要对查找值所在的位置做一个正确的猜测,来确定要查找的一下项。

下面是插值法的boo实现:

import System

def interpolationSearch(obj as int, *args as (int)):
	low = 0
	high = args.Length - 1
	next as int
	while low < high:
      //to determine the position of the next item
		next = low + ((obj - args[low]) / (args[high] - args[low])) * (high - low - 1)
		if args[next] < obj:
			low = next + 1
		else:
			high = next
		
	if args[low] == obj:
		return low
	
	return -1

 

>>>a = array(range(3, 1000))
...
>>>interpolationSearch(85, *a)
82
>>>

 上面在数组a中查找85所在的位置,返回82.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值