我有两个列表,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))
我的第一个方法是:
使用一些简单的例子,很明显我的方法并不是最好的。它应该适合我的目的,但我想知道是否有人可以提出更好的方法?
答案 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]。