重叠区间和最小值

Overlapping Intervals and Minimum Values

如何确定是否存在满足特定给定条件的一组值。标准采用区间和区间内的最小值的形式。

例如,给定条件:

Interval : Minimum value in that interval

{2, 2}   : 5
{1, 4}   : 1
{4, 4}   : 4

能满足的一组数值是

{1, 5, 1, 4}

另一方面,给定条件:

Interval : Minimum value in that interval

{2, 3}   : 1
{1, 4}   : 2
{4, 4}   : 4

不存在满足它们的这样一组值。

我想确定是否存在一组满足给定条件的值(即,如果存在一组满足条件的值,我只想找到一个 returns 为真的算法如果没有则为假)。

我知道如何使用 O(N^2) 的蛮力来做到这一点,但如果可能的话,我想实现 O(N lgN) 的解决方案。


我第一次尝试解决这个问题涉及合并重叠区间,然后检查合并区间的最低值,但我很快意识到这样做并不能保证得到正确的答案。

我的第二次尝试涉及线段树,即尝试为每个值分配值,如果您试图覆盖一个区间,那么这样的区间不存在。但是,这也很快被放弃,因为即使某些部分被覆盖,您仍然可以达到一组有效的值。

我的第三次尝试涉及区间树,试图找到两个区间之间的交点并检查是否可以创建一组有效的值。这看起来很有希望,但它是一个 O(N^2) 算法,因此也被放弃了。

谁能提供一些见解?

赋值的思路是正确的。您只需要按间隔的最小值(按递增顺序)对间隔进行排序。也就是说,解决方案如下所示:

  1. 构建一个线段树(所有节点的值为-infinity)。

  2. 按排序顺序处理所有区间。对于每个间隔,只需分配其值(无论之前有什么)。

  3. 运行 查询所有间隔以检查一切是否正确。

唯一不平凡的说法是:如果这个算法没有找到解决方案,那么就没有解决方案。我不会 post 正式证明,但这里有关键观察:

  1. 我们在按排序顺序处理时,必须给整个区间赋一个新值。

  2. 我们不会在其他任何地方分配一个新值(也就是说,我们不能意外地破坏另一个间隔的值)。