考虑一个问题来找到区间图的最小支配集。在区间调度的上下文中,它被转换为以下问题:
有多个间隔可能相互重叠或相互重叠。 找到区间的最小子集,以便对于未包含在子集中的每个区间,它将在子集中找到至少1个与其重叠的区间。
互联网上各种来源都有一个商定的贪婪解决方案,例如康奈尔的一个解决方案: http://www.cs.cornell.edu/Courses/cs4820/2011sp/handouts/samplesolutions.pdf
我们努力填补组成委员会的集合C(委员会的子集) 间隔)。我们使用集合M来保持“覆盖”间隔 簿记。
- 首先按照最早完成时间的结束时间对间隔进行排序。
- 在最早的完成时间内以S的间隔拍摄。
- 构造集O = {s∈S| s intersects i}
- 使用最后完成时间的o∈O并将o添加到C,将与o相交的所有区间添加到M
- 重复2-4,直到覆盖所有间隔。
醇>
这类似于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]过早被拒绝。
是否有比上面发布的更好的贪心解决方案?谢谢!
答案 0 :(得分:2)
您引用的算法不正确,因为集合S永远不会更改,因此在步骤2中将始终选择相同的间隔,您将进入无限循环。如果您将步骤2更改为"请在S-M中使用最早完成时间的间隔i。",这将是正确的。
但是,您链接的My answer是正确的。它和上面的校正算法都会为你的例子提供集{[1,4],[3,10]}。
您所犯的错误可能是在上面的第3步(或我的链接答案中的第2步)中,您只查看S-M中的集合(在我的答案中称为A)。但你应该看看与i相交的所有区间,即使它们已经在M中。