线段树在算法中的应用朱凯迪.docVIP

  • 3
  • 0
  • 约1.21万字
  • 约 13页
  • 2017-09-02 发布于浙江
  • 举报
线段树在算法中的应用朱凯迪

线段树在算法中的应用 作者:朱凯迪 作者单位:宁波工程学院 Email:zukaidi@163.com 摘 要: 计算机信息学竞赛中出现了越来越多的统计,查找,规划,排序,染色等等的题目。平衡二叉树和线段树是两种最常见的解决此类问题的数据结构。可是平衡二叉树有一个缺点,就是变成复杂度很高。我们可以看到在某些题目中,线段树是它的有力替代品。这篇论文主要介绍了线段树的操作,优化以及应用。该论文也会系统地介绍染色问题使用线段树的一般解法。 关键词:线段树 数据结构 信息学 算法 线段树的定义及特征 一棵二叉树,记为T(a, b),参数a, b表示该结点表示的区间[a, b]。区间长度b-a记为L。递归定义T[a, b]: 若L1:[a, (a + b) div 2]为T的左儿子 [(a + b) div 2, b]为T的右儿子。 若L=1:T为一个叶子结点。 表示区间[1, 10]的线段树表示如图1-1所示: (图1-1) 定理1:线段树把区间任意一条线段都分成不超过条线段。 证明: 在区间(a, b)中,对于线段(c, d),如果(c = a)或(d = b),那么线段在(a, b)中被分为不超过。 用归纳法证明,如果是单位区间,最多被分为一段,成立。 如果区间(a, b)的左儿子与右儿子成立,那么如果当c = a时, 若d = (a + b) div 2那么相当与其左儿子分该线段,所分该线段树不超过,即不超过,成立。 若d (a + b) div 2那么相当于该线段被分为它左儿子表示的线段,加上右儿子分该线段,线段数不超过,也不超过,成立。 对于d = b的情况证明类似,不在赘述。 在区间(a, b)中,对于任意线段也用归纳法证明。 对于单位区间,最多分为一段,成立。 若(a, b)的左儿子与右儿子均成立,则对于线段(c, d) 若d = (a +b) div 2则该区间所分该线段等于其左儿子区间所分该线段,线段数小于,成立。 若c (a + b) div 2则该区间所分该线段等于其右儿子区间所分该线段,线段数小于,成立。 若1、2均不成立,则此线段在左儿子区间分该线段满足d V.Lson.b,分该线段数不超过,而在右儿子区间分该线段满足c = V.Rson.a,分该线段不超过,所以在该区间分该线段不超过,成立。 这个结论为线段数能在的时间内完成一条线段的插入、删除、查找等工作提供了理论依据。 除了以上性质,线段数还具有以下一些性质: 线段数是一个平衡树,树的高度为。 任两个结点要么是包含关系要么没有公共部分,不可能重叠。 给定一个叶子p,从根到p路径上所有结点代表的区间都包含点p,且其它结点代表的区间都不包含p。 线段树的基本存储结构和操作 2.1 线段数的基本存储结构 线段数的一个结点的最基本存储数据结构如图2-1-1所示: (图2-1-1) 也可以用数组模拟二叉树,则结构体中不需要两个指针变量。 其中left和right分别表示该结点的左右端点,而mid则是中点。这样就不需要在每次再计算了。而lson和rson分别指向该结点的左儿子和右儿子,如果没有,则为NULL。 这只是线段树结点的最基本结构,在解决实际问题时,还需要根据实际情况添加各种需要储存的数据。如[ZOJ]1610 Count the Colors中,我建立的线段树结点结构体如图2-1-2所示: (图2-1-2) 其中l, r各代表左右端点,mid代表中点,col代表颜色。lc和rc各代表左儿子和右儿子。 2.2 线段数的基本操作 2.2.1 线段树的建立操作 在对线段树进行操作前,我们需要建立起线段树的结构。我们使用结构 体数组来保存线段树,这样对于非叶节点,若它在数组中编号为 num,则其 左右子节点的编号为 2 * num,2 * num + 1。由于线段树是二分的树型结 构,我们可以用递归的方法,从根节点开始来建立一棵线段树。代码如图2-2-1所 示: (图2-2-1) 对应不同的题目,我们会在线段树节点中添加另外的数据域,并随着线段的插入或删除进行维护,要注意在建树过程中将这些数据域初始化。 2.2.2 线段树的插入操作 为了在插入线段后,我们能知道哪些节点上的线段被插入(覆盖)过。我们需要在节点中添加一个cover域,来记录当前节点所表示的线段是否被覆盖。这样,在建树过程中,我们需要把每个节点的cover 域置 0; 在线段的插入过程中,我们从根节点开始插入,同样采取递归的方法。如果插入的线段完全覆盖了当前节点所代表的线段,则将当前节点的 cover 域置 1 并返回。否则,将线段递归进入当前节点的左右子节点进行插入。代码图2-2-2所示。 (图2-2-2) 要注意,这样插入线段时,有可能出现以

文档评论(0)

1亿VIP精品文档

相关文档