搜索未排序的非均匀对数组以获得最近的条目

时间:2013-08-07 09:06:04

标签: arrays list search closest

我有一个看起来像这样的数组:

[[320, 80], [300, 70], [300, 80], [270, 75], [260, 70], [280, 70]]

这只是一个片段,实际数组是338大。

我试图根据一些输入找到数组中的下一个逻辑元素。所以例如我输入两个数字,即。 315, 80如果你想找到更大的条目,那么下一个逻辑是320, 80

我不想将逻辑关联到最接近,因为它取决于您是否需要更大或更小的元素。所以我认为逻辑上我的意思是“最接近所需的方向”

作为附加要求,第二个数字应尽量保持与输入值尽可能接近,或者第一个数字应尽量保持与原始数字尽可能接近。

我遇到275, 70等案件时遇到问题,我想找到下一个最小的案例。该 应为260, 70,但我的实施仍在继续挑选280, 70

我当前的实现增加了两个数字之间的差异,并寻找可能的最小差异。我不确定如何强制执行方向。

Python示例(虽然我真的在寻找与语言无关的解决方案)

elements = [ [320, 80],
             [300, 70],
             [300, 80],
             [270, 75],
             [260, 70],
             [280, 70]
           ]

target = [275, 70]
bestMatch = []
bestDifference = 0

for e in elements:
    currentDifference = abs((target[0] - e[0]) - (target[1] - e[1]))

    if not bestMatch or currentDifference < bestDifference:
        bestMatch = e
        bestDifference = currentDifference

print bestMatch

1 个答案:

答案 0 :(得分:1)

根据您的描述和示例输入,我已经解释了,您应该采用两个差异的最小值,而不是它们的差异。然后你将选择两个数字中任何一个变化最小的元素。

要朝正确的方向前进,您只需检查您当前所在的元素是大于还是小于目标

这样做你会得到以下结果:

elements = [ [320, 80],
             [300, 70],
             [300, 80],
             [270, 75],
             [260, 70],
             [280, 70]
           ]

def nextLogicalElement(target, bigger=True):
    bestScore = 0
    bestMatch = []
    for e in elements:
        score = min(abs(target[0] - e[0]), abs(target[1] - e[1]))

        if bigger and target[0] > e[0] or not bigger and target[0] < e[0]:
            continue

        if not bestMatch or score < bestScore:
            bestMatch = e
            bestScore = score

    return bestMatch

输出:

>>> print nextLogicalElement([315, 80], bigger=True)
[320, 80]
>>> print nextLogicalElement([275, 70], bigger=False)
[260, 70]