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

Algorithm 最小化覆盖给定间隔集的框的数量,algorithm,language-agnostic,set,intervals,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

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

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]
我认为贪婪算法可能并不总是有效的,所以如果有人知道这个问题的解决方案(或者可以转换成类似的解决方案),那就太好了

谢谢


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

算法可能如下

  • a=0
  • curr=S中的最小值,即>a。(在我们的例子中=1.In[1..4])
  • 将区间[curr..b]添加到M(在本例中,M={[1..10]})
  • a=最大上限(以M为单位)(在我们的例子中,a=10)
  • 去2号

  • 算法可能如下所示

  • a=0
  • curr=S中的最小值,即>a。(在我们的例子中=1.In[1..4])
  • 将区间[curr..b]添加到M(在本例中,M={[1..10]})
  • a=最大上限(以M为单位)(在我们的例子中,a=10)
  • 去2号

  • 是的,贪婪算法是最优的。非正式地,考虑任意的解决方案M。我们将在不增加间隔数的情况下将其转化为贪婪解M的超集。反复考虑M′m中最左边的区间i。设s为s中最左边的区间,其中I为M中包含s的最左边区间。从左到右贪婪算法选择一个区间I',其左边缘与s对齐。我首先声称I'在I的右边,因为I'是包含s的最右边的区间,其次,M-{I}U{I'}是一个有效的解,因为I'包含的唯一区间而不是I'在s的左边,因此已经包含在其他区间中。不在贪婪解中的区间数减少,因此我们最终得到贪婪解。

    是的,贪婪算法是最优的。非正式地,考虑任意的解决方案M。我们将在不增加间隔数的情况下将其转化为贪婪解M的超集。反复考虑M′m中最左边的区间i。设s为s中最左边的区间,其中I为M中包含s的最左边区间。从左到右贪婪算法选择一个区间I',其左边缘与s对齐。我首先声称I'在I的右边,因为I'是包含s的最右边的区间,其次,M-{I}U{I'}是一个有效的解,因为I'包含的唯一区间而不是I'在s的左边,因此已经包含在其他区间中。不在贪婪解中的区间数减少了,所以我们最终得到了贪婪解