码迷,mamicode.com
首页 > 其他好文 > 详细

线段树入门之惊鸿一瞥

时间:2019-07-25 00:24:52      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:img   不用   二分   线段   http   二分法   nbsp   它的   com   

--------------------------走吧,目标伟大航路!

线段树的点点滴滴:

先从一些直观性的角度来看:

技术图片

 

 

上图是用二分法丫!问题来喽,

对于给定区间[2,12]要如何分解成上述区间呢,何以分解之?

分解方法一:自下而上合并——利于理解

先考虑树的最下层,将所有在区间[2,12]内的点选中,然后,若相邻的点的直接父节点是同一个,

那么就用这个父节点代替这两个节点(父节点在上一层)。这样操作之后,本层最多剩下两个节点。

若最左侧被选中的节点是它父节点的右子树,那么这个节点会被剩下。若最右侧被选中的节点是它的父节点的左子树,那么这个节点会被剩下。

中间的所有节点都被父节点取代。对最下层处理完之后,考虑它的上一层,继续进行同样的处理。

继续沿用上面的那个引子图丫:

这是n=13的线段树,区间[2,12],按照上面的叙述进行操作的过程图:

技术图片

技术图片

 

 技术图片

 

 技术图片

由图可以看出:在n=13的线段树中,[2,12]=[2] + [3,4] + [5,7] + [8,10] + [11,12] 。

分解方法二:自上而下分解——利于计算

技术图片

 

 

 首先对于区间[1,13],计算(1+13)/2 = 7,于是将区间[2,12]“切割”成了[2,7]和[8,12]。

技术图片

其中[2,7]处于节点[1,7]的位置,[2,7] < [1,7] 所以继续分解,计算(1+7)/2 = 4, 于是将[2,7] 切割成[2,4]和[5,7]。

技术图片

 

 [5,7]处于节点[5,7]的位置,所以不用继续分解,[2,4]处于区间[1,4]的位置,所以继续分解成[2]和[3,4]。

技术图片

最后【2】 < 【1,2】,所以计算(1+2)/2=1 ,将【2】用1切割,左侧为空,右侧为【2】

技术图片

当然程序是递归计算的,不是一层一层计算的,上图只表示计算方法,不代表计算顺序。

 -----------------------------------------------------------------------------------------------------------------感谢诗鸿提供的博客图片。

线段树入门之惊鸿一瞥

标签:img   不用   二分   线段   http   二分法   nbsp   它的   com   

原文地址:https://www.cnblogs.com/dragondragon/p/11241530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!