空间填充算法?

时间:2011-11-15 16:59:22

标签: algorithm space fill

我现在正在研究一个我找不到名字的问题,所以谷歌搜索任何东西都是不可能的,因此我试着在这里描述它。

想象一下,我们在纸上有一个范围或一些主线。现在我们得到了许多具有随机可变长度的较小线,并且它们已经指定了它们开始的范围。我需要选择一组这些较小的线,因此我们可以看到主线的空间将尽可能低。因此,我们通常会尝试使用较小的块来覆盖主线,这些块最有效地定义了位置和长度。

除了回答如何执行此任务之外,我很高兴知道这个问题的名称,因为我确信这在编程时非常常见,并且可以推广到比一个更多的维度。

正如thiton提醒我的那样,ni重叠是允许的(当然,这将是相当无稽之谈)

5 个答案:

答案 0 :(得分:3)

它让我想起了http://en.wikipedia.org/wiki/Knapsack_problem可能有点帮助。

答案 1 :(得分:1)

这对我来说看起来像动态编程。首先,对间隔进行排序,以便您可以按最右边点的非递减顺序处理它们。现在我们尝试找到每个x的最佳方法来覆盖点&lt; = x。当我们选择一个以T结尾的新区间时,我们将得到一个点&lt; = T的覆盖,最好的是通过查看我们到目前为止的解决方案找到点的最佳解决方案&lt; = S其中S是最大S <=我们新区间的左点。通过将解决方案存储到已排序的集合(如红/黑树)中,您可以合理地快速找到最佳匹配。

一旦你处理了所有的时间间隔,你就可以查看所有最佳解决方案,考虑到其中一些解决方案将在你的线路结束前结束,并选择总冠军。

答案 2 :(得分:1)

在这个问题中,你有一组线段L1 ... Ln,其中一些重叠。如果两个线段Li和Lj重叠,那么当你不能同时在解决方案中同时设置它们时;因此,每当两个线段重叠时,就会有一个排他性约束,它只能在解决方案集中出现其中一个。现在每个线段也有长度,这是线段的“值”,你的问题等同于要求一组具有最大值但是所有排他性约束都被遵守的线段,即没有重叠解决方案中的细分。原始问题用欧几里德几何和实数表示的事实并没有改变实际问题是组合性和有限性的事实。

它不是KNAPSACK,也不是SET COVER。它看起来像加权SET PACKING(Wikipedia)的一个实例,但是这里的问题实例是否构成我不知道的NP完全问题,因为原始问题的几何形状限制了可以生成的约束结构。但可能是这样。

已更新

这是@ mcdowella在下面的答案,它不是NP-complete,而是一个可以有效解决的问题实例。有关所有链接和备注,请参阅下面的评论。

答案 3 :(得分:0)

解决方案:选择所有线段。你不能做得更好,因为可能涵盖的每一点都是。

答案 4 :(得分:0)

此问题几乎等同于 Set Cover problem ,即NP完全问题。它的不同之处在于,SCP是根据有限集合来陈述的。您的版本可以转换为等效的加权SCP问题,反之亦然,在O(K log K)时间内(K =子线数),或者在没有加权的情况下转换为几乎等效的SCP问题,在O(L / e)中时间,L =主线长度和精度e。

维基百科SCP article提到了三种近似方法:整数线性程序公式,命中集公式和贪婪算法。