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