最小化覆盖给定间隔集的框的数量

时间:2010-03-22 16:01:04

标签: algorithm language-agnostic set intervals

这是算法大师的问题: - )

S成为可能重叠的自然数的一组区间,以及b一个框大小。假设对于每个区间,范围严格小于b

我想找到b大小的最小间隔集(让我们称之为M),因此S中的所有时间间隔都包含在M的时间间隔内

琐碎的例子:

S = {[1..4], [2..7], [3..5], [8..15], [9..13]}
b = 10
M = {[1..10], [8..18]}
// so ([1..4], [2..7], [3..5]) are inside [1..10] and ([8..15], [9..13]) are inside [8..18]

我认为贪婪的算法可能不会一直有效,所以如果有人知道这个问题的解决方案(或类似的可以转换成的问题),那就太好了。

谢谢!

更新我一直在思考它,也许我的第一个直觉是错误的,贪婪的算法只是解决这个问题的方法,因为最后所有的间隔需要被覆盖,如何选择超级间隔也没有任何区别......我应该删除这个问题,还是有人可以断言?

2 个答案:

答案 0 :(得分:4)

算法可能如下。

  1. a = 0
  2. curr = S中的最低数字>>一个。 (在我们的案例中= 1. [1..4])
  3. 向M添加间隔[curr..b](在我们的例子中,M = {[1..10]})
  4. a = M的最大上限(在我们的例子中a = 10)
  5. 转到2.

答案 1 :(得分:3)

是的,贪心算法是最佳的。非正式地,考虑任意解M。我们将它转​​换为贪婪解M'的超集,而不增加间隔的数量。反复考虑M-M'中最左边的间隔I.设s是S中最左边的区间,其中I是M中最左边的区间,包含s。从左到右的贪婪算法选择一个间隔I',其左边缘与s对齐。我首先声称我是在我的右边,因为我是包含s的最右边的间隔,其次,M - {I} U {I'}是一个有效的解决方案,因为我所包含的唯一间隔但不是我'在s的左边,因此已经被其他一些区间所包含。不在贪婪解决方案中的间隔数量减少,因此我们最终达到了贪婪的解决方案。