线段树【信息技术】.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线段树及其应用 刘汝佳 目录 线段树的定义 动态统计问题I 动态统计问题II 动态统计问题III 线段树的定义 线段[1, 9]的线段树和[2, 8]的分解 和应用相关的几个小问题 线段长度为偶数: 左小右大还是左大右小 一样大 原始线段长度不是2的幂: 允许不平均分割还是补齐到2的幂? (允许不平均分割) 叶子是单个元素i还是单位线段[i, i+1]? (是单个元素) 静态 or 动态?(静态) 建立: 自顶向下递归分割还是自底向上合并? 分割合并都可以 性质 每层都是[a,b]的划分. 记L=b-a, 则共log2L层 任两个结点要么是包含关系要么没有公共部分, 不可能部分重叠 给定一个叶子p, 从根到p路径上所有结点(即p的所有直系祖先)代表的区间都包含点p, 且其他结点代表的区间都不包含点p 给定一个区间[l, r], 可以把它分解为不超过2log2L条不相交线段的并 基本算法 找点: 根据定义,从根一直走到叶子logL 区间分解: 兵分两路 每层最多两个区间 总时间4log2L 线段树的关键 用线段树解题的关键 得到讨论区间(可能要先离散化) 设计区间附加信息和维护/统计算法 线段树自身没有任何数据, 不像BST一样有一个序关系 警告: 想清楚附加信息的准确含义, 不能有半点含糊! 建议: 先设计便于解题的附加信息,如果难以维护就加以修改 问题1. 动态统计问题I 包含n个元素的数组A ADD(i, k): 设A[i] = A[i] + k SUM(p, q): 求A[p]+A[p+1]+…+A[q] 附加信息: s(p)表示结点p所代表区间内所有元素之和 维护算法 ADD: 给i对应结点的所有直系祖先s值增加k SUM: 做区间分解, 把对应结点的s值相加 问题2. 动态统计问题II 包含n个元素的数组A ADD(i, j, k): 给A[i], A[i+1], … A[j]均增加k QUERY(i): 求A[i] 先看看是否可以沿用刚才的附加信息 QUERY(i)就是读取i对应的结点上的s值 ADD呢? 极端情况下, 如果是修改整个区间, 则所有结点都需要修改! 需要新的附加信息 新的附加信息 Lazy思想: 记录有哪些指令, 而不真正执行它们. 等到需要计算的时候再说 假设结点p对应的区间是[i, j], a(p)表示所有形如ADD(i, j, k)的所有k之和 如果[I, j]不对应任何结点怎么办? 区间分解! 这样的信息实质上是把所有ADD指令合并到了一起. 可以吗? 可以的, 因为ADD具有叠加性 QUERY: 把所有直系祖先的a值相加, 就是A[i]的增加量 继续讨论 附加信息a(p)到底是什么? 首先要在同一条指令中被增加 但在同一条指令中被增加的结点却不能都被修改, 否则ADD(1, n)仍然要修改所有结点 正确的理解是: 先把指令ADD分解为不超过2log2L条指令, 每条指令的区间[i, j]都在树中有单一的结点与之对应, 然后每条原子ADD操作只修改该结点本身的计数器 问题3. 动态统计问题III 包含n个元素的数组A ADD(i, j, k): 给A[i], A[i+1], … A[j]均增加k SUM(p, q): 求A[p]+A[p+1]+…+A[q] 显然动态统计问题I和II都是它的特殊情况 问题I中, ADD操作的i=j 问题II中, SUM操作的p=q 由于ADD操作和问题II一样, 这里沿用它的ADD实现, 那SUM怎么办? SUM的实现 前面曾经提到, 区间统计的一般做法是把查询区间进行分解, 一一统计然后加起来 在本题中,需要计算每个原子区间的数之和. 它们的和是多少呢? 这取决于有多少ADD操作影响到它 回忆: 任何两个树中区间要么相互包含要么没有公共部分. 因此影响一个原子区间的ADD操作都是它的直接祖先和后代 SUM的计算 右图表示影响SUM(7, 9)的所有区间 影响全部: [1,9], [5,9], [7,9] 影响部分: 7, [8,9], 8, 9 完整的算法 至此, 算法轮廓已经出来 再附加一个sa(p), 表示以p为根的子树所有结点的a值之和 ADD: 区间分解后除了修改各原子区间的a值外, 还要沿途修改sa值 SUM: 在区间分解的同时统计经过的a值, 然后把原子区间的sa值累加进来 两个操作均为O(logn) 问题4. 动态区间最小值 包含n个元素的数组A MODIFY(i, j): 设A[i] = j MIN(p, q): 求min{A[p], A[p+1],…,A[q]} 和动态统计问题I很类似, 因此考虑设计附加信息: m(p)表示结点p所代表区间内所有元素的最小值, 那么MIN仍可以通过区间分解做. 但MODIFY呢? 递推法 MODIFY操作仍

文档评论(0)

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

1亿VIP精品文档

相关文档