我需要在一维坐标系中找到范围联合的长度。我有很多范围的形式[a_i,b_i],我需要找到这些范围的并集长度。范围可以动态添加或删除,并且可以在任何状态下查询范围并集的长度。
例如:范围是:
[0-4]
[3-6]
[8-10]
输出应为8。
是否有任何合适的数据结构用于复杂性的上限:
Insertion - O(log N)
Deletion - O(log N)
Query - O(log N)
答案 0 :(得分:2)
它不是O(lg n)
,但是interval tree或segment 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
计数器变为零的地方。此时,您将总计数添加到S
和E
之间的元素数量。这也是一个点,您只需用间隔[S, E]
替换前面的间隔。
现在,如果您需要插入/删除O(log n)复杂度而不是数组,则需要在平衡二叉树中存储相同的元素(坐标和开始或结束标志对)。 然后根据顺序遍历执行扫描。
查询本身保持O(n)复杂性。
答案 2 :(得分:0)
维护频率数组。例如:如果范围是(0,2)和(1,3),则频率数组应为[1,2,2,1]。还要保持频率数组中非零元素的计数。
要插入,请增加与该范围对应的频率。从0增加到1(但不是从1增加到2等)时更新计数。
删除时,减少频率。同样更新计数。
对于查询,输出计数。
复杂性是范围的长度。