间隔树查询

时间:2014-03-11 07:53:03

标签: algorithm interval-tree

给定一组N个区间:对于每个区间,哪个其他区间具有最大重叠?

e.g。 {[0,5],[2,9],[2,3],[4,9]}:

[0,5]:[2,9](重叠4)

[2,9]:[4,9](重叠6)

[2,3]:[0,5]或[2,9](重叠2)

[4,9]:[2,9](重叠6)

N可能很大,所以我认为间隔树是必要的。但是,我发现的帖子或出版物都没有描述这种查询的方法。查询的结果可以位于间隔树节点(中心左侧,中心重叠,中心右侧)的3条路径中的任何一条路径上,因为它们可能包括也可能不包括查询间隔的中心点。因此,我无法想到一个log(N)遍历方法来获得结果。

另外,对于[2,3]的情况,我并不关心挑选哪一个。可以任意挑选任何最大交叉间隔。每个查询只返回1个结果。

可以在log(N)中回答每个查询,提供Nlog(N)整体解决方案吗?

编辑:我编写的伪代码:

query(ITnode node, Interval intrv){
    // s_list: start-sorted intervals overlapping center
    // e_list: end-sorted intervals overlapping center
    if intrv.end < node.center:
        node_max = search node.s_list for interval w/ closest start to intrv.start
        return max(node_max, query(node.left_tree, intrv))
    else if intrv.start > node.center:
        node_max = search node.e_list for interval w/ closest end to intrv.end
        return max(node_max, query(node.right_tree, intrv))
    else: // Query overlaps center
        // Still working this out but I get the picture now
}

for each Interval i:
    result[i.id] = query(root, i)

2 个答案:

答案 0 :(得分:1)

我们可以使用区间树来解决这个问题。

ALGO:

  1. 构造一组点S - 合并间隔的所有左右点。对于来自示例S = {0,2,3,4,5,9}的输入。复杂性 - O(NlogN)

  2. 使用以下结构构建间隔树

    struct tree { int max_overlap_value; int max_overlap_id; int second_max_overlap_value; int second_max_overlap_id; tree *left; tree *right; };

    还设置max_overlap_value = second_max_overlap_value = 0,max_overlap_id = second_max_overlap_id -1。复杂性 - O(N)

  3. 使用输入间隔更新树节点中的值。复杂性 - O(NlogN)

  4. 对于每个间隔,找到max_overlap_value,max_overlap_id,second_max_overlap_value,second_max_overlap_id。如果max_overlap_id等于interval_id,则使用second_max_overlap_value,否则使用max_overlap_value。复杂性 - O(NlogN)

  5. 总复杂度为 O(NlogN)

答案 1 :(得分:0)

我相信它可以使用O(RlogN)时间来解决,其中R是具有给定查询间隔i的最大重叠间隔数。我的方法是基于平衡二进制搜索树实现构建间隔树。一旦我们根据间隔构建树,我们必须找到与查询间隔重叠的设置间隔,这可以在O(RlogN)时间内完成,因为找到“a”重叠间隔是logN时间。在我们这样做之后,我们可以在O(R)时间内找到最大重叠间隔。这种方法的最坏情况复杂性是O(NlogN)。