pkuacm_summar3(1)(数据结构选讲).ppt
《pkuacm_summar3(1)(数据结构选讲).ppt》由会员分享,可在线阅读,更多相关《pkuacm_summar3(1)(数据结构选讲).ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、pkuacm_summar3(1)(数据结构选讲) Four short words sum up what has lifted most successful Four short words sum up what has lifted most successful individuals above the crowd: a little bit more. individuals above the crowd: a little bit more. -author -author -date-date线段树(树状数组)伸展树自动机后缀数组并查集function 以节点v为根建树、
2、区间为l,r 对节点v初始化 if (l!=r) 以v的左孩子为根建树、区间为l,(l+r)/2 以v的右孩子为根建树、区间为(l+r)/2+1,r 2、线段树把区间上的任意一条线段都分成不超过2logL条线段。这些结论为线段树能在O(logL)的时间内完成一条线段的插入、删除、查找等工作,提供了理论依据 n1、线段树的深度不超过logL。给定data0datan-1每个指令为下面两种操作中的一种: 给定k,修改datak的值 询问一个区间l,r里的dataldatar的最小值把data5的值修改为10function 修改以节点v为根的子树、区间为l,r 如果修改点不属于l,r 跳出 修改节
3、点v的值 if (l!=r) 以v的左孩子为根建树、区间为l,(l+r)/2 以v的右孩子为根建树、区间为(l+r)/2+1,r 查询data1data7中的最小值function 在节点v查询区间x,y if v所表示的区间与x,y的交集为空, 跳出 if v所表示的区间完全属于x,y 选取v else 在v的左孩子查询x,y 在v的右孩子查询x,y 有一个轨道,开始高度都为0给定一系列指令,每个指令为下面两种操作中的一种: 改变a,b的斜率为d 求最大的k,使得0,k中任意高度不超过h指令数100000轨道长度1000000000斜率height=p的左孩子-height+p的右孩子-he
4、ight p-max=maxp的左孩子-max, p的左孩子-height+p的右孩子-max如何处理巨大的轨道长度?方法1、离散化 优点:方法常见,实现简单 缺点:需预先知道所有的长度,是离线算法方法2、动态申请空间假设长度为10开始只有一个根节点0,9插入1,7后方法2、动态申请空间 优点:可以处理无法预先知道所有长度的题目,是在线算法 缺点:时间与空间复杂度都是O(nlogc) 而方法一的时间复杂度是O(nlogn) 空间复杂度为O(n)给定n1条平行于x轴的直线,n2条平行于y轴的直线,n3个点(n1,n2,n31001) 且坐标范围1001统计包含点的正方形个数,要求正方形的四条边都
5、在给定的直线上题目设置了两个障碍: 目标是统计正方形的个数,不是长方形的个数 要求正方形中有点很自然的想法:枚举边长首先枚举边长k如果知道了正方形的左边界L,也就可以知道正方形的右边界L+k,那么x坐标在L,L+k中的点在正方形中的x坐标就不影响了,二维问题转化成了一维问题现在的问题是:已知一条线段上所有点的位置,如何快速满足下列条件的线段的个数: 长度为k 包含点 线段端点选自于给定的表中要考虑长度为k的线段条数并不容易变通:线段中包含点,也可以转化为把点延长到长度为k,要求线段的一个端点在这个区间内问题转化为: 每个点有一个权值(由最初给定的直线决定) 插入(删除)一些线段,线段覆盖了一些
6、点 求被覆盖的点的权值和原数组是a,c是a的树状数组可以发现这些规律C1=a1C2=a1+a2C3=a3C4=a1+a2+a3+a4C5=a5C8=a1+a2+a3+a4+a5+a6+a7+a8C2n=a1+a2+.+a2n对于序列a,我们设一个数组C Ci = ai 2k + 1 + + ai k为i在二进制下末尾0的个数C即为a的树状数组如何求k?2k=x &(x(x-1) 以6为例 (6)10=(0110)2xor 6-1=(5)10=(0101)2 (0011)2and (6)10=(0110)2 (0010)2void change(int k,int delta); while (
7、k0) t+=ck,k-=lowbit(k);return t;树状数组VS线段树优点:代码简单、空间时间常数小缺点:有哪些题线段树可以做,树状数组不能做的? 树状数组能解决的问题大多为求和问题,如果已知节点p的值和p的左孩子的值,能推出p的右孩子的值,大多可以用树状数组解决伸展树(Splay Tree)是二叉查找树的改进,比一般二叉查找树再加了伸展操作伸展操作的目的是使二叉查找树尽可能随机,避免退化对伸展树的操作的平摊复杂度是O(log2n)。伸展树的空间要求、编程难度相对于其它平衡二叉树来说非常低。伸展操作Splay(x,S)是在保持伸展树有序性的前提下,通过一系列旋转操作将伸展树S中的元
8、素x调整至树的根部的操作。在旋转的过程中,要分三种情况分别处理: 1)Zig 或 Zag 2)Zig-Zig 或 Zag-Zag 3)Zig-Zag 或 Zag-Zig Zig或Zag操作: 节点x的父节点y是根节点。Zig-Zig或Zag-Zag操作: 节点x的父节点y不是根节点,且x与y同时是各自父节点的左孩子或者同时是各自父节点的右孩子。 Zig-Zag或Zag-Zig操作: 节点x的父节点y不是根节点,x与y中一个是其父节点的左孩子而另一个是其父节点的右孩子。 Join(S1,S2):将两个伸展树S1与S2合并。其中S1的所有元素都小于S2的所有元素。首先,找到伸展树S1中的最大元素x
9、,再通过Splay(x,S1)将x调整为S1的根。然后将S2作为x节点的右子树。这样,就得到了新伸展树S。Split(x,S):以x为界,将伸展树S分离为两棵伸展树S1和S2,其中S1中所有元素都小于x,S2中的所有元素都大于x。 首先执行Find(x,S),将元素x调整为伸展树的根节点,则x的左子树就是S1,而右子树为S2。伸展树不仅可以处理点的问题,也可以处理线段的问题处理点的问题,往往可以用stl里的set、map解决处理线段的问题:在每个点记录以这个点为根的子树的整体信息(如求最小值时,就是记这个子树中所有点的最小值)插入、删除、查找、求值等操作的维护,都与线段树相近但更加灵活,因为树
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pkuacm_summar3 数据结构
限制150内