如何证明这种贪心算法是最优的:杆连接

时间:2017-05-01 06:28:46

标签: algorithm greedy

问题在于:

给定一个数组表示桌子上杆的长度。每次选择两根杆并连接它们并获得一根新杆。这样做直到桌子上只有一根杆。 连接的成本是两根杆的总和。长度,例如,连接2与3将获得5杆,成本为5。 什么是最低成本连接策略?

贪婪:每次挑选最短的两个并将连接的新杆放回桌面。

示例:

[1,2,3,4,5],选择1和2费用3 [3,3,4,5],选择3和3费用6 [4,5,6],选择4和5费用9 [6,9],选择6和9成本15.因此总成本为33。

我们不能简单地说,连接的总时间是相同的n-1,因此每次选择最小的两个将给出最终的最低成本。因为每次采摘都会改变未来,例如选择1 + 2和采摘2 + 4将导致下一步有两组不同的杆。

如何证明这种贪婪会降低成本?

1 个答案:

答案 0 :(得分:2)

证明类似于霍夫曼代码最优的证明。

每个策略都有一个二叉树。它包含叶子中的所有初始杆,内部顶点对应于连接操作。

可以看出,为固定树连接杆的成本是a[v] * depth[v]对所有叶子v的总和,其中a[v]是初始杆的长度{ {1}}是假的深度。情况就是这样,因为每个杆完全depth[v]次参与连接。

我们需要证明存在一种最佳策略,使其树有两个最短的棒作为兄弟姐妹。

假设depth[v]是最优树。让我们根据它们的深度对它进行排序(以非严格降序排列)。如果两个最短的杆是前两个叶子,我们就完成了。否则,让他们与他们的左兄弟(至少与他们一样长)交换它们,直到他们进入前两个位置。当我们交换2片Tu时,费用更改为v = -depth[u] * a[u] - depth[v] * a[v] + depth[u] * a[v] + depth[v] * a[u]。第一项是非正数(因为叶子按其高度排序),第二项是非负数(如(depth[v] - depth[u]) * (a[u] - a[v]))。因此,成本变化为负或零。

因此,存在一种最佳树,其中两个最短的杆是兄弟姐妹。这意味着我们在做其他任何事情之前将这两根杆连接起来是一种最佳策略。