Algorithm 以给定的间隔覆盖所有数字

Algorithm 以给定的间隔覆盖所有数字,algorithm,language-agnostic,set,intervals,Algorithm,Language Agnostic,Set,Intervals,这是算法大师们的一个问题:-) 设S为一组可能重叠的自然数间隔,N为一组数字 我想找到s的最小子集(我们称之为p),对于每个数字 在我们的列表N中,P中至少存在一个包含它的区间。P中的间隔允许重叠 简单的例子: S = {[1..4], [2..7], [3..5], [8..15], [9..13]} N = [1, 4, 5] // so P = {[1..4], [2..7]} 我认为动态算法可能并不总是有效的,所以如果有人知道这个问题的解决方案(或者可以转换成类似的解决方案),那就太好

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

S
为一组可能重叠的自然数间隔,N为一组数字

我想找到s的最小子集(我们称之为p),对于每个数字 在我们的列表N中,P中至少存在一个包含它的区间。P中的间隔允许重叠

简单的例子:

S = {[1..4], [2..7], [3..5], [8..15], [9..13]}
N = [1, 4, 5]
// so P = {[1..4], [2..7]}
我认为动态算法可能并不总是有效的,所以如果有人知道这个问题的解决方案(或者可以转换成类似的解决方案),那就太好了


谢谢

您可以使用贪婪算法来实现这一点

按顺序考虑N中的点

对于每个点,如果它已经被间隔覆盖,则跳过它

否则,考虑包含点的间隔。在这些时间间隔中,选择覆盖最多未覆盖点的时间间隔。(这将是具有最高端点的间隔。)

例子
  • 第一点是1,被1..4覆盖,所以把这个间隔加到我们的集合中
  • 下一点是4,但已经讨论过了,所以继续
  • 下一点是5,由2..7和3..5覆盖。选择这两个选项中的任何一个,以获得包含2组所有点的答案

  • W.l.o.g.你可以用包含正整数的离散有限集替换S中的区间。然后它看起来很像一个“子集覆盖”问题()。