在插值搜索中计算?

时间:2015-09-01 11:14:16

标签: algorithm search

我开始知道插值搜索是对二进制搜索的修改,其中在二进制搜索中,输入在每次迭代中通过计算分成两个相等的一半

mid = (low + high) / 2

并且在插值搜索中,mid计算为

mid = low + (key - arr[low]) * ((high - low) / (arr[high] - arr[low]))

现在我需要理解在插值搜索中计算mid的这个公式。

参考:https://en.wikipedia.org/wiki/Interpolation_search#Sample_implementation

2 个答案:

答案 0 :(得分:7)

您可以将数组arr视为函数f,它作用于索引并返回一个值,该值是单调的(因为数组已排序)。因此,您有初始数据f(low) = mf(high) = M。现在你可以用一条直线插入你的函数f,这是非常合理的,因为你的f是单调的而你只有2分。 所以你的插值应该是通过投掷点(low, m)(high, M)的线(线性函数)。这是它的等式

(y - f(low))/(f(high) - f(low)) = (x - low)/(high - low)

所以y这里是搜索空间的元素,x来自域(x是数组的索引)。因此,如果您的函数f与插值相同,那么key的索引将为:

x = low + (high - low)*(key - f(low))/(f(high) - f(low))

因此,假设您的函数f接近它的插值,您应该只检查f处的值x,看看它是否是目标。否则,您只需缩小插值间隔。

答案 1 :(得分:7)

扩展到 @JustAnotherCurious 回答

他所掌握的等式基于Interpolation Formula(等于线)

  

enter image description here

现在,将f()视为获取索引并返回其y轴值的函数,

y1 = f(low)
y2 = f(high)
x1 = low
x2 = high

(y - f(low)) = [(f(high) - f(low)) / (high - low)] * (x - low);

OR

x = low + [(high - low) * (y - f(low))] / (f(high) - f(low))

here: y = key
we are looking for position(value) of x.