【问题标题】:Finding all the intervals that does not overlap with the point查找所有不与该点重叠的区间
【发布时间】:2015-07-24 03:41:54
【问题描述】:

我有(a1, b1), (a2, b2), ...., (an, bn)形式的间隔。
我愿意支持以下操作

  1. 添加新间隔。
  2. 删除现有间隔。
  3. 给定一个点,找出所有不与该点重叠的区间。

如果我们想找到与点重叠的区间,区间树是直接的解决方案。如果我们想找到不相交的区间呢?

【问题讨论】:

  • “添加”和“删除”究竟是什么意思?应该将(2,4) 添加到(1,3) 产生(1,3),(2,4)(1,4)
  • @Oriol - 认为应该是(1,3),(2,4)
  • 您可以在树中插入区间的补码:代替 [a,b],插入 [-inf,a] 和 [b,+inf]。确保保留原始间隔的标识。

标签: algorithm computational-geometry


【解决方案1】:

同时拥有两棵树中的所有节点。树 A 用键 ai 保存它们,树 B 用键 bi 保存它们。
插入删除明显是O(log n).
对于要求 3,从小到大打印 B 中的节点,并在 bi 仍然小于该点时停止。相同,但在 A 中倒退。

示例:
给定(1,10), (5,18), (13,20),和一个点12
A 中ai 大于12 的区间为(13,20),B 中较小的区间为(1,10)

【讨论】:

  • 你能举个例子吗?
  • 明白了。但是在这种情况下,要求 3 的复杂性是多少?
  • O(n),一定是。您可能正在打印整棵树,这意味着您要遍历整棵树。 (在示例中关联,想想如果该点是45 会怎样)。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多