线段树

介绍

    线段树是

(1)平衡二叉搜索树 (2)每个节点的key是一个区间和存储与该区间相关的内容 (3)子节点的区间是对根节点区间的划分(二分)

根据以上性质可以看出线段树的功能和用处。作为一颗搜索树,它具有插入或删除一个区间,更新某区间相关属性的功能。由于每个节点存储了某个区间的相关信息,线段树适于解决和区间统计有关的问题。比如某些数据可以按区间进行划分,按区间动态进行修改,而且还需要按区间多次进行查询,那么使用线段树可以达到较快查询速度。平衡的2叉树结构使得插入,查询,更新的算法都是O(lgn)。

    对于大的区间或浮点数区间,直接建立线段树可能会带来很高的空间复杂性。在实际问题中,可能可以通过离散化方法解决问题,即在实际问题中,并不需要将区间进行2分得到子区间。在区间很大或浮点数区间的情况下,在插入的过程中,被插入的区间几乎不会与某一个二分区间相同。因此,对于插入的不同线段的数目不太多的情况下,根据实际将要插入的所有区间 将总区间划分成相应的小块,在建树的过程中以数的左右子树大小相等的准则确定分割点。


常见问题类型

根据更新操作的异同,参考【1】中归纳了用到线段树的几种题型。

(1)单点更新:即更新操作只涉及到单个点。由于包含更新点的区间最多有lgn个,将所有包含更新点的区间更新一遍的复杂度为O(lgn);

(2)成段更新:即每次对一个区间的所有值进行批量更新。只有那种对区间内所有节点进行同种类型的更新才适合用线段树解决(同时加多少,同时改变成某个数等等)。成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当前区间已经更新了。不这样做会导致对某一个区间的所有后代都进行更新,最坏复杂度为O(n);

(3)区间合并:在处理完左右子树之前,不能确定根节点的信息,因此需要在完成左右子树的处理后,将得到的信息返回到根节点进行综合;

(4)扫描线:应该是针对二维情况,以后遇到这类的题再总结;

(5)其他


参考

【1】@shiqi_614,线段树总结,http://blog.csdn.net/shiqi_614/article/details/8228102

【2】shǎ崽,【完全版】线段树,http://www.notonlysuccess.com/index.php/segment-tree-complete/

【3】百度百科,线段树,http://baike.baidu.com/view/670683.htm

【4】郭炜,线段树和树状数组,acm.pku.edu.cn/JudgeOnline/summerschool/1_interval_tree.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值