3

假设我有两个数组:

a=[10 21 50 70 100 120];
b=[18 91];

我想匹配 a 和 b 中最接近 AND 10 个单位以内的(单个)元素。

结果 :

idxa=[1 2 3 4 5 6]

idxb=[2 5]

其中匹配的元素共享相同的编号。

我很困惑,因为我不确定(例如)如何确保 18 与 21 而不是 10 匹配,因为它们都满足彼此在 10 个单位以内的要求。此外,我想在几个(最多 8 个)列表中执行此操作,并且代码变得过于复杂,我觉得我缺少一个简单的解决方案。我不担心效率,因为列表的长度很小。

谢谢!

4

2 回答 2

0

对于小型阵列,这可以通过蛮力来完成:

(1) 迭代两个数组中较小的,然后是较大的数组
(2) 跟踪“迄今为止最接近的匹配” CMSF
(3) 如果找到更好的匹配,更新 CMSF
(4) 当你到达末尾时列表,如果 CMSF <= 10 保留它,否则忽略此项目(它没有匹配项)

于 2013-02-23T21:50:16.967 回答
0

您的数组似乎已排序(我将继续进行该假设;如果没有,您可以简单地对它们进行排序)。

您是否尝试过将多个数组合并为一个更大的数组?(类似于归并排序的归并步骤)。这将是一个很好的起点,因为它将您的问题减少到“在数组中查找壁橱元素”,相比之下这是微不足道的。

这也将允许您删除重复项;即将数组中的所有'21' 减少为单个'21'。

为了确保 18 匹配 21 而不是 10,您需要计算键 (18) 与 10 个单位 ([10,21)) 内的每个值之间的差异,然后选择差异最小的那个。

更新:针对您关于仅查找所有数组共有的值的评论,这可以在合并数组时通过查找数组的交集来完成,这实际上可能是一种预定义的方法,具体取决于您的语言。

于 2013-02-23T21:21:47.447 回答