【发布时间】:2014-10-28 10:31:44
【问题描述】:
设
S是可能重叠的自然数的一组区间(包含 n 个区间),N 是一个数字列表(包含 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]}
我认为动态算法可能并不总是有效,所以如果有人知道这个问题的解决方案(或可以转换成的类似问题),那就太好了。我正在尝试制作 O(n^2 解决方案)
这是一种贪婪的方法
P = {}
for each q in N: // O(n)
if q in P // O(n)
continue
for each i in S // O(n)
if q in I: // O(n)
P.add(i)
break
但这是 O(n^4).. 任何有助于创建 O(n^2) 的贪婪方法都会很棒!
谢谢!
* 更新:*我一直在抨击这个问题,我认为我有一个 O(n^2) 的解决方案!!
如果你认为我是对的,请告诉我!!!
N = MergeSort (N)
upper, lower = infinity, -1
P = empty set
for each q in N do
if (q>=lower and q<=upper)=False
max_interval = [-infinity, infinity]
for each r in S do
if q in r then
if r.rightEndPoint > max_interval.rightEndPoint
max_interval = r
P.append(max_interval)
lower = max_interval.leftEndPoint
upper = max_interval.rightEndPoint
S.remove(max_interval)
我认为这应该可行!我正在尝试找到一个反解决方案;但是是的!
【问题讨论】:
-
谢谢,但这与那个问题的限制略有不同。我也在尝试推导出一个 O(n^2) 算法