2. 基础查找算法——插值查找(golang)

本文介绍了插值查找算法的核心思想,指出在查找过程中,枢轴位置不再总是中间值,而是根据查找值与范围边界的关系确定。插值查找利用公式`mid = low + (high - low) * (key - data[low]) / (data[high] - data[low])`来计算中间位置。文章还提及了在英文字典中查找单词时应用类似策略的例子,并提供了Golang的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


插值查找


插值查找的核心思想


关键词: 插值

在前面的二分查找法里,中间值是简单的(low+high) / 2

假设你在英文字典查找单词apple,你会怎么查呢?很显然你不会从中间开始查找,而是有目的地往前或者往后去翻。

也就是说,枢轴不应该是绝对的中间值,而是应该根据查找值与最大最小值的关系去确认枢轴。

插值公式:

mid := (low + high) / 2
mid = low + (high - low) * 1/2
假设data位于中间值与high之间,则:
mid = low + (high - low) * (data-low) / (high - low)


代码实现

func MidSearch(arr []int, data int) int {

	low := 0
	high := len(arr) - 1

	i := 0
	//循环的终止条件
	for low <= high {
		i++
		
		// 大段
		leftv := float64(data - arr[low])

		// 整段
		allv := float64(arr[high] - arr[low])

		// 整段差
		diff := float64(high - low)

		// 计算中间值
		mid := int(float64(low) + diff*leftv/allv)

		if mid < 0 || mid >= len(arr) {
			return -1
		}

		if arr[mid] > data {
			high = mid - 1
		} else if arr[mid] < data {
			low = mid + 1
		} else {
			return mid
		}
	}
	return -1

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值