从该集合中选择两个区间的快速算法

时间:2012-06-02 03:18:02

标签: algorithm

假设给出了一组闭区间,其中每个区间的形式为[l,r]。如果我们想从这个集合中选择两个区间,那么它们的交集时间的大小就是它们的并集大小。我们可以提供一个非平凡的算法来解决这个问题吗?

例如,如果我们有四个区间,[1,6],[4,8],[2,7],[3,5]。最佳解决方案是选择[1,6]和[2,7]。答案是(7-1)*(6-2)= 24。

实际上原始问题要求我们选择(N> = 2)个区间数,但我认为我们可以证明最优解只包含两个区间:

如果最佳解决方案有三个或更多间隔:

[                     ]
            [               ]
                   [                          ]

我们可以看到,如果删除中间间隔,权重不会减少。

2 个答案:

答案 0 :(得分:2)

给定一组N>假设最大化联合时间交集的2个重叠区间,留出包含联合中最左边点的区间和包含联合中最右边点的区间。由于N> 2你还剩下至少一个其他间隔。如果从集合中删除此间隔,则不会减小间隔并集的大小,因为您可以设置间隔以覆盖最左侧和最右侧的点。您只能通过删除间隔来增加交叉点的大小。因此,通过删除此间隔,您只能增加您尝试最大化的产品,因此确实可以在N = 2时找到最佳解决方案。

对间隔的端点集进行排序,并按递增顺序对其进行排序。如果是关系,请考虑最右边点之前的最左边的点。跟踪一组间隔,在看到最左边的点时为集合添加间隔,并在看到最右边的点时从集合中删除间隔。

对于任何两个重叠的间隔,当其中一个已经存在并且您即将添加另一个时,将会有一个点。因此,如果在向集合添加间隔之前,将其与集合中已有的所有其他间隔进行比较,则可以比较所有重叠间隔对。因此,您可以计算要添加的区间与集合中所有其他区间之间的并集和交集的乘积,并跟踪所看到的最大区间。

答案 1 :(得分:0)

证明两个间隔就足够了:选择另一个间隔中正确包含的间隔是没有意义的。然后,在不失一般性的情况下,让间隔为[a1,b1],...,[an,bn]使得a1 <1。 ......&lt;一个。如果没有间隔正确地包含另一个间隔,那么b1&lt; ......&lt; BN。对于i&lt; j&lt; k,它认为([ai,bi]相交[aj,bj]相交[ak,bk])=([ai,bi]相交[ak,bk])和相同的联合,所以没有理由选择两个以上的间隔。

O(n log n)-time算法:重新制定,问题是找到间隔[a,b]和[c,d]最大化(d - a)*(b - c ),因为如果间隔不相交,则该产品为负。我们的算法是进行O(n log n)预处理,它允许我们在O(log n)时间内找到每个区间的最佳配合。

让我们努力寻找[a,b]的最佳配偶。做一些代数:(d - a)*(b - c)= d * b - d * c - a * b + a * c。由于a,b是固定的,我们可以删除-a * b项并使内积最大化&lt;(a,b,1),(d,c,-d * c)&gt;在所有区间[c,d]。由于该组矢量(d,c,-d * c)是固定的,这基本上模拟了静止多面体和垂直于(a,b,1)的移动平面的碰撞。感谢Edelsbrunner和Maurer(Finding extreme points in three dimensions and solving the post-office problem in the plane,1984),有一种算法在时间O(n log n)中进行预处理,并在O(log n)时间内针对不同的a和b解决此类型的查询。

一个不好的细节是我们必须选择至少两个区间,但最好的“解决方案”可能只是与自身最长的区间。我相信它很麻烦,但有可能延长Edelsbrunner - Maurer在相同的运行时间内找到第二个最极端点。