Algorithm 什么';在区间树(基于红黑)中查找所有交集的复杂性是多少?
因此,关于区间树有很多Stackoverflow的问题,但我没有发现任何关于操作复杂性的问题,也就是说,给定一个区间Algorithm 什么';在区间树(基于红黑)中查找所有交集的复杂性是多少?,algorithm,Algorithm,因此,关于区间树有很多Stackoverflow的问题,但我没有发现任何关于操作复杂性的问题,也就是说,给定一个区间Itv,在一个基于红黑的增广区间树中找到与Itv相交的所有区间 我从Robert Sedgewick的coursera课程算法中了解到,这个操作可以在O(RlgN)中完成,其中R是相交间隔的数量,N是节点的数量。但我不确定什么算法与这种复杂性相对应(我在谷歌上看到的大多数东西都只提到如何知道Itv是否与任何间隔相交)。我确实在(Java示例:搜索树中的点或区间)一节中找到了一个f
Itv
,在一个基于红黑的增广区间树中找到与Itv
相交的所有区间我从Robert Sedgewick的coursera课程算法中了解到,这个操作可以在
O(RlgN)
中完成,其中R
是相交间隔的数量,N
是节点的数量。但我不确定什么算法与这种复杂性相对应(我在谷歌上看到的大多数东西都只提到如何知道Itv
是否与任何间隔相交)。我确实在(Java示例:搜索树中的点或区间)一节中找到了一个findall(Itv)
操作,我唯一的问题是,我不知道它是否是O(RlgN)
,我无法证明它。无论如何,如果有人能在bbst增广区间树(非中心区间树)中找到一种有效的
findall(Itv)
,或者证明wiki算法是O(RlgN)
,或者向我指出任何相关文献,我将不胜感激 是的,Wiki算法(从CLRS抄袭而来)是O(R log N)。由于一个过程的实现和检查的位置,分析起来有点棘手,因此让我介绍并分析一个密切相关的版本(可以通过在父调用和子调用之间移动一些测试,并将search1
替换为search
)来恢复原始版本:
其中选择了
c
,以涵盖在search1
中完成的非递归工作,因为R'≥ 1.我们可以假设R'≥ 1是首先拆分search1
的原因;直接在搜索上证明c(R'+1)H的界是行不通的,因为两个递归调用都需要+1。谢谢David!这非常有用!
class Node {
// Binary search tree sorted on start.
// The interval at this node is [start, end).
// maxEnd is the maximum value of end in this tree.
int start, end, maxEnd;
Node left, right;
void search(int p, Collection<Node> results) {
if (p < start) {
if (left != null && p < left.maxEnd) left.search(p, results);
} else {
// p >= start
if (left != null && p < left.maxEnd) left.search1(p, results);
if (p < end) results.add(this);
if (right != null && p < right.maxEnd) right.search(p, results);
}
}
void search1(int p, Collection<Node> results) {
// Precondition:
// p < maxEnd
// for every node x in this tree, p >= x.start
if (left != null && p < left.maxEnd) left.search1(p, results)
if (p < end) results.add(this);
if (right != null && p < right.maxEnd) right.search1(p, results);
}
}
c + c RL (H - 1) + c RR (H - 1) ≤ c + c R' (H - 1) ≤ c R' H,
^^^^^^^^^^^^ ^^^^^^^^^^^^
left call right call