将一个列表与另一个列表匹配,最小错误

时间:2011-06-02 04:23:53

标签: list comparison minimization

我有两个列表,A和B. A最多约1000个元素,B最多约100个元素。我想将B的每个元素与A的元素相匹配,以使对的绝对差的总和最小化。

即。我想选择| B |来自A的不同索引,并将它们分配给B的索引,以便最小化以下总和:sum(abs(A [j] - B [i])for i in | B |,j = index_mapping(i))

我的第一个方法是:

  1. 对于B的每个元素,计算| B | A的最接近的元素。
  2. 以贪婪的方式选择对(即最小错误)
  3. 使用一些简单的例子,很明显我的方法并不是最好的。它应该适合我的目的,但我想知道是否有人可以提出更好的方法?

2 个答案:

答案 0 :(得分:1)

我最终对两个列表进行了排序,并迭代它们以匹配。这对我正在做的事情来说效果很好。

答案 1 :(得分:0)

嗯...另外,想到的第一个想法是,如果你可以对A和B进行排序,那么一旦找到A [j]到B [i]的第一个映射,那么对于B [i + 1],您可以用A [j]而不是A [0]开始测试。

例如:

A = [ 23, 34, 38, 52, 67, 68, 77, 80, 84, 95 ]
B = [ 31, 33, 64, 65, 99 ]

从B [0] = 31开始并逐步执行A直到找到最接近的匹配A [1]。由于列表是有序的,你知道 B [1]不会匹配任何小于A [1]的东西,所以你可以从那里开始比较。事实证明,A [1]仍然是最接近的匹配。在B [2],最接近的匹配是A [4],因此你知道B [3]将不匹配任何低于A [4]的东西,不需要搜索A [0]到A [3]。