我尝试从数组中选择最接近的浮点值时出现问题。以下是一些示例数据;在数组中搜索最接近的浮点值
我将要处理的数字总是共享这种镜像特性。
{-9,-3,-1,0,1,3,9}
如果我搜索-8.8,我希望返回-9。
如果我搜索了8.8我希望寻找阵列的最接近的值,我会去通过阵列跟踪绝对值对于每个数组元素减去值时,我要返回9.
在过去通缉。最小的值会赢。
这种方法在这里提出了一个问题对我来说寿,因为在阵列中至少2个数字是“最接近”(在我上面的例子9 & -9)
我尝试从数组中选择最接近的浮点值时出现问题。以下是一些示例数据;在数组中搜索最接近的浮点值
我将要处理的数字总是共享这种镜像特性。
{-9,-3,-1,0,1,3,9}
如果我搜索-8.8,我希望返回-9。
如果我搜索了8.8我希望寻找阵列的最接近的值,我会去通过阵列跟踪绝对值对于每个数组元素减去值时,我要返回9.
在过去通缉。最小的值会赢。
这种方法在这里提出了一个问题对我来说寿,因为在阵列中至少2个数字是“最接近”(在我上面的例子9 & -9)
因为,正如你提到的,您的号码是总是镜像在零附近,然后只检查负数(假设数组已排序)。你会避免提到的问题。那么0.5呢?它也有两个距离相等的数字。你将如何打破领带?
该数组将始终被排序。所以我猜如果我的搜索值小于0,搜索数组的前半部分,如果大于0搜索数组的后半部分?这是我现在要尝试的。在0.5的情况下......我不确定 – dubbeat 2013-05-14 13:24:31
您的数组将始终被排序,因此二分搜索应该可以将候选集合减少到最大2个数组值。我只能想象一个挑战,如果原始数组包含浮点数,其中一些差异小于机器精度,那么就会出现这种挑战。
如何处理这种情况最好取决于你的应用程序(如果它不是首先深奥的);但是请注意,所有与您的测试值无法区分的值将在您的数组中形成一个连续的子序列,因此作为启发式,您可以选择此子序列的中间元素。
事实上,你的数组是镜像使得这很容易。您最初可以忽略搜索值的符号,如您所述,只需找到最接近的绝对值即可。然后修复标志。
这是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
这确实是一个错字。我编辑了我的问题 – dubbeat 2013-05-15 08:53:56