Data structures 为什么求解具有段树时间复杂度的范围最小查询是O(logn)?

Data structures 为什么求解具有段树时间复杂度的范围最小查询是O(logn)?,data-structures,avl-tree,segment-tree,rmq,Data Structures,Avl Tree,Segment Tree,Rmq,我试图解决如何在给定的数组和两个索引中找到OLogn中这两个索引之间的最小值。 我看到了使用分段树的解决方案,但无法理解为什么此解决方案的时间复杂度为OLogn,因为它看起来不是这样的,因为如果您的范围不完全在节点的范围内,您需要开始分割搜索。第一个证明: 声明是,每个级别最多有2个节点展开。我们将用矛盾来证明这一点 考虑下面给出的段树 假设有3个节点在此树中展开。这意味着范围是从最左侧的彩色节点到最右侧的彩色节点。但请注意,如果范围延伸到最右侧的节点,则中间节点的整个范围都将被覆盖。因此,此节

我试图解决如何在给定的数组和两个索引中找到OLogn中这两个索引之间的最小值。 我看到了使用分段树的解决方案,但无法理解为什么此解决方案的时间复杂度为OLogn,因为它看起来不是这样的,因为如果您的范围不完全在节点的范围内,您需要开始分割搜索。

第一个证明:

声明是,每个级别最多有2个节点展开。我们将用矛盾来证明这一点

考虑下面给出的段树

假设有3个节点在此树中展开。这意味着范围是从最左侧的彩色节点到最右侧的彩色节点。但请注意,如果范围延伸到最右侧的节点,则中间节点的整个范围都将被覆盖。因此,此节点将立即返回值,并且不会展开。因此,我们证明了在每个级别上,我们最多扩展2个节点,并且由于存在logn级别,因此扩展的节点是2个⋅logn=Θlogn

第二个证据:

查询区间x,y时有四种情况

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.
但是,第二个查找返回R.leftChild.rightChild.sum,因此需要恒定的时间,并且问题不会被分成两个子问题严格来说,问题是分离的,尽管一个子问题需要O1时间来解决

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

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)
因此,我们结束了证明

你好不妨把这个问题作为一个更好的地方来问。
T(h) <= c * h = O(h) = O(log n) (since h is the height of the tree)