假设我有两个长度相同的数组,称为A和B。这两个数组包含实数值。我们将两个数组之间的距离定义为均方距离。
dist(A,B)= sqrt(sum((A-B)^ 2))
我想找到使得A的排列距离B最小的排列。天真的方法是尝试A的每个排列并记录最小距离。但是,这种方法的复杂度为O(n!)。是否存在复杂度小于O(n!)的算法?
S_i + k1 = S_j
T_i = T_j + k2
where k1,k2 > 0
假设x是除了i和j以外所有元素的总距离。
d = x + (S_i - T_i)^2 + ((S_i + k1) - (T_i - k2))^2
d' = x + (S_i - (T_i - k2))^2 + ((S_i + k1) - T_i)^2
O(n^3)
。 - Raysqrt(A[i] - B[i])
作为距离度量方式并选取元素 [1 4] , [4 5]
,排序会产生错误的结果 sqrt(3) + sqrt(1)
,其比理想排列的误差 sqrt(4) + sqrt(0)
更大。 - yar(i,j)
的成本为(A [i] - B [i])^ 2
(其中i
对应于数组A中的索引i
,j
对应于数组B中的索引j
)。
编辑:
这不是问题的最佳解决方案。Ivo Merchiers提出了更好的解决方案,在效率和简单性方面都更好。我没有删除我的答案的原因是,我的建议解决方案对于Ivo的解决方案不适用的距离度量是有价值的(因为他的方法通过利用欧几里得距离的属性来工作)。仅仅对它们进行排序并匹配是最优的,当然这比匈牙利算法要快得多。
A
中的每个数字只有一个最接近的B
中的数字,那么您可以在O(n \log n)
内完成此操作。由于您拥有真实数字,这可能是可能的情况。如何做到呢?O(n \log n)
2. 二分搜索B中每个数字的最接近数字。O(n \log n)
如果数字来自现实世界并具有一定的随机性,则每对数字之间的差异可能是独特的。您可以通过对输入向量进行实验来验证是否存在这种情况。然后问题就变得容易解决了!我需要在Python中实现这个功能,所以我将分享基于Ivo Merchiers答案的解决方案:
target = [12, 14, 4512, 123, 4412]
source = [12, 14, 120, 4413, 5512]
permutationToSortTarget = [i[0] for i in sorted(enumerate(target), key=lambda x: x[1])] # get permutation that would sort target
permutationNeeded = [i[0] for i in sorted(enumerate(permutationToSortTarget), key=lambda x: x[1])] # get needed permutation
source.sort()
source = [source[i] for i in permutationNeeded] # apply permutation to sorted source