首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插值搜索中的中间计算?

插值搜索中的中间计算?
EN

Stack Overflow用户
提问于 2015-09-01 11:14:15
回答 2查看 2.9K关注 0票数 10

我知道插值搜索是对二进制搜索的一种改进,在二进制搜索中,通过计算,输入在每次迭代中被分成两等份。

代码语言:javascript
运行
复制
mid = (low + high) / 2

在插值搜索中,中间值被计算为

代码语言:javascript
运行
复制
mid = low + (key - arr[low]) * ((high - low) / (arr[high] - arr[low]))

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

参考文献:实现

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 11:47:37

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

代码语言:javascript
运行
复制
(y - f(low))/(f(high) - f(low)) = (x - low)/(high - low)

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

代码语言:javascript
运行
复制
x = low + (high - low)*(key - f(low))/(f(high) - f(low))

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

票数 11
EN

Stack Overflow用户

发布于 2017-07-16 17:17:17

扩展到@ answer -另一个有趣的答案

他提出的方程是基于插值公式 (一条线的方程)。

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

代码语言:javascript
运行
复制
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.
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32330185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档