我有一个包含n个区间[0,1]
每个间隔看起来像[a(i),b(i)] 0<=a(i)<b(i)<=1 , i = 1...n
我需要找到一个有效的算法来确定n个区间中的每个区间是否包含在其他区间内。
我尝试了很多选项,但我只能在O(n ^ 2)中找到一个
有什么建议吗?
答案 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)