插值查找
插值查找的核心思想
关键词: 插值
在前面的二分查找法
里,中间值是简单的(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
}