寒假复习感想——数据结构篇其三__线段树

线段树与树状数组

线段树:顾名思义,线段树这个数据结构是为了表示“线段”来设计的(更准确的说法是“区间”),主要应用的是二分的想法。

       //二分是divide and conquer 的一种,好的分治策略在降低复杂度方面往往有意想

//到的效果

//用二分思想设解决的很基础且很优美的问题有    LCA和RMQ   问题

//额,知识有限且一时想不起来了,欢迎补充

严格的定义很麻烦,但是用图来示例的话很容易理解,下图是表示[0,10]区间的线段树。

 

图一

线段树是一颗二叉搜索树,所以理所应当的,它支持以下操作:

1.插入

2.  删除

3.  访问

 

线段树的优势在于  快 ,  而且在空间上的冗余不大(约两倍)

例如:若要访问区间[1,4],在普通的线性结构中,需要访问[1,2][2,3][3,4]三个小区间(这么说不严格,但是大概就这意思),而在线段树中只需要访问[1,3]和[3,4](如图一)

 

不难发现(证明),线段树有以下基本性质(设线段树表示的区间长度是L):

1.  线段树把区间中任意一条线段都分割成了不超过2logL条小线段(可以在图一中观察一下,证明也很容易)

2.  线段树的高度不超过logL

以上两条性质保证了线段树是正确的并且是高效的。

 

线段树的一些细节与基础知识的扩充:

1.  在访问一个区间[a,b]的时候,任意时刻至多只有两个区间未被完全覆盖。

例如:在图一中访问[2,6],访问过程分为如下几步

A. 访问[1,10]

B. 访问[1,5],[5,10]

C. 访问[1,3][3,5][5,7](其中[3,5]被[2,6]完全覆盖,故未被完全覆盖的区间只有[1,3][5,7]两个)

D. 访问[2,3][5,6]

    这表明了插入和删除的复杂度为O(h)//这里的插入和删除并不是指插入新节点,而//仅仅是改变节点的状态,但是实际中节点状态的改变是伴随着事件点(访问一个区//间?描述不清,意会一下^^)的插入和删除发生的,所以称之为插入和删除亦可吧

2.  每一个节点表示的小区间中端点部分是特殊点,我一般习惯用半开半闭区间和闭区间结合起来描述。

3.  有时候一个区间的端点并不是整数,所以一颗支持浮点数的线段树除了图一中的结构之外还要有如下的一些部分:

A. 独立线段数

B. 每条独立线段应该伴随着对其端点的描述//例如:[3.5,7.3]=[3.5,4]+[4,7]+[7,7.3]

C. 除了上述两点之外,为了方便还可以记录线段树中现有线段的总长度和类似于权和一样的东西

以上差不多就是线段树所需要掌握的除了实现代码之外(我习惯像树状数组那样用数组来实现)的基本知识了。

 

线段树之所以高效的一个“感性”的解释是:它把一段连续的东西离散化了(分解?)

离散化是一种很重要的思想,计算机处理的东西都是离散的,而客观世界很多都是连续的。

一棵线段树只能表示区间的一个性质,这点虽然简单,但是我觉得需要明文提出来。

 

下例是一个关于线段树的很有启发性的应用:

例一:火星地图

    2051年,科学家们探索出了火星上N(N<=10000)个不同的矩形(坐标为不超过10^9)区域,并绘制了局部地图。

科学家们需要知道这些矩形总共占了多少面积,请写一个程序以解决之。

分析:显而易见,用裸的方法做的话慢得无法接受,下面直接给出用线段树解决此问题的算法。

1.  想象一条竖直垂线从左到右扫描(x坐标从小到大)

2.  每当扫描到某个矩形的边界时(设第i次扫描到边界),计算 第i-1次到第i次到边界时之间扫过的面积(易知此面积为矩形), 并做一次处理分以下两种情况

A. 扫描到某矩形区域的左边界,对线段树使用插入操作

B. 扫描到某矩形区域的右边界,对线段树执行删除操作

这样便能解决此问题,总的时间复杂度为O(NlogN)

之所以说这题有启示性有以下两方面的原因:

1.  这个解法是典型的应用了“离散化”思想的算法,“离散化”为我们从客观世界中抽象出我们所需要的模型提供了一种很有力的方案(尽管上例情况很简单,但是可以初步看出来)。

2.  在解决一个问题的时候,如果影响这个问题的因素有多个(上例中有矩形的纵坐标,横坐标两个),我们不妨去一个一个变量地研究,或者对某些因素进行假设(上例中,我们强行假定了从左像右扫描),或许有人认为这样的方法不够实用,但是我觉得在面对很复杂的问题的时候这样做不失为一个好选择(不就是控制变量法么。。。^^)。

另外,此题还能用二维线段树做,不赘述

 

总结:线段树是  关键空间分解 技术的一个具体实例,不错的数据结构,虽然有些同学觉得它没有树状数组优美^^。。。。

posted @ 2012-01-23 20:27  zhouyichi  阅读(380)  评论(0编辑  收藏  举报