统计的力量线段树ppt课件.ppt
《统计的力量线段树ppt课件.ppt》由会员分享,可在线阅读,更多相关《统计的力量线段树ppt课件.ppt(102页珍藏版)》请在三一办公上搜索。
1、清华大学 张昆玮,统计的力量线段树全接触,2022年11月28日,清华大学 张昆玮,2,许多算法的本质是统计,根据 D. E. Knuth 的分类方法计算机算法可以分为两类:数值算法与非数值算法其中的非数值算法包括:索引分类统计,2022年11月28日,清华大学 张昆玮,3,线段树?,大家都说:常数很大?不好写?难调试?想不到?,2022年11月28日,清华大学 张昆玮,4,一个悲剧,POJ上的某题,时限很紧大家都用树状数组,但是有人只会用线段树呢?而且我可以轻易改出一道不能用树状数组的题在线段树一次次TLE后,有一个ID发帖抱怨“下次写一个汇编版非递归线段树,再超时?”可是大家都知道,超时的
2、代码已经2k了。其实我写的就是线段树。很快,而且不到1k。,2022年11月28日,清华大学 张昆玮,5,线段树用于统计,运行速度快适应能力强编写方便结构简单容易调试关键在于灵活实现,线段树,从何而来?,为什么在算法导论和黑书中都难见到其踪迹?,2022年11月28日,清华大学 张昆玮,6,2022年11月28日,清华大学 张昆玮,7,计算几何!,计算几何在长期的发展中,诞生了许多实用的数据结构。区间查询,穿刺查询都是计算几何解决的问题作为特例中的特例,线段树解决的问题是:一维空间上的几何统计高维推广(kd-tree & )可以进行正交查询由于竞赛中涉及计算几何的内容有限,不展开,2022年1
3、1月28日,清华大学 张昆玮,8,真正有用的是“点树”,线段树把数轴分成区间来处理如8,10), 10,11), 实际上我们面对的往往是离散量竞赛中出现的线段树往往因此退化为“点树”即,最底层的线段只包含一个点:如:8,9)中只有整点8而已在之后的讨论中,我们不再区别“点树”与线段树,第一印象,如果我给MM的第一印象不到80分的话是不是老老实实地早点罢手比较好?,2022年11月28日,清华大学 张昆玮,9,2022年11月28日,清华大学 张昆玮,10,最经典的问题:区间和,2022年11月28日,清华大学 张昆玮,11,核心思想:分治,1,4) in 0,4)左边,1,2) in 0,2)
4、Get 1Get 2,4) in 2,4)虽然每次都有可能同时递归进入两棵子树,但每层实际上只访问了两个节点。为什么?因为查询是连续的啊,其实还有别的核心思想后面再讲,2022年11月28日,清华大学 张昆玮,12,因为查询是连续的?,如果同一层有三个被访问,依次为A,B,C查询是连续的,有了A和C,就一定包括B在树中的兄弟那我直接用B的父亲来计算好了,为什么要用B?,为什么用线段树?,功利点说,没啥用的东西咱不学,2022年11月28日,清华大学 张昆玮,13,且慢,直接把原数组处理成前缀和For i=2 to n doAi += Ai-1Ans(a,b) = Aa - Ab-1,区区区间和
5、,用的着线段树?,2022年11月28日,清华大学 张昆玮,14,2022年11月28日,清华大学 张昆玮,15,这是为什么呢?,原因是区间和的性质非常好满足区间减法区间减法什么的最讨厌了!后面再说!不过直接前缀和不是万能的!如果修改元素的话,2022年11月28日,清华大学 张昆玮,16,真正的作用,沟通原数组与前缀和的桥梁,其实(其实什么,后面再讲),怎么写?,这个问题,本来是仁者见仁,智者见智的啊但是我要讲一点不那么“本来”的东西,2022年11月28日,清华大学 张昆玮,17,2022年11月28日,清华大学 张昆玮,18,朴素的递归算法,访问线段如果要的是整条线段就直接返回如果与左子
6、线段相交就递归处理如果与右子线段相交就递归处理合并所得到的解遗憾的是,这种朴素的方法并不是那么容易实现而且存在严重的效率问题(常数太大),2022年11月28日,清华大学 张昆玮,19,怎么办?,TLE,从存储方式讲起,工欲善其事,必先利其器。,2022年11月28日,清华大学 张昆玮,20,2022年11月28日,清华大学 张昆玮,21,几个不那么重要的问题,虽然可以设计出三叉,四叉,线段树但是我们先从二叉树开始登高必自迩,行远必自卑多叉怎么办后面再讲(这还要讲?自己研究去)为了不处理各种特殊情况,假设二叉树是满的!不是满的?你的总区间是0,1000)?你就当作0,1024)不就好了?,20
7、22年11月28日,清华大学 张昆玮,22,堆式存储是关键,指针退休了?后面再讲,2022年11月28日,清华大学 张昆玮,23,一些简单的问题,N 的左儿子是 2NN 的右儿子是 2N + 1N 的父亲是 N 1不就是个堆存储么?不用讲了吧?,2022年11月28日,清华大学 张昆玮,24,换成二进制看看吧!,2022年11月28日,清华大学 张昆玮,25,似曾相识?,字母树!存放的是100,101,110,111四个串!每个节点存的是以这个节点为前缀的所有节点和例:1中存的是所有四个以1开头的和。似乎从 100 到 111 就正好是原数组貌似下标减 4 就行了?,2022年11月28日,清
8、华大学 张昆玮,26,好多性质啊,有用么?,我们可以直接找到一个数对应的叶子不用自顶向下慢慢地找啊找“直接加 4 ”多简单!直接找到叶子?无限遐想中,存下来了,然后呢?,可以直接找到叶子?,2022年11月28日,清华大学 张昆玮,27,2022年11月28日,清华大学 张昆玮,28,天然的非递归方法!,2022年11月28日,清华大学 张昆玮,29,天然的非递归方法!,2022年11月28日,清华大学 张昆玮,30,这么简单?,Func Query(s,t) / 询问从s到t闭区间s = s 1, t = t + 1; / 变为开区间s += M, t += M; / 找到叶子位置While
9、 not (s xor t) = 1) doIf (s and 1) = 0) Answer += Trees + 1;If (t and 1) = 1) Answer += Treet 1;s = s 1, t = t 1;,2022年11月28日,清华大学 张昆玮,31,C语言更简单!,for (s=s+M-1,t=t+M+1;st1;s=1,t=1) if (s,2022年11月28日,清华大学 张昆玮,32,Warning,在将闭区间转化成开区间的时候可能越界1理论上能放 0,2N) 的树其实只能查询 1,2N - 2 的范围切记切记,2022年11月28日,清华大学 张昆玮,33,不
10、要紧张,如果需要查询 0 就整个向后平移一下所有下标加一!如果需要在0,1024)中查询1023结尾的区间?慢!你的数据规模不是 1000 么?如果真的要到1023,直接把总区间变成0,2048)就是这么狠!,2022年11月28日,清华大学 张昆玮,34,修改就更简单,Func Change(n,NewValue)n += M;Treen = NewValue;While n 1 don = n 1;Treen = Tree2n + Tree2n+1;,2022年11月28日,清华大学 张昆玮,35,C语言更简单,for(Tn+=M=V, n=1;n;n=1)Tn=Tn+n+Tn+n+1;没
11、了?没了。,2022年11月28日,清华大学 张昆玮,36,技术参数?,仅使用了两倍原数组的空间其中还完整地包括了原数组构造容易:For i=M-1 downto 1 do Ti=T2i+T2i+1;太好写了!好理解!自底向上,只访问一次,而且不一定访问到顶层实践中非常快,与树状数组接近为什么呢?后面再讲。,2022年11月28日,清华大学 张昆玮,37,人家树状数组只用一倍空间,因为树状数组依赖于区间减法区间减法什么的,最讨厌了后面再讲,再讲反正如果只问问前缀和,不问区间和的话那我也可以只用一倍空间!,2022年11月28日,清华大学 张昆玮,38,天然的非递归方法!,2022年11月28日
12、,清华大学 张昆玮,39,天然的非递归方法!,2022年11月28日,清华大学 张昆玮,40,天然的非递归方法!,2022年11月28日,清华大学 张昆玮,41,所有右儿子没有用了,2022年11月28日,清华大学 张昆玮,42,省了一半空间吧,这不就和树状数组一样了?本来就应该一样。回过头说,树状数组究竟是什么?就是省掉一半空间后的线段树加上中序遍历计算位置需要lowbit什么的我们用的是先序遍历,符合人的思考习惯。,但是,这个空间没必要省。费点空间能换来实现的绝对简单。,2022年11月28日,清华大学 张昆玮,43,哈哈,2022年11月28日,清华大学 张昆玮,44,Just For
13、Fun,我之前用这种写法做过不少题大家都说我的代码看不懂我说这就是一个树状数组写树状数组的人说没有lowbit我说那就算是线段树吧大家不相信非递归的线段树这么短我:,标记的传递与收集,懒惰即美德。,2022年11月28日,清华大学 张昆玮,45,区间修改,噩梦的开始,2022年11月28日,清华大学 张昆玮,46,2022年11月28日,清华大学 张昆玮,47,带区间修改的RMQ,RMQ (Range Minimum Query)区间最小值查询线段树支持区间修改:某一区间的数值全部增加一个可正可负的数暴力修改不灵了!,2022年11月28日,清华大学 张昆玮,48,四两拨千斤,在线段树上的每个
14、节点增加一个标记表示这一区间被增加过多少在自顶而下的递归过程中如果看到标记,就更新当前节点的值并将标记下传嗯?又要自顶向下?,2022年11月28日,清华大学 张昆玮,49,标记永久化,其实堆式存储也可以自顶向下访问就是上下各走一次而已但是我们有更好的办法(使劲想想就知道了)不再下传标记,而是随用随查在自底向上的查询过程中每向上走一层,就按照对应的标记调整答案仔细想想很有道理。我们愿意把尽可能多的信息存放在树的根部,所以下传标记做什么?,常数很小:One Pass,永久化的标记就是值,庄周梦蝶而已,2022年11月28日,清华大学 张昆玮,50,2022年11月28日,清华大学 张昆玮,51,
15、染色问题,一根线段,支持区间染色。询问区间是否同色?区间染色需要使用染色标记1表示红色,2表示蓝色,3绿色,0杂色询问的时候就直接看标记嘛,2022年11月28日,清华大学 张昆玮,52,直接看标记?,2为红色,3为蓝色,1为杂色修改3为红色查询1,杂色?永久化的标记就是值啊!值是自动维护的啊!其实我们的修改算法在修改3的时候已经维护了1自底向上顺便重算所有遇到的节点标记即可If (Markx=0 and Mark2x=Mark2x+1)Markx=Mark2x;,2022年11月28日,清华大学 张昆玮,53,狗拿耗子,猫下岗了,回到区间修改的RMQ通俗地讲,标记就是一个相对的量既然有了标记
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 统计 力量 线段 ppt 课件
链接地址:https://www.31ppt.com/p-1467731.html