【问题标题】:Given a number, how to find a closest number in a series of floating point data给定一个数字,如何在一系列浮点数据中找到最接近的数字
【发布时间】:2015-05-13 19:32:03
【问题描述】:

我在寻找亚马逊面试问题时遇到了这个问题并想问。

给定一个数字,如何在一系列浮点数据中找到最接近的数字?

如果一切都是整数,答案是从数组中的每个数字中减去数字,然后在数组中寻找绝对值最小的元素。

但是当涉及到浮点时,它应该是非常nontirival的。

阿尼的想法??谢谢。

【问题讨论】:

  • 你认为浮点数为什么会改变算法?
  • “系列”到底是什么意思?您可以对其进行排序并使用二进制搜索吗?二进制搜索不应该有浮点问题。
  • If everything is integer , answer is substracting the number from every number in the array, then look for the minimal element of the array. 不是指最小绝对值(即最接近零)吗?还是我完全误解了你想要达到的目标?
  • @MarkRansom 浮点的问题是精度有限。示例:1)x=1e100, arr=[-1, 1, 0]。答案应该是1,但所有abs 的差异值都等于1e100; 2)x = 1; arr = [-1e100, 1e100]。那么答案应该是1e100,但两者的差异abs 等于1e100。 (并且二进制搜索在后一种情况下也无济于事......)
  • @amit,你完全正确。我的意思是绝对值,我的写法不正确。

标签: algorithm floating-point-precision


【解决方案1】:

浮点数的问题是舍入错误。但是,浮点数的比较不会出现舍入误差:因此,您可以在线性时间内正确地找到刚好大于和小于 x 的数字:

sm = -inf;
bg = inf;
for(i from 0 to n)
  if(arr[i] > x && arr[i] < bg)
    bg = arr[i];
  if(arr[i] < x && arr[i] > sm)
    sm = arr[i];

现在您只需要确定这两个数字中哪个更接近x。由于bg 更大而sm 更小,因此只有在bg &gt;&gt; xx &gt;&gt; sm 时才会出现舍入误差;在这两种情况下,它只会增加舍入差异的幅度。

(如果大小相同,例如x=1arr=[1e100, -1e100],则可以知道x更接近与自身同号的值。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-07-29
    • 2021-08-09
    • 2019-07-11
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多