Wil*_*nga 12 algorithm tree fenwick-tree segment-tree
我需要计算数组范围内的总和,所以我遇到了 Segment Tree 和 Fenwick Tree,我注意到这两种树都以相同的渐近运行时间进行查询和更新。我做了更多的研究,这两种数据结构似乎以相同的速度完成所有事情。两者都具有线性内存使用量(段树使用量是其两倍)。
除了运行时间/内存和实现中的恒定因素之外,还有什么理由让我选择一个而不是另一个?
我正在寻找一个客观的答案,例如某些操作比另一个更快,或者可能某个限制另一个没有。
我看到了另外 2 个关于此的 StackOverflow 问题,但答案只是描述了这两种数据结构,而不是解释何时一个可能比另一个更好。
Shr*_*rni 22
我在 Quora 上读到了这个。希望你觉得它有用。
小智 7
我在cp-Algorithm上找到了一些 可能对你有帮助的东西。
线段树-
芬威克树-
在 O(logN) 内回答每个查询
预处理在 O(NlogN) 内完成
优点:代码最短,时间复杂度好
缺点:Fenwick树只能用于L=1的查询,因此不适用于很多问题。
小智 5
对 Harsh Hitesh Shah 答案的评论:反对使用 Fenwick 树的最后一点通常不成立。通过反例证明:假设我们有一个用于前缀和的 Fenwick 树,函数 query(x) 返回从第一个索引 1 开始到包括索引 x 的前缀和。如果我们想计算某个区间 [L, R] 的总和,且 1 < L <= R <= N,我们可以采用 query(R)-query(L-1)。