收藏 分享(赏)

二分法与统计问题.ppt

上传人:lxhqcj 文档编号:7281643 上传时间:2019-05-12 格式:PPT 页数:42 大小:258.50KB
下载 相关 举报
二分法与统计问题.ppt_第1页
第1页 / 共42页
二分法与统计问题.ppt_第2页
第2页 / 共42页
二分法与统计问题.ppt_第3页
第3页 / 共42页
二分法与统计问题.ppt_第4页
第4页 / 共42页
二分法与统计问题.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、二分法 与统计问题,简介,一定范围内计数问题特点: 1 描述简单 2 要求对数据动态维护,动态计算解决手段:特殊的统计模式和结构,线段树,动态处理可以映射在一个坐标轴上的一些固定线段,例如求并区间的总长度,或者并区间的个数等等。优点:随时插入一个区间或删除一个已有区间,并同时用低耗费维护需要的性质。,线段树-构造思想,下图显示了一个能够表示1,10的线段树:,线段树-动态数据结构,TypeTnode=Treenode;Treenode=recordB,E:integer; Count:integer;LeftChild,Rightchild:Tnode;End;其中B和E表示了该区间为B,E;

2、Count为一个计数器,通常记录覆盖到此区间的线段的个数。LeftChild和RightChild分别是左右子树的根。,线段树-静态数据结构,用数组B,E,C,LSON,RSON。设一棵线段树的根为v。那么Bv,Ev就是它所表示区间的界。Cv用来作计数器。LSONv,RSONv分别表示了它的左儿子和右儿子的根编号。,线段树-建树,从根对应的区间a,b出发,每次分成两个部分,分别建立对应的左右子树,直到面临一个初等区间x,x+1。,线段树-插入删除线段,将区间c,d插入线段树T(a,b),并设T(a,b)的根编号为v procedure INSERT(c,d;v) Beginmid=(Bv+Ev

3、) div 2;if cBv and Evd then Cv Cv+1else if cmid then INSERT(c,d;RSONv); end,线段树-一个特殊性质举例,要得到线段树上线段并集的长度,增加一个数据域 Mv,讨论: Cv0,Mv = Ev-Bv; Cv=0 且v是叶子结点,Mv=0; Cv=0 且v是内部结点,Mv=MLSONv+MRSONv;,线段树-变形,对点统计,例一,一位顾客要进行n(1n5000)天的购物,每天他会有一些帐单。每天购物以后,他从以前的所有帐单中挑出两张帐单,分别是面额最大的和面额最小的一张,并把这两张帐单从记录中去掉。剩下的帐单留在以后继续统计。

4、输入的数据保证,所有n天的帐单总数不超过1000000,并且每份帐单的面额值是1到1000000之间的整数。保证每天总可以找到两张帐单。,建立点线段树,范围是1,1000000,即每种面额的帐单设为一个叶结点。 如果CLSONv0,那么树v中的最小值一定在它的左子树上。 如果CRSONv0,它的最大值在右子树上;,一种静态统计方法,例二IOI2001 MOBILES :在一个N*N的方格中,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子矩阵(x1,y1)-(x2,y2)中所有元素的和;修改的规则是指定某一个格子(x,y),在(x,y)中的格子元素上加上或者

