algorithm - 区间树查询

标签 algorithm interval-tree

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

例如{ [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)

最佳答案

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

算法:

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

  2. 构建具有以下结构的区间树

    结构树{ int max_overlap_value; int max_overlap_id; int second_max_overlap_value; int second_max_overlap_id; 树*左; 树*对; };

    同时设置 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)

总复杂度为 O(NlogN)

关于algorithm - 区间树查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319473/

相关文章:

arrays - 最小化数组相邻项中的函数

algorithm - 是否有任何有效的算法可以从输出中搜索给图灵机的原始命令?

c++ - 生成汉明距离 t 内的所有比特序列

c# - 随机化列表,同时确保重复项不连续

c# - 动态条件逻辑

algorithm - 合并两个排序的间隔列表

algorithm - 给定两个排序的区间列表,返回两个列表之间的重叠区间

algorithm - 在不包含查询的区间树中查找最接近的区间

algorithm - 给定一个区间,在区间列表中查找所有区间