我在寻找亚马逊面试题时遇到了这个问题,想要问一下。
给定一个数字,如何在一系列浮点数据中找到最接近的数字?
如果所有数字都是整数,则答案为从数组中的每个数字中减去该数字,然后查找具有最小绝对值的元素。
但是当涉及到浮点数时,应该相对更加复杂。
有任何想法吗?谢谢。
我在寻找亚马逊面试题时遇到了这个问题,想要问一下。
给定一个数字,如何在一系列浮点数据中找到最接近的数字?
如果所有数字都是整数,则答案为从数组中的每个数字中减去该数字,然后查找具有最小绝对值的元素。
但是当涉及到浮点数时,应该相对更加复杂。
有任何想法吗?谢谢。
浮点数存在精度误差问题。但是,浮点数比较不受精度误差影响:因此,您可以在线性时间内正确地找到刚好比x
大和刚好比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 >> x
或x >> sm
时,你才可能出现舍入误差;在任何一种情况下,它都只会增加舍入差异的数量。(如果大小相同,例如如果x=1
和arr=[1e100, -1e100]
,则可以知道x
更接近与自身符号相同的值。)
x=1e100, arr=[-1, 1, 0]
。答案应该是1
,但所有差值的abs
值都等于1e100
;2)x = 1; arr = [-1e100, 1e100]
。那么答案应该是1e100
,但两个差值的abs
都等于1e100
。(而且在后一种情况下二分查找也无法帮助...) - Kolmar