5、减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1N1024,提问和修改的总数可能达到60000条。,一维序列求和,设序列的元素存储在a中,a的下标是1n的正整数,需要动态地更新某个ax的值,同时要求出ax1到ay1这一段所有元素的和。,对于序列a1n,我们设一个数组C1n,Ci=ai-2k+1+ai,其中k为i在二进制下末尾0的个数1001010110010000 k =4 计算Cx对应的2k LOWBIT(x) 2k =x and (x xor (x-1),修改一个ax的值 与哪些C相关?例如x=76=(1001010)2,从形式上进行观察,可以得到:p1= 1001010p2=

6、 1001100p3= 1010000p4= 1100000p5=10000000修改Cp1,Cp2,procedure UPDATA(x,A) beginpxwhile (p=n) dobeginCpCp+App+LOWBIT(p)end end 维护的费用:logn,求a1-ax的和 function SUM(x) beginans 0 p x while (p0) dobeginansans+Cppp-LOWBIT(p)end return ans end,Cp=ap- 2k +1+ap 下一个p=x- 2k,推广为原来的二维问题,把C构造成 Cx,y,其每一维定义与原来相同。推广后算法

7、:两层嵌套,一次维护费用为O(log2n),集合3,4,5,8,19,6,静态二叉排序树实现,构造过程1 递归:,建立所有点坐标的映射X p 0 作为X映射中的指针 procedure BUILD(ID:integer)beginif (ID*2n) then BUILD(ID*2);pp+1;VID=Xp;if (ID*2+1n) then BUILD(ID*2+1); end 在主程序中调用BUILD(1),构造过程2 非递归:,方法,依次找出当前点的后继点的下标 第一个点first一定为最下层最左边的一个位置,若n个点有L层,则first=2 L-1 若当前的点位置为now:如果它有右儿

8、子,即now*2+1=n,则下一 个位置是右子树最左下的点如果没有右儿子,当now是奇数时,将now除以2,直到now是偶数,最后再将now除以2。,插入一个点x,procedure INSERT(x) beginnow 1 repeatSUMnowSUMnow+1if (Vnow=x) breakif (Vnowx) nownow*2else nownow*2+1 until false End 其中SUM是记录一棵子树上结点总数 删除 的方法是类似的,怎样解决例二,procedure INSERT2(x,A) beginnow 1 repeatif (xx) nownow*2else no

9、wnow*2+1 until false end LESS为根及其左子树上所有点位置的权和,求a1x的元素和 function SUM(x):longint beginans 0now 1 repeatif (Vnowx) nownow*2else nownow*2+1 until falsereturn ans end,例三采矿(KOP),金矿的老师傅年底要退休了。经理为了奖赏他的尽职尽责的工作,决定送他一块长方形地。长度为S,宽度为W。老师傅可以自己选择这块地。显然其中包含的采金点越多越好。你的任务就是计算最多能得到多少个采金点。如果一个采金点的位置在长方形的边上,它也应当被计算在内。 任

10、务:读入采金点的位置。计算最大的价值。 输入:文件KOP.IN的第一行是S和W,(1=s,w=10 000);他们分别平行于OX坐标和OY坐标,指明了地域的尺寸。接下来一行是整数n (1=n=15 000),表示采金点的总数。然后是n行,每行两个整数,给出了一个采金点的坐标。坐标范围是(-30 000=x,y=30 000)。 输出:一个整数,最多的采金点数。,样例图示,初步,对X离散化后,图示,对于每一种坐标y,建立成两个点事件(y,+1),(y+w+1,-1), 例如在一个带状区域内有5个点的纵坐标分别是5,3,9,1,9,w=2 ,标成(1,+1),(4,-1),(3,+1),(6,-1

11、),(5,+1),(8,-1),(9,+1),(12,-1), (9,+1),(12,-1), 再将他们按照y的坐标排序,得(1,+1),(3,+1),(4,-1), (5,+1), (6,-1), (8,-1), (9,+1), (9,+1),(12,-1), (12,-1) 我们把后面的标号反映在一个y坐标的映射上,然后从低到高求和,坐标下的求和,这些和中最大的一个就是该带状区域中一个包含最多点数的矩形 在插入或者删除一个点事件之后,能够维持坐标下的值;能够在很短时间内得到中最大的一个值。,实现:,SUMnow对应子树上所有+1,-1标号的和。实现极简单 MAXSUMnow,子树上和最大的

12、一个前缀的值。MAXSUM1是一种状态下得到最优解。如何维护? MAXSUM有哪几种可能? 1 最大值在左树上; 2 最大值正好包含根结点; 3 最大值在右树上。,自下而上维护树的特性,找到当前坐标对应点序号now,修正标号为k RepeatSUMnowSUMnow+kMAXSUMnowMaxMAXSUMnow*2, SUMnow-SUMnow*2+1, SUMnow-SUMnow*2+1+MAXSUMnow*2+1 now now div 2 until now = 0,二分法虚拟实现树,二叉树使用之前必须构造出一个空的二叉树 对于任何一个有序表,在对其进行二分查找时,实际上就等于在一个二叉

13、树上进行查找,对于一个表1,3,4,8,9的二分查找,等价于在如下图的二叉排序树上进行查找:,举插入结点的例子,来说明这种虚实现的方法,设LESS表示根及其左树上结点的个数:,procedure INSERT(x) beginl1,rnwhile (l=r) dobeginm=(l+r) div 2if x=Vm LESSmLESSm+1if x =Vm breakif xVm then r m 1else lm+1end end,例四最长下降序列,给定一个整数序列a,求最长下降序列的长度。,O(n2),对P进行特殊的限制,即,在所有等价的决策j中,P选择aj最大的那一个 在处理完a1x-1之

14、后,对于所有长度为Mx-1的下降序列,Px的决策只跟其中末尾最大的一个有关。 用另外一个动态变化的数组b,当我们计算完了ax之后,a1x中得到的所有下降序列按照长度分为L类,每一类中只需要一个作为代表,这个代表在这个等价类中末尾的数最大,我们把它记为bj,1jL。 处理当前的一个数ax,我们无需和前面的aj(1jx-1)作比较,只需要和bj(1jL)进行比较。,首先,如果ax=b1,这时ax 仅能构成长度为1的下降序列,同时它又必然是最大的,所以它作为b1的代表,b1=ax。 如果前面的情况都不存在,我们肯定可以找到一个j,2jL,有bj-1ax,bjax,这时分析,ax必然接在bj-1后面,行成一个新的长度为j的序列。,这几种情况实际上都可以归结为:处理ax,令bL+1为无穷小,从左到右找到第一个位置j,使bjax,然后则只要将bj=ax,如果j=L+1,则L同时增加。x处以前对应的最长下降序列长度为Mx=j。 L 0 for x1 to n dobeginbL+1无穷小j1while (bjax) jj+1bjaxif jL then Ljend,更改成:j1,kLwhile (jk) dobeginm (j+k) div 2if bmai jm+1else km-1endif jL LL+1bjai,小结,离散化转化问题,构造可统计的结构,Thank you all!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报