Algorithm 给定一组区间,找出需要放置的最小点数,以便每个区间中都有一个点

Algorithm 给定一组区间,找出需要放置的最小点数,以便每个区间中都有一个点,algorithm,math,Algorithm,Math,假设给定一组区间,每个区间的开始时间为s下标i,结束时间为f下标i。找到需要放置到每个间隔都有一个点的最小点数 我正试图找到一种算法来解决这个问题。当一个时间间隔重叠两个时间间隔,即从一个时间间隔的一半开始,到另一个时间间隔的一半结束时,我会被卡住 谢谢 删除所有包含较小间隔的间隔。可以这样做是因为,如果满足较小的间隔,则也必须满足较大的间隔 按s_i对间隔进行排序 从第一个间隔开始:在f_i处放置一个点。这将满足第一个间隔以及与之重叠的任何间隔 按排序顺序继续到下一个尚未包含点的间隔,并在f_

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

我正试图找到一种算法来解决这个问题。当一个时间间隔重叠两个时间间隔,即从一个时间间隔的一半开始,到另一个时间间隔的一半结束时,我会被卡住

谢谢

  • 删除所有包含较小间隔的间隔。可以这样做是因为,如果满足较小的间隔,则也必须满足较大的间隔
  • 按s_i对间隔进行排序
  • 从第一个间隔开始:在f_i处放置一个点。这将满足第一个间隔以及与之重叠的任何间隔
  • 按排序顺序继续到下一个尚未包含点的间隔,并在f_i处放置点
  • 重复一遍
  • 按不减损上限的顺序对间隔进行排序
  • 将变量
    最近放置的
    初始化为
    -inf
    (小于所有间隔下限的值)
  • 按排序顺序扫描间隔。对于给定的间隔
    [a,b]
    ,如果
    最近放置的
    ,则在
    b
    处放置一个点,并将
    最近放置的
    设置为
    b

  • 证明该解决方案A是最优的证明是,归纳地确定对于任何有效的解决方案B和任何点
    x
    ,B放置的坐标小于
    x
    的点的数量至少与
    x
    左侧放置的点的数量相同。首先,按起始点的递增顺序对间隔进行排序。 在最小的fi上加一个点。 如果具有结束时间f(i+1)的下一个间隔具有该点,则上一点覆盖f(i+1),否则在f(i+1)处放置新点。
    重复这个过程

    这个问题需要一个带有代码的答案。下面是user612112提到的算法的python实现,它比公认答案中的算法稍微好一点:

  • 初始化输出点的空列表
  • 按端点对范围进行排序,并按端点顺序进行处理
  • 对于每个范围,如果最后一个输出点小于范围的起点,则将范围的终点添加到输出集中
  • 请注意,不需要任何预处理来删除冗余范围,也不需要排序来区分具有相同端点的多个范围

    # 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)
    
    #给定一些包含的范围
    范围=[(1,5)、(2,4)、(4,6)、(3,7)、(5,9)、(6,6)]
    #按终点排序
    ranges.sort(key=lambda p:p[1])
    #生成所需的点数
    out=[]
    最后一个=无
    对于范围内的r:
    如果last==无或last
    只需按f_i对间隔进行排序,那么在第一步中就不需要了。还要注意,由于元素的差异性问题,这个算法实际上是最优的:O(nlogn)。@adam:它留下了一些细节,但它确实提供了一个算法。最明显的实现是O(nlogn)。当然,如果你想的话,你可以开枪打自己的脚,用博戈索尔而不是希普索尔等等。@Moron你会如何实现O(n log n)中的第一步?最明显的是O(n^2)。通过第四步的简单实现,您也会得到O(n^2)。@adamax:很明显!=天真的。第一步可以在O(nlogn)时间内完成。对左边的单词进行排序。假设排序顺序为s1、s2、…、sn。右边是f1、f2、…、fn,它们不需要排序。对于s1、s2、…、sn中的每个i,二进制搜索fi。说fi