段树O(logn)中的范围和如何最坏?难道不是O(n)吗?如果在范围求和操作期间,我们按照算法遍历左右节点?
答案 0 :(得分:2)
允许为active
节点调用一个节点,该节点存储一个间隔,该间隔既不完全包含在间隔中,也不完全由间隔覆盖。很容易发现每个级别上最多有2个活动节点用于遍历。现在,如果节点未处于活动状态,则无需递归 - 如果间隔完全覆盖,请添加节点中写入的值,如果间隔与我们感兴趣的间隔不相交,则只需跳过它。因此,算法将执行的操作数量将按树的级别或O(log(n))
的顺序排列。
答案 1 :(得分:1)
在第一步中,您可能必须遍历左侧和右侧节点,但在每个后续步骤中,您只需要遍历其中一个侧面。另一种看待它的方法是要注意,如果你想找到sum(n, m)
(让我们说这表示半开区间[n, m)
的总和),我们可以将其计算为
sum(n, m) = sum(0, m) - sum(0, n)
您会注意到计算sum(0, n)
和sum(0, m)
每个都采用对数时间,因为您再次不需要遍历两种方式。例如,
sum(0, 13) = sum(0, 8) + sum(8, 12) + sum(12, 13)
其中右侧的每个术语都已存储在段树中。