我在尝试从数组中选择最接近的浮点值时遇到问题。这是一些示例数据;
我将要处理的数字总是具有这种镜像特征。
{-9,-3,-1,0,1,3,9}
如果我搜索-8.8我会期望返回-9。
如果我搜索了8.8,我希望能够返回9。
过去搜索数组中最接近的值时,我会通过数组跟踪每个数组元素的绝对值减去我想要的值。最小的价值会赢。
这个方法对我来说存在问题,因为数组中至少有2个数字“最接近”(在上面的例子中为9& -9)
答案 0 :(得分:2)
您的数组将始终排序,因此二进制搜索应该可以将候选集减少到最多2个数组值。我只能想到一个挑战,如果原始数组包含浮点数,其中一些浮点数的差异小于机器精度。
如何最好地处理这种情况将取决于您的申请(如果它首先不是深奥的);但请注意,与测试值无法区分的所有值将在数组中形成连续的子序列,因此作为启发式,您可能只选择此子序列的中间元素。
答案 1 :(得分:1)
您的阵列镜像的事实使这很容易。您最初可以忽略搜索值的符号,如您所述,只需找到最接近的绝对值即可。然后修好标志。
这是Python,但它应该足够接近伪代码,您可以将其转换为您需要的任何内容。
def find_closest(search_val):
smallest_diff = float(inf)
closest_val = 0
# Search only positive half of array
for val in [0, 1, 3, 9]:
# Treat search_val as positive for now
diff = abs(val - abs(search_val))
if diff < smallest_diff:
smallest_diff = diff
closest_val = val
# Correct sign of result
if search_val < 0:
closest_val = -closest_val
return closest_val
答案 2 :(得分:0)
正如您所提到的,因为您的数字始终在零附近镜像,然后只检查负数(假设您的数组已排序)。你会避免上述问题。 0.5怎么样?它也有两个相等距离的数字。你怎么打破领带?