分段求和问题的分段树实现的时间复杂度证明


10

我知道可以使用段树来找到的子数组的总和。根据此处的教程,该操作可以在时间内完成。AO(logn)

但是我无法证明查询时间确实是。此链接(以及许多其他链接)说,我们可以证明在每个级别上,已处理的最大节点数为,因此。O(logn)4O(4logn)=O(logn)

但是,我们怎么可能通过矛盾来证明这一点呢?

如果是这样,如果我们将分段树用于高维数组的范围和,该证明将如何扩展?

例如,我可以考虑通过将原始矩阵划分为4个象限(类似于线性阵列中的一半)来找到一个子矩阵总和,以构建一个象限分段树,但是证明使我难以理解。


段树的构建是O(n),查询是O(log n),更新是O(log N)。它优于总和数组的好处在于更新的复杂性。
Nurlan

Answers:


11

声称每个级别最多扩展节点。我们将通过矛盾证明这一点。2

考虑下面给出的段树。

段树

假设在此树中扩展了节点。这意味着范围是从最左边的彩色节点到最右边的彩色节点。但是请注意,如果范围扩展到最右边的节点,则将覆盖中间节点的整个范围。因此,此节点将立即返回该值,并且不会扩展。因此,我们证明在每个级别上,我们最多扩展节点,并且由于存在级别,因此扩展的节点为2 日志Ñ 2 日志Ñ = Θ 日志Ñ32logn2logn=Θ(logn)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.