0

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

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

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

如果我搜索 -8.8,我希望返回 -9。

如果我搜索 8.8,我预计会返回 9。

过去,在搜索数组中最接近的值时,我会遍历数组,跟踪每个数组元素的绝对值减去我想要的值。最小的值将获胜。

该方法在这里给我带来了一个问题,因为数组中至少有 2 个数字是“最接近的”(在我上面的示例 9 和 -9 中)

4

3 回答 3

2

您的数组将始终进行排序,因此二进制搜索应该可以将候选集减少到最大为 2 个数组值。我只能设想一个挑战,如果原始数组包含浮点数,其中一些浮点数的差异小于机器精度。

如何最好地处理这种情况将取决于您的应用程序(如果它首先不是深奥的);但是请注意,与您的测试值无法区分的所有值都将在您的数组中形成一个连续的子序列,因此作为启发式方法,您可能只选择该子序列的中间元素。

于 2013-05-14T13:36:53.993 回答
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
于 2013-05-19T19:08:56.343 回答
0

因为,正如您所提到的,您的数字总是围绕零镜像,所以只检查负数(假设您的数组已排序)。您将避免上述问题。0.5呢?它也有两个等距的数字。你会如何打破领带?

于 2013-05-14T13:20:25.627 回答