范围联合的长度

时间:2013-12-12 20:16:51

标签: algorithm data-structures

我需要在一维坐标系中找到范围联合的长度。我有很多范围的形式[a_i,b_i],我需要找到这些范围的并集长度。范围可以动态添加或删除,并且可以在任何状态下查询范围并集的长度。

例如:范围是:

[0-4]
[3-6]
[8-10]

输出应为8。

是否有任何合适的数据结构用于复杂性的上限:

Insertion - O(log N)
Deletion - O(log N)
Query - O(log N)

3 个答案:

答案 0 :(得分:2)

它不是O(lg n),但是interval treesegment tree会满足您的需求吗?您可以将变量的长度保留在变量中,并且在插入或删除间隔时,您可以在O(lg n + m)时间内找到其他 m 间隔与其相交的内容,然后使用该信息进行更新O(m)时间内的长度变量。

答案 1 :(得分:2)

暂时假设您有一个包含起点和终点的排序数组,其惯例是起点位于具有相同坐标的终点之前。在您的示例中,数组将包含

0:start, 3:start, 4:end, 6:end, 8:start, 10:end

(如果有一个区间结束于3,那么3:start将在3:end之前)

要进行查询,请从左向右执行扫描,在“开始”处递增计数器并在“结束”处递减计数器。您将计数器从0增加的位置记录为S并记录为 E计数器变为零的地方。此时,您将总计数添加到SE之间的元素数量。这也是一个点,您只需用间隔[S, E]替换前面的间隔。

现在,如果您需要插入/删除O(log n)复杂度而不是数组,则需要在平衡二叉树中存储相同的元素(坐标和开始或结束标志对)。 然后根据顺序遍历执行扫描。

查询本身保持O(n)复杂性。

答案 2 :(得分:0)

维护频率数组。例如:如果范围是(0,2)和(1,3),则频率数组应为[1,2,2,1]。还要保持频率数组中非零元素的计数。

要插入,请增加与该范围对应的频率。从0增加到1(但不是从1增加到2等)时更新计数。

删除时,减少频率。同样更新计数。

对于查询,输出计数。

复杂性是范围的长度。