寻找重叠所有其他区间的最小间隔集的贪婪算法

时间:2015-10-27 16:01:18

标签: algorithm data-structures minimum greedy

我正在学习贪婪的算法,遇到了一个我不确定如何解决的问题。给定一组具有开始时间a和结束时间b的间隔(a,b),给出一个贪婪算法,该算法返回与集合中每隔一个间隔重叠的最小间隔量。例如,如果我有:

(1,4)(2,3)(5,8)(6,9)(7,10)

我会返回(2,3)和(7,8),因为这两个区间覆盖了集合中的每个区间。我现在拥有的是:

  1. 通过增加结束时间对间隔进行排序
  2. 将具有最小结束时间的间隔推入堆栈
  3. 如果间隔(a,b)与堆栈顶部的间隔(c,d)重叠(因此a小于d),则如果a< = c keep(c,d)。否则,将堆栈顶部的间隔更新为(a,d)
  4. 如果间隔(a,b)与堆栈顶部的间隔(c,d)不重叠,则将(a,b)推入堆栈
  5. 最后,堆栈包含所需的时间间隔,这应该在O(n)时间内运行
  6. 我的问题是:这个算法是如何贪婪的?我正在努力解决这些问题。所以也许我有这个权利,也许我没有,但如果我这样做,我无法弄清楚贪婪的规则应该是什么。

    编辑:下面提出了一个有效的观点,我应该更加清楚。 (7,8)代替(1,10)(涵盖一切),因为(7,8)中的每一次都在(5,8)(6,9)和(7,10)中。与(2,3)相同,每次都在(1,4)和(2,3)中。目标是获得一组间隔,这样如果您查看该组间隔中的所有可能时间,则每次至少会有一个原始间隔。

1 个答案:

答案 0 :(得分:0)

贪婪算法是一种反复选择最佳增量改进的算法,即使从长远来看可能会证明是次优的。

你的算法对我来说似乎并不贪心。这个问题的贪婪算法是:

  1. 查找输入集中最大间隔数中包含的间隔。
  2. 从包含它的输入集中删除间隔。
  3. 重复直到输入集为空。
  4. 对于这个例子,它首先产生(7,8),因为它包含在3个输入间隔中,然后将输入设置减少到(1,4)(2,3),然后产生(2,3)

    请注意,此算法不会为输入集生成最佳输出: (0,4)(1,2)(1,4)(3,6)(3,7)(5,6)

    首先产生(3,4),因为它被4个输入区间覆盖,但最好的答案是(1,2)(5,6),每个区间有3个区间