段树的最坏情况运行时间

时间:2014-11-13 09:29:12

标签: algorithm time segment-tree

段树O(logn)中的范围和如何最坏?难道不是O(n)吗?如果在范围求和操作期间,我们按照算法遍历左右节点?

2 个答案:

答案 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)

其中右侧的每个术语都已存储在段树中。