找到重叠间隔的最小子集

时间:2014-10-02 22:55:17

标签: algorithm graph intervals greedy

考虑一个问题来找到区间图的最小支配集。在区间调度的上下文中,它被转换为以下问题:

有多个间隔可能相互重叠或相互重叠。 找到区间的最小子集,以便对于未包含在子集中的每个区间,它将在子集中找到至少1个与其重叠的区间。

互联网上各种来源都有一个商定的贪婪解决方案,例如康奈尔的一个解决方案: http://www.cs.cornell.edu/Courses/cs4820/2011sp/handouts/samplesolutions.pdf

  

我们努力填补组成委员会的集合C(委员会的子集)   间隔)。我们使用集合M来保持“覆盖”间隔   簿记。

     
      
  1. 首先按照最早完成时间的结束时间对间隔进行排序。
  2.   
  3. 在最早的完成时间内以S的间隔拍摄。
  4.   
  5. 构造集O = {s∈S| s intersects i}
  6.   
  7. 使用最后完成时间的o∈O并将o添加到C,将与o相交的所有区间添加到M
  8.   
  9. 重复2-4,直到覆盖所有间隔。
  10.   

这类似于2012年interjay在SO上提出的投票答案: Find the smallest set of overlapping jobs

但我注意到一个反例证明上述解决方案不会产生最小的子集:

考虑区间:[0,2],[1,4],[3,10],[5,6],[7,8],[9,10]。

最小子集应该有2个区间:[3,10]加上[0,2]或[1,4]。

但上述解决方案将返回4个区间的子集:[1,4],[5,6],[7,8]和[9,10]。在步骤4中,最长的间隔[3,10]过早被拒绝。

是否有比上面发布的更好的贪心解决方案?谢谢!

1 个答案:

答案 0 :(得分:2)

您引用的算法不正确,因为集合S永远不会更改,因此在步骤2中将始终选择相同的间隔,您将进入无限循环。如果您将步骤2更改为"请在S-M中使用最早完成时间的间隔i。",这将是正确的。

但是,您链接的

My answer是正确的。它和上面的校正算法都会为你的例子提供集{[1,4],[3,10]}。

您所犯的错误可能是在上面的第3步(或我的链接答案中的第2步)中,您只查看S-M中的集合(在我的答案中称为A)。但你应该看看与i相交的所有区间,即使它们已经在M中。