微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最小化两个数组的绝对差之和

如何解决最小化两个数组的绝对差之和

我有两个大小为 A 的整数数组 Bn。一对的成本是 |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. 情况 1:x>by<a
    在这种情况下,两个和将相等,这可以通过展开模很容易看出
  2. 案例 2:a<x<b
    如果 y>bdiff = 2*(b-x)。由于我们假设 b>x,因此 diff 为正。
    如果 y<bdiff = 2*(y-x)。由于 y>x 如前所述,diff 再次为正。

您可以继续处理类似的情况并证明 diff 始终为正,这意味着我们最初的排序将是最有效的。

,

我在这里采用了一种稍微不同的方法,通过使用平方而不是绝对来证明这一事实。

考虑 2 个数组,A = [a1,a2,...,an]B = [b1,b2,bn]

现在,即使我使用随机配对(使用来自 AB 的任何索引形成一对),

假设差的平方和 (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 种可能的排序,在每种情况下您都会发现单调匹配一样好或更好。给定任意匹配,你可以让每对元素匹配单调,成本只会下降。

如果您从最佳匹配开始并使每对匹配单调,那么您最终会得到最佳单调匹配。 (事实上​​,如果它是最优的,那么你开始的那个必须是单调的,但我们不必证明这一点)由于每个单调匹配具有相同的成本,并且其中至少一个是最优的,因此它们都必须是最优的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。