如何证明线段树的操作复杂度
如何证明线段树操作的时间复杂度 ?
以区间询问为例,假设当前节点代表的区间是 [l, r],需要定位的区间是 [L, R] 。
-
如果定位区间包含当前节点代表的区间,将节点信息归入答案,终止递归 ;
-
如果两个区间不相交,终止递归 ;
-
剩下的就是相交的情况,递归搜索左右儿子 。
考虑第三种情况的发生次数,线段树的每一层按照左端点排序,显然是互不相交的区间。对于 [L, R] 来说,它与一系列节点相交,显然只有左右两端的节点发生第三种情况。
也就是说,每一层最多 O ( 1 ) O(1) O(1) 种第三种情况,而线段树的高度是 O ( log n ) O(\log n) O(logn) 的,显然第三种操作的时间复杂度就是 O ( log n ) O(\log n) O(logn) 的。
又因为每一层,只有第三种情况会继续递归,而一个节点只有两个儿子,所以一般来说情况一、二的总发生次数不会超过情况三的两倍。
综上,基本操作的时间复杂度是 O ( log n ) O(\log n) O(logn) 的。
(参考自国家集训队 2016 论文集)