如何在两个数组之间找到所有互斥的最近邻居

时间:2014-09-06 19:56:06

标签: algorithm sorting

我有两个排序的数字数组。第一个数组是一组n个整数,它们是在数组边界之间等间隔的目标。第二个数组具有n个整数的大倍数,也是一个集合。我想从第二个数组中找到最接近第一个数组中所有目标的n个整数,条件是第二个数组中只有一个整数可以匹配第一个数组中的任何目标。也就是说,所有匹配都是互斥的。

感谢您的帮助!

编辑:

抱歉缺乏细节。这是对实际问题的简化。

具有常规目标的简单第一个数组示例:[0x0,0x7FFFFFFF,0xFFFFFFFF]

第二个数组本质上是没有重复的随机数据,均匀分布在第一个数组的范围内。也就是说,0x0和0xFFFFFFFF之间可能有2000个整数。我需要第二个数组中最接近第一个数组中目标的三个整数。在真正的问题中,目标将具有更小的范围和更多的目标,总是有规律地间隔。

编辑:更多背景信息。

大数组B是随机32字节哈希的流,它已经被排序并且被拟合到n元树中。对于每个节点,存在已知的限制u和v。通过将u和v划分为n-1步长来构造阵列A.对于在u和v之间的B的每个子集,尝试找到最接近n-1步幅之一的B的成员。然后,这些选定的成员用于进一步过滤下面每个子节点的B.它基本上是用于平衡包含随机数据的树的启发式算法。深度节点需要考虑逐渐减小的B。 A总是固定长度。

3 个答案:

答案 0 :(得分:1)

首先让我尝试正式指出问题。调用第一组数字A和第二组B.我们想要一个内射映射f:A - > B(内射意味着x!= y意味着f(x)!= f(y))最小化一些目标函数,该函数测量所有x与f(x)的接近程度x。有多种合理的选择,所以我会为你选择一个:让我们最小化sum_ {x in A} | f(x) - x |。 (这个答案的其余部分在某种程度上与确切的目标无关,只要一些最优f是增加的函数。)

贪婪算法(对于A中的所有x,定义值f(x)为B中的y,最小化| x - y |)失败,因为其选择的f可能不是单射的。通常的修复技术是动态编程,它可以工作但需要二次而不是线性时间。这是一个未经测试的Python样本,应该计算最佳目标值。 table[(i, j)]的值是将i的{​​{1}}元素映射到A的第一个j元素的最佳成本。

B

为了在最后恢复匹配,我们扩展代码以在每个表中创建另一个条目,指示min的哪个分支,然后将决策追溯到def assign(A, B): m = len(A) n = len(B) table = {(0, j): 0 for j in range(n + 1)} for i in range(1, m + 1): table[(i, 0)] = 1e309 # infinity for j in range(1, n + 1): table[(i, j)] = min(table[(i - 1, j - 1)] + abs(A[i - 1] - B[j - 1]), table[(i, j - 1)]) return table[(m, n)] 条目。

现在,我不知道你的问题有多大,也不知道你想要的结果有多快,但我们假设二次时间因任何原因都是不可接受的。一般来说,上面的代码考虑了彼此相距很远的元素之间的许多明显愚蠢的匹配。下面我将“明显愚蠢”作为一个技术术语,具有有效的定义和线性时间算法。然后我们可以将内循环中考虑的(0, j)范围替换为更小的东西,希望平均线性大小,因为B比A密度大且半合理分布。运行时间相应减少。

观察到将A中的最小x与大于min {y:y在B,y> = x}中的任何值匹配是没有意义的,我将其称为x的上邻居。如果我们这样做,并且f增加,那么我们可以将f(x)改为x的上邻居并改善目标值而不违反约束。如果我们贪婪地将A中的每个元素x'从B中的最小可用y'从最小到最大分配给不小于x',那么我们可以通过归纳显示存在一个最优解,其中每个x'与不大于的值匹配比它的y'。此外,我们可以在线性时间内计算这些值,如下所示(更多未经测试的Python)。

j

对称地,我们可以计算下界。将这些界限之外的任何作业称为“显然是愚蠢的”,并按照前面的描述进行。

答案 1 :(得分:0)

假设您的数组是am整数)和bn整数)。

由于两个数组都已排序,然后(如果我已正确理解问题)a中的每个值,x将是最接近{{1}的b中的值}}:

a[i]

答案 2 :(得分:0)

(可能是评论:)
将第二个数组视为b,我将其索引为Ib的元素称为B.对任何给定目标的二元搜索产生最接近的B不高于(或低于);一项任务是指定哪些B构成三个最近邻居;我建议只考虑与B相邻的连续元素(通常从Ib-2到Ib + 2)。最小化的措施包括距离之和,它们的绝对值或平方 另一个问题是争夺某些B的两个(或更多)目标 - 如果不能限制竞争者的数量,它应该变得讨厌。
(Nag:措辞留有改进的余地:the targets will have [...] more targets