- 问题描述
设计一个高效算法,对实数线上给定的一个点集{x1,x2,...,xn},求一个单位长度闭区间的集合,包含所有给定的点,并要求次集合最小。证明你的算法是正确的。 - 问题分析
①求解单位长度闭区间集合问题的最优子结构
首先对点集{x1,x2,...,xn}按递增顺序排列,得到点集{y1,y2,...,yn}。Sij表示以yi开始以yj结束的点集,假定Sij的最优解中的某个元素包含Smn其中m≤n。如果用c[i,j]表示集合Sij的最优解的大小,则可得递归式
c[i,j]=c[i,m]+c[n,j]+1
当不知Sij的最优解包含的单位长度区间所包含的子集Smn时,就需要考查Sij中所有可能的Smn(Smn是可以包含于一个单位长度闭区间的),于是
c[i,j]=⎧⎩⎨0若Sij=∅minSmn⊂Sij{c[i,m]+c[n,j]+1}若Sij≠∅
②贪心选择
直观上,我们应该选择这样一个Smn,使得ym=yi且yn+1>yi+1。因为这样的一个单位区间将包含yi到yn而我们不能做得更好。 - 算法设计
GREEDY-INTERVALS(x)
y=sort(x)
n=y.length
for i=1 to n
print "interval" i
up=y[i]+1
while y[i]<=up
i++
return