这是算法大师的问题: - )
让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]
我认为贪婪的算法可能不会一直有效,所以如果有人知道这个问题的解决方案(或类似的可以转换成的问题),那就太好了。
谢谢!
更新我一直在思考它,也许我的第一个直觉是错误的,贪婪的算法只是解决这个问题的方法,因为最后所有的间隔需要被覆盖,如何选择超级间隔也没有任何区别......我应该删除这个问题,还是有人可以断言?
答案 0 :(得分:4)
算法可能如下。
答案 1 :(得分:3)
是的,贪心算法是最佳的。非正式地,考虑任意解M。我们将它转换为贪婪解M'的超集,而不增加间隔的数量。反复考虑M-M'中最左边的间隔I.设s是S中最左边的区间,其中I是M中最左边的区间,包含s。从左到右的贪婪算法选择一个间隔I',其左边缘与s对齐。我首先声称我是在我的右边,因为我是包含s的最右边的间隔,其次,M - {I} U {I'}是一个有效的解决方案,因为我所包含的唯一间隔但不是我'在s的左边,因此已经被其他一些区间所包含。不在贪婪解决方案中的间隔数量减少,因此我们最终达到了贪婪的解决方案。