我在寻找亚马逊的面试问题时想到了这个问题。
给定一个数字,如何在一系列浮点数据中找到最接近的数字?
如果一切都是整数,则answer减去数组中每个数字的数字,然后在数组中查找具有最小绝对值的元素。
但是当谈到浮点时,它应该是高度非暴力的。
Ani的想法?感谢。答案 0 :(得分:4)
浮点数的问题是舍入错误。但是,浮点数的比较不受舍入误差的影响:因此,您可以在线性时间内正确地找到比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
更接近于与自身具有相同符号的值。)