【问题标题】:Segment tree time complexity analysis段树时间复杂度分析
【发布时间】:2015-01-26 21:37:24
【问题描述】:

我们如何证明分段树 (http://letuskode.blogspot.in/2013/01/segtrees.html) 上的 updatequery 操作(不要与区间树混淆)是 O(log n)

我想到了这样一种方法——在每个节点上,我们最多对左右子树进行两次递归调用。如果我们能够证明其中一个调用相当快地终止,那么时间复杂度将是对数有界的。但是我们如何证明这一点呢?

【问题讨论】:

    标签: data-structures time-complexity segment-tree


    【解决方案1】:

    在树的每个级别 (L) 上,最多有 2 个可能有部分重叠的节点。 (如果无法证明——为什么?请提及)

    因此,在第 (L+1) 级,我们必须探索最多 4 个节点。树中的总高度/级别为 O(log(N))(其中 N 是节点数)。因此时间复杂度为 O(4*Log(N)) ~ O(Log(N))。

    PS:请参考@Oleksandr Papchenko 所附的图表以更好地理解。

    【讨论】:

      【解决方案2】:

      如果我们证明在每个级别上最多有 N 个节点可以访问,并且知道二叉树段树的最大 logN 高度 - 我们可以说查询操作的复杂度是 O(LogN)。其他答案告诉您,每个级别最多访问 2 个节点,但我假设最多访问 4 个节点,访问级别上的 4 个节点。您可以在其他来源(如 Geek for Geeks

      )中找到相同的声明而无需证明

      其他答案显示您的分段树太小。考虑这个例子:叶节点大小为 16 的分段树,索引从零开始。您正在寻找范围 [0-14] 请参阅示例:交叉是我们正在访问的节点

      【讨论】:

      • 我认为其他答案想要建议的是 在每个级别最多 2 个节点将被扩展(即将进行递归调用),因此在示例中,您即使在某些级别 4 个节点可能会被访问​​(标记为“X”) 也已经给出,但是只有其中 2 个节点会进行递归调用,并且它们将被进一步扩展(在 4 个节点中) (这是2)。
      • 这里提供了一个很好的解释codeforces EDU,如果有人只对这部分感兴趣,请直接寻求9:30(您可能必须加入课程,视频是该部分的第一部分树系列)。
      【解决方案3】:

      声称在每个级别上最多扩展 2 个节点。我们将通过反证法来证明这一点。 考虑下面给出的段树。

      假设在这棵树中展开了 3 个节点。这意味着范围是从最左边的彩色节点到最右边的彩色节点。但请注意,如果范围延伸到最右边的节点,则覆盖中间节点的整个范围。因此,该节点将立即返回该值并且不会被扩展。因此,我们证明,在每一层,我们最多扩展 2 个节点,并且由于有 log⁡n 层,所以扩展的节点是 2⋅logn=Θ(logn)

      【讨论】:

        【解决方案4】:

        引理:树的每一层最多使用 2 个节点(一层是与根有固定距离的节点的集合)。
        证明:假设在h级别至少使用了3个节点(我们称它们为LMR)。这意味着从L 节点的左边界到R 节点的右边界的整个区间都在查询范围内。这就是为什么M 被完全位于查询范围内的h - 1 级别的节点(我们称之为UP)完全覆盖的原因。但这意味着根本无法访问M,因为遍历将在UP 或更高节点处停止。下面是一些图片来阐明这一步的证明:

         h - 1:  UP          UP        UP
                 /\          /\        /\
         h:     L  M R    L M  R    L  M   R
        

        这就是为什么每个级别最多使用两个节点的原因。段树中只有log N 级别,因此总共最多使用2 * log N

        【讨论】:

        • 你能举个例子吗?它也会让未来的读者更清楚!
        • Kraskevich 的答案是正确的,除了最后一句。据他介绍,对于T(l, r)n = l - r,最多可以使用2 * log n节点。如果是真的,对于T(1, 17),可以使用8个节点,但真正的答案实际上是6。答案应该是2 * log n - 2,因为他假设我们可以使用级别1的两个节点。但是,在这种情况下,我们需要获取根节点而不是 1 级节点。此外,我们无法获得这两个节点中的任何一个,因为这意味着在更高级别中没有使用任何节点。对于T(1, 17)[1, 9)[9-17]级别1的节点。如果我们使用[1, 9),我们丢弃ch
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多