使用贪心耐心排序证明最长增加子序列

时间:2013-09-19 17:41:18

标签: algorithm sorting greedy

我遇到了使用耐心排序来获得最长增长子序列(LIS)长度的解决方案。 http://www-stat.stanford.edu/~cgates/PERSI/papers/Longest.pdf,此处 - http://en.wikipedia.org/wiki/Patience_sorting

遵循贪婪策略实际上给我们正确长度的证据有2个部分 -

  1. 证明桩的数量至少等于LIS的长度。
  2. 证明使用贪婪策略的桩数最多等于LIS。
  3. 因此,凭借1)和2),解决方案正确地给出了LIS的长度。

    我得到1)的解释,但我无法直观地实现第2部分)。有人可能会用一个不同的例子来说服我确实这是真的。或者,您甚至可以使用不同的校样技术。

1 个答案:

答案 0 :(得分:0)

我刚刚阅读了论文,我同意证明有点,嗯,简洁。 (我说它缺少一些非常重要的步骤!)

直观地说,证明背后的想法是表明,如果你玩贪婪策略并在游戏结束时挑选编号为p的堆中的任何卡,你可以在原始数组中找到一个增加的子序列,其长度为页。如果你可以证明这一事实,那么你可以得出结论,贪婪策略产生的最大桩数是最长增长子序列的长度。

为了正式证明这一点,我们将争辩说以下两个不变量在每一步都有:

  1. 从左到右阅读时,每堆中的顶牌都按顺序排列。

  2. 在任何时间点,每一堆中的每张牌都是一个不断增加的子序列的一部分,其长度由桩指数给出。

  3. 从贪婪策略中可以很容易地看出第(1)部分 - 每个元素都尽可能地放在左边,而不违反小卡片必须总是放在较大卡片上面的规则。这意味着如果将卡放入桩p中,我们实际上是采用排序序列并将第p个元素的值减小到比位置p-1(如果存在)中的任何值更大的值。

    要看到第(2)部分,我们将归纳为主。第一张放入的牌被放入堆1中,它也是长度为1的增加子序列(卡本身)的一部分。对于归纳步​​骤,假设在放置n张卡后该属性成立,并考虑(n + 1)st。假设它最终以桩p结束。如果p = 1,则索赔仍然成立,因为该卡本身形成长度为1的递增子序列。否则,p> 1.现在,看一下p-1顶部的卡片。我们知道这张卡片的价值低于我们刚刚放置的卡片的价值,因为否则我们会把卡片放在那张卡片的顶部。桩。我们也知道,由于我们按顺序播放卡片,因此在我们刚刚放入原始订单的卡片之前的那张卡片上方。通过我们现有的不变量,我们知道桩p-1顶部的卡是长度为p-1的增加子序列的一部分,因此随着这个新卡加入其中的子序列形成了长度为p的增加的子序列,如必需的。