线段树时间复杂度分析
线段树高度:
可以看出每次都将区间的长度一分为二,数列长度为n,所以线段树的高度是log(n),这是很多高效操作的基础。
建树复杂度:
因为每次将区间的长度一分为二,所有创造的节点个数,即底层有n个节点,那么倒数第二次约n/2个节点,倒数第三次约n/4个节点,依次类推:
n + 1/2 * n + 1/4 * n + 1/8 * n + ...
= (1 + 1/2 + 1/4 + 1/8 + ...) * n
= 2n
所以构造线段树的时间复杂度和空间复杂度都为O(n),线段树需要的数组元素个数是2*n,构造线段树要开辟至少2倍的储存空间。
单点修改复杂度
更新需要从叶子节点一路走到根节点, 去更新线段树上的值。因为线段树的高度为log(n),所以更新序列中一个节点的复杂度为log(n)。
线段树的区间查询复杂度
假设要查询的区间长度为n
任意长度的线段,最多被拆分成logn条线段树上存在的线段,所以查询的时间复杂度为O(log(n))。
线段树的区间修改复杂度
类似于区间查询,所以也为O(log(n))。
什么情况下,无法使用线段树?
1.如果我们删除或者增加区间中的元素,那么区间的大小将发生变化,此时是无法使用线段树解决这种问题的。
2.满足交换律
常与线段树一起使用的算法
1:差分------求覆盖某一区间的次数
2;离散化 – 经典例题
暂时只遇到这些,再遇到再加