匹配数字的贪心算法

Greedy Algorithem for matching numbers

我们有一组 'S',其中包含 2n 只袜子。组中的每只袜子都有一种颜色。 颜色由正实数表示。 [c : S -> R(+)] 同组2只袜子同色是可以的。

-我们这样定义一双袜子 (a,b) 的 "Punishment": P(a,b) = |c(a)-c(b)|。 (也就是说2只同色袜子的"punishment"为0)

我需要描述一个贪心算法,它将一组 S 和 returns 一组包含袜子的组 A 作为输入(来自 S 的每只袜子,正好在 A 中一次)和总结惩罚将是最小。 [总结惩罚=>该组所有对的惩罚总和]

而且我需要证明算法是正确的。 我无法证明我的算法是正确的, 我根据袜子的数值颜色值对袜子进行排序,每次都从 S 中挑选第一只。 我试图用归纳法来证明它,但我不知道我需要如何做最优组中的 'switching' 部分。

所以你的算法是正确的:)

证明: 想象一下,我们对我们的问题有不同的解决方案,它比我们的解决方案更好(我们只是排序并匹配最接近的)。因此必须至少存在两对(a

1)a在区间(c,d)内,b不在区间或与其相似
(否则我们的解决方案中会有这对)。

现在让我们计算惩罚:惩罚是|a-b| + |c-d|

因为我们的 1) 我们可以考虑我们数字的顺序,例如:

2 : a < c < b < d

3 : a < c < d < b

4 : c < a < b < d

5 : c < a < d < b

两个在计算上几乎一样: 我们可以很容易地证明

例如在 (2) 中 |a-b| + |c-d| > |a-c| + |b-d|,

因为 a-b < a-c 并且 a < c < b 所以 |a-b| > |a-c| c-d < b-d 且 c < b < d 所以 |c-d| > |b-d|

现在,如果发生这种情况,交换这些值会将此解决方案更改为更好的解决方案,这在我们的算法中看起来像:)