![](/img/trans.png)
[英]Distribute numbers to two “containers” and minimize their difference of sum
[英]Minimize Sum of Absolute Difference of Two Arrays
我有两个大小为n
的整数A
和B
的 arrays 。 一对的成本是|A(i) - B(i)|
.
我想将 A 和 B 的 n 个元素配对,以使所有A(i)
和B(i)
的所有成本的总和最小化。
我知道我可以通过排序A
得到O(n log n)
,然后排序B
,然后分别从1...n
将它们配对,但是在尝试了几个小时之后,我不知道如何证明它。 有人可以帮帮我吗?
我已经看到了如何实现它,我只是不知道如何证明它
假设按照当前排序的arrays,有一对|xa|
, 和另一对|yb|
. 假设切换元素会产生更小的总和,即更优的解决方案。
(注意:在两对左右切换时,阵列的 rest 不受影响)。
Current total sum of pairs = |x-a| + |y-b|
Modified sum after switching pairs = |x-b| + |y-a|
Difference in sums = diff = |x-b| - |x-a| + |y-a| + |y-b|
如果diff
为负数,则意味着我们找到了更好的排序。 如果不是,则意味着我们最初的解决方案更好。
现在,您可以采取案例并对此进行分析。 (由于 arrays 已排序,因此让x<y
(它们来自第一个数组)和a<b
(它们来自第二个数组)。
x>b
或y<a
:a<x<b
:y>b
,则diff = 2*(bx)
。 因为我们假设b>x
,所以diff
是正数。y<b
,则diff = 2*(yx)
。 由于y>x
如前所述,diff 再次为正。 您可以继续采取类似的案例并证明diff
将始终为正,这意味着我们最初的排序将是最有效的排序。
我在这里采用一种稍微不同的方法,通过使用平方而不是绝对来证明这一事实。
考虑 2 arrays, A = [a1, a2, ..., an]和B = [b1, b2, ..., bn] 。
现在,即使我使用随机配对(使用A和B中的任何索引形成一对),
假设,差的平方和 ( S ) = a1^2 + b1^2 + a2^2 + b2^2 +... + an^2 + bn^2 - 2 * (a1 * b3 + a2 * b4 +.... + an * b56 + bn * a34)。
上面的总和可以表示为S = sum(ai^2) + sum(bi^2) - 2 * sum(ai*bi)
,因为i
从 1 到 n。
为了最小化这个总和,我们需要最大化部分sum(ai*bi)
,因为i
从 1 变为 n。
当对 2 个 arrays 进行排序时,项sum(ai*bi)
将最大。
感谢您指出@Abhinav Mathur : The term sum(ai*bi) will be maximum when the 2 arrays will be sorted
可以使用 重排不等式来证明。
排序和配对创建了一个我们可以称为“单调”的匹配,它确保如果 A[i] 匹配 B[x] 并且 A[j] 匹配 B[y],那么:
如果您选择的匹配不是单调的,那么某些匹配对将违反这些规则之一。
如果我们从 arrays 中选择任意两个元素,使得 A[i] <= A[j] 和 B[x] <= B[y],那么我们可以评估单调配对和其他配对的成本。 请注意,如果 A[j] = A[j] 或 B[i] = B[j] 则两个配对具有相同的成本,因此我们称之为单调的并不重要。
为了比较成本,我们需要摆脱绝对值操作。 我们可以通过分别考虑 4 个值之间的所有可能排序来做到这一点:
案例:A[i] <= A[j] <= B[x] <= B[y]:
案例:A[i] <= B[x] <= A[j] <= B[y]
... ETC
如果您通过所有 6 个可能的排序 go,在每种情况下,您都会发现单调匹配同样好或更好。 给定任意匹配,可以使每一对元素匹配单调,成本只能下降go。
如果您从最佳匹配开始并使每对匹配单调,那么您最终会得到最佳单调匹配。 (事实上,如果它是最优的,你开始的那个必须是单调的,但我们不必证明这一点)由于每个单调匹配具有相同的成本,并且其中至少有一个是最优的,所以它们都必须是最优的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.