问题描述
我有两个大小为 A
的整数数组 B
和 n
。一对的成本是 |A(i) - B(i)|
。
我想将 A 和 B 的 n 个元素配对,以使所有 A(i)
和 B(i)
的所有成本总和最小化。
我知道我可以通过对 O(n log n)
进行排序,然后对 A
进行排序,然后分别从 B
将它们配对来获得 1...n
,但是在尝试了几个小时之后,我不知道怎么证明。有人可以帮我吗?
我已经看到了如何实现它,我只是不知道如何证明它
解决方法
假设根据当前排序的数组,有一对|x-a|
,另一对|y-b|
。假设切换元素会得到较小的总和,即更优的解决方案。
(注意:在切换两对时,数组的其余部分不受影响)。
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
为负数,则意味着我们找到了更好的排序。如果不是,则说明我们原来的解决方案更好。
现在,您可以对案例进行分析。 (由于数组已排序,让 x<y
(它们来自第一个数组)和 a<b
(它们来自第二个数组)。
- 情况 1:
x>b
或y<a
:
在这种情况下,两个和将相等,这可以通过展开模很容易看出 - 案例 2:
a<x<b
:
如果y>b
,diff = 2*(b-x)
。由于我们假设b>x
,因此diff
为正。
如果y<b
,diff = 2*(y-x)
。由于y>x
如前所述,diff 再次为正。
您可以继续处理类似的情况并证明 diff
始终为正,这意味着我们最初的排序将是最有效的。
我在这里采用了一种稍微不同的方法,通过使用平方而不是绝对来证明这一事实。
考虑 2 个数组,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 个数组进行排序时,术语 sum(ai*bi)
将是最大值。
感谢您指出 @Abhinav Mathur:可以使用 rearrangement inequality 证明语句 The term sum(ai*bi) will be maximum when the 2 arrays will be sorted
。
排序和配对创建了一个我们可以称之为“单调”的匹配,它确保如果 A[i] 匹配 B[x] 并且 A[j] 匹配 B[y],那么:
- 如果 A[i]
- 如果 B[x]
如果您选择一个非单调匹配,那么某些匹配将违反这些规则之一。
如果我们从两个数组中选取任意两个元素,使得 A[i]
为了比较成本,我们需要去掉绝对值操作。我们可以通过分别考虑 4 个值之间的所有可能顺序来做到这一点:
案例:A[i]
- 单调代价:B[x]-A[i] + B[y]-A[j]
- 交换成本:B[y]-A[i] + B[x]-A[j]
- 差异:0
- 成本是一样的 - 我们选择哪个并不重要
案例:A[i]
- 单调代价:B[x]-A[i] + B[i]-A[j]
- 其他成本:B[y]-A[i] + A[j]-B[x]
- 区别:2A[j] - 2B[x]
- 由于 A[j] >= B[x],单调是一样好或更好
...等
如果您遍历所有 6 种可能的排序,在每种情况下您都会发现单调匹配一样好或更好。给定任意匹配,你可以让每对元素匹配单调,成本只会下降。
如果您从最佳匹配开始并使每对匹配单调,那么您最终会得到最佳单调匹配。 (事实上,如果它是最优的,那么你开始的那个必须是单调的,但我们不必证明这一点)由于每个单调匹配具有相同的成本,并且其中至少一个是最优的,因此它们都必须是最优的。