给定一组间隔,找到需要放置的最小点数,以便每个间隔都有一个点

时间:2011-02-10 20:02:15

标签: algorithm math

假设给你一组间隔,每个间隔的开始时间为s下标i,f下标i的结束时间。找到需要放置的最小点数,每个区间都有一个点。

我正在尝试找到一种可以解决这个问题的算法。当一个重叠两个区间的区间,即从一个区间的中间开始,到另一个区间的中途结束时,我就会卡住它。

由于

4 个答案:

答案 0 :(得分:7)

  1. 删除任何完全包含较小间隔的间隔。您可以这样做,因为如果满足较小的间隔,则还必须满足较大的间隔。
  2. 按s_i排序间隔。
  3. 从第一个间隔开始:在f_i处放置一个点。这将满足第一个间隔,以及与其重叠的任何间隔。
  4. 按排序顺序继续到下一个尚未包含点的间隔,并在f_i处放置一个点。
  5. 重复。

答案 1 :(得分:4)

  1. 按照非减少上限的顺序对间隔进行排序。
  2. 将变量most_recent_placed初始化为-inf(小于所有间隔下限)。
  3. 按排序顺序扫描间隔。对于给定的时间间隔[a, b],如果most_recent_placed < a,请在b处加点,并将most_recent_placed设置为b
  4. 此解决方案A最佳的证据是归纳地建立对于任何有效解B和任何点x,由坐标小于x的B放置的点数至少为大小为x左边的点数。

答案 2 :(得分:1)

该问题需要代码回答。这是user612112提到的算法的python实现,比接受的答案中的实现好一点:

  1. 初始化一个空的输出点列表
  2. 按端点对范围进行排序,并按端点顺序对其进行处理
  3. 对于每个范围,如果最后一个输出点小于范围的起点,则将范围的终点添加到输出集中

请注意,您不需要任何预处理即可删除多余的范围,也不需要进行排序以区分具有相同端点的多个范围。

# given some inclusive ranges
ranges=[(1,5),(2,4),(4,6),(3,7),(5,9),(6,6)]

# sort by the end points
ranges.sort(key=lambda p:p[1])

#generate required points
out=[]
last = None
for r in ranges:
    if last == None or last < r[0]:
        last = r[1]
        out.append(last)

#print answer
print(out)

答案 3 :(得分:0)

首先按起点的递增顺序对间隔进行排序。 在最小的fi上加上一点。 如果具有结束时间f(i + 1)的下一个间隔具有该点,则前一点覆盖f(i + 1),否则将新点置于f(i + 1)。 迭代程序