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

标签 algorithm sorting data-structures time-complexity proof

我有两个整数数组 AB两个尺寸n .一对的成本是|A(i) - B(i)| .
我想配对 A 和 B 的 n 个元素,使得所有成本的总和 A(i) s 和 B(i) s 被最小化。
我知道我可以得到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(它们来自第二个数组)。
  • 案例一:x>by<a :
    在这种情况下,两个和将相等,这可以通过扩展模数
  • 很容易看出。
  • 案例2:a<x<b :
    y>b , diff = 2*(b-x) .由于我们假设 b>x , diff是积极的。
    y<b , diff = 2*(y-x) .自 y>x如前所述, diff 再次为正。

  • 你可以继续拿类似的案例来证明diff将始终为正,这意味着我们的原始排序将是最有效的排序。

    关于algorithm - 最小化两个数组的绝对差之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65919262/

    相关文章:

    algorithm - 模式和序列 - 将 'a' 表示为 'n' 的函数

    php - 在 mysql 中,一行总是在最上面

    algorithm - 为涉及计算 2 个或更多数字的唯一倍数的问题优化空间复杂度?

    algorithm - 计算组合的等级?

    java - 如何给文档中的每个对象一个唯一的ID?

    algorithm - 基于比较的排名算法

    java - 根据对象列表中列表中的字段对对象列表进行排序

    java - 对未排序数组中的正整数进行排序

    c - 为什么插入 BST 的代码不起作用?

    python - 时间复杂度 : deleting element of deque