显示算法是正确的

时间:2014-10-05 02:48:32

标签: algorithm sorting greedy

假设我们有n个卖家和m个买家按递增顺序排序。我们说卖家和买家b"匹配"如果s<湾找到由匹配对组成的最大子集A(可以匹配一个买方和卖方)。

我的算法是贪婪的并且通过选择第一卖家s1并且在位置c找到第一买家b1使得s1< b1并将其添加到A.然后我们移动到第二个卖方s2并从买方的c + 1迭代,直到我们找到买方b2使得s2< B2。我们这样做,直到位置c等于买家名单的大小。

我很难证明算法是正确的。我不确定如何形式化该方法,以便可以很容易地看到始终找到最佳解决方案。当我考虑它时,它是有道理的,但正式的验证再次成为我遇到的麻烦。

1 个答案:

答案 0 :(得分:0)

"正式"证据是一种模糊的描述。我将大致绘制一份证据,大致说明研究论文中出现的详细程度(可能低于算法课程中问题集所需的详细程度)。

贪心算法清楚地产生有效匹配。 (由于正式方法在实践中遇到困难,这确实是滥用“#34;明确"”这个词。)

为了表明这种匹配具有最大尺寸,我们通过归纳证明了以下技术陈述。对于不大于此大小的所有k,存在最大匹配,其中k个最少卖家匹配,如贪婪匹配。

基本情况是k = 0.我们可以采用任何旧的最大匹配,因为该语句是真空的(0至少是空集)。

归纳步骤是,对于k> 0,证明k - 1的语句暗示k的语句。存在最大匹配M,其与k-1最少卖家的贪婪解决方案一致,但可能不是第k个最小,我们称之为sk。现在是一个案例论证。

案例1:sk在M和贪婪的解决方案中匹配。让bG成为贪婪解决方案中的买主,并且是M的sk买家。如果bG = bM,那么我们就完成了。否则,bG< bM,因为贪婪的解决方案在所有买家中选择了最低限度的合格买家,不包括s1,...,sk-1的买家(在M中以相同的方式匹配)。如果b中有bG,则将sk的买家转换为bG。否则,将bG与b中的bM交换;之前从bG购买的卖家获得了更大的买家,因此掉期有效。

案例2:sk在M中匹配,但在贪婪的解决方案中不匹配。然后贪婪的解决方案是M的一个子集。这是不可能的,因为在M中的sk的买主可以在贪婪的解决方案中使用(贪婪的解决方案是最大的)。

案例3:sk与M不匹配。匹配更大的卖家;用sk替换它并应用其他一种情况。