Time complexity 段树-查询复杂性

Time complexity 段树-查询复杂性,time-complexity,segment-tree,Time Complexity,Segment Tree,我在理解段树复杂性方面遇到问题。很明显,如果您有只需更改一个节点的更新函数,那么它的复杂性将是log(n)。 但我不知道为什么查询(a,b)的复杂性是log(n),其中(a,b)是需要检查的间隔。 有人能给我提供直观/正式的证据来理解这一点吗?当查询时间间隔(x,y)时,有四种情况 但是,第二个FIND()返回R.leftChild.rightChild.sum,因此需要固定的时间,并且问题不会被分成两个子问题(严格来说,问题是分开的,尽管一个子问题需要O(1)个时间来解决) 由于相同的分析适用

我在理解段树复杂性方面遇到问题。很明显,如果您有只需更改一个节点的更新函数,那么它的复杂性将是log(n)。 但我不知道为什么查询(a,b)的复杂性是log(n),其中(a,b)是需要检查的间隔。
有人能给我提供直观/正式的证据来理解这一点吗?

当查询时间间隔(x,y)时,有四种情况

但是,第二个FIND()返回R.leftChild.rightChild.sum,因此需要固定的时间,并且问题不会被分成两个子问题(严格来说,问题是分开的,尽管一个子问题需要O(1)个时间来解决)

由于相同的分析适用于R的右子级,我们得出结论,在案例4第一次发生后,运行时间T(h)(h是树的剩余级别)将是


T(h)使用段树的范围查询基本上涉及从根节点递归。您可以将整个递归过程视为段树上的遍历:每当子节点上需要递归时,您都在遍历中访问该子节点。因此,分析范围查询的复杂性相当于找到访问的节点总数的上限

结果表明,在任意级别上,最多可以访问4个节点。由于段树的高度为log(n),并且在任何级别上最多可以访问4个节点,因此上界实际上是4*log(n)。因此,时间复杂度为O(log(n))

现在我们可以用归纳法证明这一点。基本情况位于根节点所在的第一级。由于根节点最多有两个子节点,因此我们最多只能访问这两个子节点,即最多4个节点

现在假设在任意级别(比如级别i),我们最多访问4个节点。我们希望表明,在下一个级别(级别i+1),我们最多也将访问4个节点。如果我们在级别i上只访问了1或2个节点,那么在级别i+1上我们最多访问4个节点就很简单了,因为每个节点最多可以有2个子节点

因此,让我们把重点放在假设在i级访问了3或4个节点上,并尝试表明在i+1级,我们最多也可以访问4个节点。现在,由于范围查询要求一个连续的范围,我们知道在级别i访问的3或4个节点可以分为3个节点分区:最左侧的单个节点,其段范围仅部分被查询范围覆盖,最右侧的单个节点,其段范围仅部分被查询范围覆盖,以及1个或2个中间节点,其段范围完全被查询范围覆盖。由于中间节点的段范围完全被查询范围覆盖,因此在下一级不会出现递归;我们只使用他们预先计算的总数。我们在最左边的节点上有可能的递归,在下一个级别最右边的节点上有可能的递归,这显然最多是4


这就完成了归纳法的证明。我们已经证明,在任何级别上最多访问4个节点。因此,范围查询的时间复杂度为O(log(n))。

长度为n的间隔可以由k个节点表示,其中k
两个子节点,最多4个节点。
如何?为什么是4?@KPMG我也不明白这一点-我假设对于您所在的节点,您只能访问一个子节点及其子节点。因此,父节点>子节点>孙子节点(2个节点)。每个节点只能有2个子节点,因此访问了4个节点。
FIND(R,x,y) //R is the node
% Case 1
    if R.first = x and R.last = y   
        return {R}
% Case 2
    if y <= R.middle
        return FIND(R.leftChild, x, y) 
% Case 3
    if x >= R.middle + 1 
        return FIND(R.rightChild, x, y) 
% Case 4
    P = FIND(R.leftChild, x, R.middle)
    Q = FIND(R.rightChild, R.middle + 1, y)    
    return P union Q.
FIND ( R.leftChild.leftChild, x, R.leftChild.middle );
FIND ( R.leftChild.rightChild, R.leftChild.middle + 1, , R.leftChild.last );
T(h) <= T(h-1) + c (c is a constant)
T(1) = c
T(h) <= c * h = O(h) = O(log n) (since h is the height of the tree)