查找数组内部间隔的算法

时间:2010-02-05 18:53:33

标签: algorithm data-structures

我有一个包含n个区间[0,1]

的列表

每个间隔看起来像[a(i),b(i)] 0<=a(i)<b(i)<=1 , i = 1...n

我需要找到一个有效的算法来确定n个区间中的每个区间是否包含在其他区间内。

我尝试了很多选项,但我只能在O(n ^ 2)中找到一个

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

提示:对列表进行排序。

答案 1 :(得分:1)

假设只有一个[0,1]的间隔。如果它不在您的列表中,只是为了方便,添加它。

对端点进行排序。在两个端点相等的情况下,在相应的右端点上反向排序。因此[0.1,0.2],[0.1,0.3]将被分类为0.1,0.1,0.2,0.3,其中前0.1与第二区间一致。同样,如果右端点相等。

每个端点都应该有一个对其间隔的引用,以便您可以找到给定端点的间隔。

扫描已排序的端点。像你一样,建一棵树。使用[0,1]作为根。节点可以是红色或绿色。他们从红色开始。所以根节点最初是红色的。

树的想法是,最终,如果一个区间包含另一个区间,它将是树中的祖先。如果两个区间不重叠或部分重叠,它们将位于不同的分支中,它们唯一的共同祖先将是根,或者包含它们的其他区间。

当遇到每个左端点时,通过向当前树节点添加其间隔的红色节点,将其添加到树中的暂定位置。因此,我们遇到的第一个端点导致在根下添加相应的间隔,并且它成为当前节点。因此,在遇到其右侧端点之前,树节点可能有多个节点连接到它。

当遇到右侧端点时,其节点变为绿色,因为我们已将其从一端完全覆盖到另一端。如果它有任何红色后代,则必须移动它们,因为,当刚刚变成绿色的节点包含它们的左端时,它不包含它们的右端。所以我们将它们全部移动到父节点(必须仍然是红色)。

我们继续这个过程,直到我们到达1.0端点。此时树已完成。所有节点都是绿色的。每个节点下的节点表示相应间隔包含的间隔。

答案 2 :(得分:1)

  1. 根据断开关系的起点对间隔进行排序,以便稍后显示早期端点
  2. 以排序顺序观察,对于每个元素e,包含e的区间只能存在于其左侧。
  3. 因此从左侧线性扫描到目前为止观察到的最大终点。在任何阶段,如果当前间隔的端点小于最大端点,我们发现一个间隔包含在其他间隔内。