Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 什么';在区间树(基于红黑)中查找所有交集的复杂性是多少?_Algorithm - Fatal编程技术网

Algorithm 什么';在区间树(基于红黑)中查找所有交集的复杂性是多少?

Algorithm 什么';在区间树(基于红黑)中查找所有交集的复杂性是多少?,algorithm,Algorithm,因此,关于区间树有很多Stackoverflow的问题,但我没有发现任何关于操作复杂性的问题,也就是说,给定一个区间Itv,在一个基于红黑的增广区间树中找到与Itv相交的所有区间 我从Robert Sedgewick的coursera课程算法中了解到,这个操作可以在O(RlgN)中完成,其中R是相交间隔的数量,N是节点的数量。但我不确定什么算法与这种复杂性相对应(我在谷歌上看到的大多数东西都只提到如何知道Itv是否与任何间隔相交)。我确实在(Java示例:搜索树中的点或区间)一节中找到了一个f

因此,关于区间树有很多Stackoverflow的问题,但我没有发现任何关于操作复杂性的问题,也就是说,给定一个区间
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