搜索数组中最近的浮点值

时间:2013-05-14 13:17:24

标签: objective-c algorithm

我在尝试从数组中选择最接近的浮点值时遇到问题。这是一些示例数据;

我将要处理的数字总是具有这种镜像特征。

{-9,-3,-1,0,1,3,9}

如果我搜索-8.8我会期望返回-9。

如果我搜索了8.8,我希望能够返回9。

过去搜索数组中最接近的值时,我会通过数组跟踪每个数组元素的绝对值减去我想要的值。最小的价值会赢。

这个方法对我来说存在问题,因为数组中至少有2个数字“最接近”(在上面的例子中为9& -9)

3 个答案:

答案 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怎么样?它也有两个相等距离的数字。你怎么打破领带?