Leetcode上一道题,给定一个整数数组,要实现:
- 求[i, j]所有元素的和,0 <= i <= j <= n - 1,sumRange(i, j)
- 数组的元素会被修改, update(i, val)
- 这两个函数会被均匀的调用很多次
最简单的方法是求和O(n),修改元素O(1),时间复杂度太大,使用Segment Tree可以将二者的时间复杂度均变为O(logn)
Segment Tree:
- 叶子节点是输入数组中的所有元素
- 内部节点是其孩子节点所带信息的merge
- Segment Tree可以由数组实现,数组索引i的左孩子为2 * i + 1,右孩子为2 * i + 2,父节点在(i - 1) / 2下取整处
- 该数组的大小为$2 * 2 ^(ceil(log_2^n)) - 1$