線段树在算法中的应用[朱凯迪].docVIP

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
線段树在算法中的应用[朱凯迪]

FILENAME 线段树在算法中的应用[朱凯迪].doc 宁波工程学院学年论文 PAGE - PAGE 13 - 线段树在算法中的应用 作者:朱凯迪 作者单位:宁波工程学院 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 Lson为Left Son的缩写,表示左儿子。,分该线段数不超过,而在右儿子区间分该线段满足c = V.Rson.a Rson为Reft Son的缩写,表示右儿子。,分该线段不超过,所以在该区间分该线段不超过,成立。 Lson为Left Son的缩写,表示左儿子。 Rson为Reft Son的缩写,表示右儿子。 这个结论为线段数能在的时间内完成一条线段的插入、删除、查找等工作提供了理论依据。 除了以上性质,线段数还具有以下一些性质: 线段数是一个平衡树,树的高度为。 任两个结点要么是包含关系要么没有公共部分,不可能重叠。 给定一个叶子p,从根到p路径上所有结点代表的区间都包含点p,且其它结点代表的区间都不包含p。 线段树的基本存储结构和操作 2.1 线段数的基本存储结构 线段数的一个结点的最基本存储数据结构如图2-1-1所示: struct Seg{ struct Seg{ int left, right, mid; Seg *lson, *rson; }; (图2-1-1) 也可以用数组模拟二叉树,则结构体中不需要两个指针变量。 其中left和right分别表示该结点的左右端点,而mid则是中点。这样就不需要在每次再计算了。而lson和rson分别指向该结点的左儿子和右儿子,如果没有,则为NULL。 这只是线段树结点的最基本结构,在解决实际问题时,还需要根据实际情况添加各种需要储存的数据。如[ZOJ]1610 Count the Colors /onlinejudge/showProblem.do?problemCode=1610,染色问题。下文会具体讲解。中,我建立的线段树结点结构体 /onlinejudge/showProblem.do?problemCode=1610,染色问题。下文会具体讲解。 struct tree{ struct tree{ int l, r, col, mid; tree *lc, *rc; }; (图2-1-2) 其中l, r各代表左右端点,mid代表中点,col代表颜色。lc和rc各代表左儿子和右儿子。 2.2 线段数的基本操作 2.2.1 线段树的建立操作 在对线段树进行操作前,我们需要建立起线段树的结构。我们使用结构 体数组来保存线段树,这样对于非叶节点,若它在数组中编号为 num,则

文档评论(0)

d47fv82b5hI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档