Objective c 在数组中搜索最近的浮点值

Objective c 在数组中搜索最近的浮点值,objective-c,algorithm,Objective C,Algorithm,我在尝试从数组中选择最接近的浮点值时遇到问题。下面是一些示例数据 我将要处理的数字总是具有这种镜像特征 {-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.5怎么样?它也有两个相等距离的数字。如何打破僵局?

您的数组总是会被排序的,因此二进制搜索应该能够最大限度地将候选集减少到2个数组值。我只能想象一个挑战,如果原始数组包含浮点数,其中一些浮点数的差异小于机器精度,则会出现这种挑战


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

您的数组将始终被排序,因此,二进制搜索应该能够最大限度地将候选集减少到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
def find_closest(搜索值):
最小_diff=浮动(inf)
最近值=0
#只搜索数组的正一半
对于[0,1,3,9]中的val:
#暂时将搜索值视为阳性
差异=绝对值(val-绝对值(搜索值))
如果差异<最小差异:
最小_diff=diff
最近的_val=val
#正确的结果符号
如果搜索值<0:
最近值=-最近值
返回最近值

阵列已镜像这一事实使此操作变得简单。您可以先忽略搜索值的符号,如您所述,只需找到最接近的绝对值。然后把牌子修好

这是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
def find_closest(搜索值):
最小_diff=浮动(inf)
最近值=0
#只搜索数组的正一半
对于[0,1,3,9]中的val:
#暂时将搜索值视为阳性
差异=绝对值(val-绝对值(搜索值))
如果差异<最小差异:
最小_diff=diff
最近的_val=val
#正确的结果符号
如果搜索值<0:
最近值=-最近值
返回最近值

数组将始终被排序。所以我猜如果我的搜索值小于0,搜索数组的前半部分,如果它大于0,搜索数组的后半部分?这就是我现在要尝试的。在0.5的情况下。。。。。。我不确定数组是否总是被排序的。所以我猜如果我的搜索值小于0,搜索数组的前半部分,如果它大于0,搜索数组的后半部分?这就是我现在要尝试的。在0.5的情况下。。。。。。我不确定那确实是个打字错误。我编辑了我的问题,这确实是一个打字错误。我已编辑了我的问题