网站大量收购闲置独家精品文档,联系QQ:2885784924

线段树111课件.ppt

  1. 1、本文档共89页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线段树111课件

ACM集训之 线段树;本讲稿主要来源;引例 数列操作;如果按题目要求直接模拟: 每一个ADD操作的复杂度是O(1) 每一个SUM操作的复杂度是O(N) 可见对于M次SUM询问,复杂度是O(NM) 有没有更好的方法呢?这里我们提出一种称之为线段树的数据结构。;线段树 ;表示区间[1, 10]的线段树样例: ;;线段树的定义;线段树的特征 ;线段树的运用;区间统计;显然,这是一个区间统计问题,让你统计[i, j]区间上的元素和。 最简单的思想是对于每个询问,我用循环加一遍,即可得到答案。 这个算法的正确性不容质疑,可时间复杂度呢? 每次询问最多可能从K1加到Kn,用循环的话要加n次,所以每次询问的复杂度是O( n ),m次就是O( mn );区间统计;经过这样的预处理后,每次询问就可以在O(1)的时间复杂度内得到解决,m次就是O(m)了。 思考:预处理的复杂度是多少? 你能想到O(n)的预处理方法么? 提示:利用 Si = Si-1 + Ki ;区间统计;线段树;线段树-变形,对点统计;线段树;线段树;线段树;线段树;这样,修改和询问都可以在O(lgN)时间内解决。 最后问题:如何表示线段树,如何建立线段树,如何初始化线段树。 表示: struct node { int sum, lbound, rbound; node *lchild, *rchild; }; node pool[N*3], *alloc = pool, *root;;线段树;线段树;例1;分析;最直接的做法;示例;缺点;离散化的做法;示例;示例;示例;缺点;使用线段树的做法;[1,6,0];线段树的数据结构表示;动态数据结构;[5,9];完全二叉树;插入算法;统计算法;事实上,我们也可以不在每个节点中保存其表示范围,而是在递归调用时增加两个参数来加以表示。;完全二叉树de另一种定义;插入算法;统计算法;例2;分析;分析;插入算法;插入算法;统计算法;统计算法;例3;分析;插入算法;统计算法;统计算法;例4;分析;插入算法;统计算法;POJ2182;继续推下去,可以得出:Fi就是除了Fi+1,Fi+2…Fn之外的数中第Ki + 1大的数。 非常好,我们就利用这个性质来逆向推出这个数列所有的值。;嘿嘿,这时寻求分析自然而然的就来了。 我们需要一个数据结构,他能求出第K大的数,并且支持删除操作。 什么数据结构可以满足? 1.BST(回忆上一讲的一个问题) 2.线段树;权衡 ??STL的set是无法在O( lgN )实现这样的BST的。所以要手写BST…上帝啊…囧 相比之下,自己设计的线段树实现比较容易,且效率不低,可以采纳!;继续分析:如何用线段树实现? 我要求的是第K大的数,如果每个结点都保存自己表示区间中覆盖的元素个数,那么……嘿嘿,你想到了? 厉害! 保存的这个值可维护么?显然可以在O( lgN )维护,good,线段树设计完毕了。;例5;用线段树解;定义;插入算法;统计算法;介绍另一种算法;图例;如何计算x对应的2^k?;function Lowbit(x: Integer): Integer; begin Lowbit := x and (x xor (x – 1)); end;;如何计算某个区间[a,b]的和sum(a, b);求和算法;如何修改一个元素的值;如何确定哪些C[x]需要修改?;修改算法;复杂度分析;例6;Mobile;;求和算法;修改算法;思考;两种算法的比较

文档评论(0)

mmrs369 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档