用给定的间隔覆盖所有数字

时间:2014-10-28 09:16:39

标签: 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]}

我认为动态算法可能永远不会起作用,所以如果有人知道这个问题的解决方案(或类似的可以转换成的问题),那就太好了。

谢谢!

1 个答案:

答案 0 :(得分:2)

你可以用贪心算法来做到这一点。

按顺序考虑N中的点。

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

否则,请考虑包含该点的间隔。在这些间隔中,选择覆盖最多未覆盖点的那个。 (这将是具有最高终点的区间。)

实施例

  1. 第一个点是1,仅由1..4覆盖,所以将此间隔添加到我们的集合中。
  2. 下一点是4,但它已经被覆盖所以继续。
  3. 下一点是5,由2..7和3..5覆盖。选择其中任何一个来获得涵盖2套所有点的答案。