收藏 分享(赏)

Ch1314_Part3_红黑树、数据结构扩张.ppt

上传人:11xg27ws 文档编号:5851922 上传时间:2019-03-19 格式:PPT 页数:69 大小:895KB
下载 相关 举报
Ch1314_Part3_红黑树、数据结构扩张.ppt_第1页
第1页 / 共69页
Ch1314_Part3_红黑树、数据结构扩张.ppt_第2页
第2页 / 共69页
Ch1314_Part3_红黑树、数据结构扩张.ppt_第3页
第3页 / 共69页
Ch1314_Part3_红黑树、数据结构扩张.ppt_第4页
第4页 / 共69页
Ch1314_Part3_红黑树、数据结构扩张.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

1、,1,Thomas H. Cormen 等著 The MIT Press,Introduction To Algorithms 算法导论 ( Part III Data Structures ),2,Part III Data Structures,本部分讨论的数据结构可看作是动态集合集合中元素分为两部分: Key , 辅助数据 集合上的操作 查询 (Search, Minimum, Maximum, Successor, Predecessor) 修改(Insert, Delete) Note 有的操作必须假定集合是全序集(线性序) 注意与偏序集的区别 全序集满足三分律,任两元素间是可比较的

2、,有最大、小值,3,Chapter 13. 红黑树,4,13 红黑树,二叉搜索树上执行查找、前趋、后继、最大/小值、插、删等动态集合。操作时间取决于树高O(h),当它退化为单支树时,其时间和单链表上操作时间一样为O(n) 平衡二叉树O(lg n) 完全平衡 -满二叉树 平衡的二叉搜索树 AVL62年 至多1.44lgn 红黑树72年 Bayer 高至多为2lg(n+1) 4阶B树红黑树 keys:13,subtrees:24,5,13 红黑树,6,13 红黑树(续),B-树只适于外部查找,内部查找只适用于阶数较低的B-树。4阶B-树转换为红黑树,后者变为二叉搜索树,其平衡性由B-树得以保证,7

3、,13.1 定义及性质,Def 1. 红黑树是满足下述性质(简称RB性质)的二叉搜索树: 每个结点或红或黑 根为黑色 每个叶子(nil)为黑(外部结点) 若结点为红,则其两个孩子必为黑 每一结点到其后代叶子的所有路径含有相同数目的黑结点,8,13.1 定义及性质,结点结构 color1位表示红或黑 内点:含关键字 外点:所有空指针域加上外结点(树叶),9,13.1 定义及性质(续),例子(三种表示) Fig13.1(a)通常表示 所有nil指针域用1个哨兵NILT表示(包括根的双亲指针),哨兵的color为黑。哨兵 简化边界条件处理,NILT是一个含有5个域的对象,和通常结点一样,若每个nil

4、域用一个哨兵表示,浪费空间,但其好处是其父亲无二义性,即每个PNILT有确定的值。所有NIL共享一个NILT时,处理稍复杂 省略空指针表示 Def 2: 结点x的黑高bh(x)是该结点到它的任何后代叶子路径上的黑点数(不包括x本身)。性质5保证此定义有效,10,13.1 定义及性质(续),Def 3: 红黑树的黑高是根的黑高:bh(rootT) Lemma13.1:一棵n个内点的红黑树的高度至多为2lg(n+1)Pf: 方法1,11,13.1 定义及性质(续),方法2,12,13.1 定义及性质(续),方法3 先证任一结点x为根的子树至少有2bh(x)-1个内点(用B树易证,每一B树中结点有一

5、黑点,而B树关键字RB树中结点数相应的满二叉树关键字数) 对x的高度 (不是黑高)用归纳法证明 归纳基础:若h(x)=0,则x为叶子(nil)bh(x)=0,20-1=0无内点,故成立。 设h(x)0,则x是内点,有两孩子。的每孩子黑高为bh(x)或bh(x)-1x的红孩子黑高应为bh(x),该红孩子没有计算在bh(x)中,而x自身也未算入x的黑孩子黑高应为bh(x)-1, 该孩子在bh(x)中已计算一次,但该孩子在自己的黑高中不计算,13,13.1 定义及性质(续),14,13.1 定义及性质(续),()根黑高至少为树高h的一半 性质4:红点必有两黑孩子即:bh(root) h/2 /根到任

6、何叶子的路径上至少有一半结点为黑点(不包含根)由(1)知该树内点数n至少为2h/2-1,i.e.,,Ex13.1-3 Ex13.1-5,15,13.2 旋转,插入、删除等修改操作可能违反红黑树性质,恢复时须修改某些结点颜色和改变指针 属性:双亲P,左子L,右子R,颜色C,关键字k左旋 Step1: 记录y Step2: 连到x右 Step3: y连到px(y是子树根) Step4: x连到y左,16,13.2 旋转(续),对x做左旋时,假定x的右子y非空(y不动,x-y左旋 )对y做右旋时,假定y的左子x非空(x不动,x-y右旋 ) 旋转仍保留了排序树性质不变 x y /红黑性质暂不讨论 右旋

7、与之对称 算法,17,18,19,右旋与之对称,20,13.3 Insertion,思想及步骤 Step1: 将z插入到RB树中(与二叉搜索树相同),z总是作为叶子插入(不是指外部结点) Step2:将z涂红 Step3: 使之满足RB性质(着色其它结点及旋转),即调整 算法,21,22,23,13.3 Insertion(续),调整分析 z作为红点插入后,其两个外部结点作为左右孩子是黑色的,不违反性质1,3,5(非红即黑,叶子为黑(外部点)、黑高定义完整 指任一结点黑高不变) 只可能违反性质2(当z作为根插到空树中)和性质4(当pz为红点) 若z作为根插入,将其涂黑(违反性质2,恢复) 若z

8、非根,则Pz存在 若pz为黑色,无须调整 若pz为红色,则调整(违反性质4),24,13.3 Insertion(续),pz为红,它不是根(根为黑), ppz必存在,且为黑色 分六种情况调整,其中case13为z的双亲pz是其是其祖父ppz的左孩子(右孩子对称) Case1:z的叔叔y是红色,将pz和y置为黑色,ppz 置为红色 令ppz为新z BST性质不变,25,13.3 Insertion(续),Note现在可能违反性质4的是ppz和它的双亲 令它是新的z,继续保持性质5的基础上向上调整,最多至根(若ppz与其双亲不违反性质4,则终止) 当红色向上传播至根时,(违反性质2),将其涂为黑色

9、,故树的黑高最多加1,但性质5不变,26,13.3 Insertion(续),Case2:当z的叔叔y是黑色,且z是双亲pz的右孩子 Case3:当z的叔叔y是黑色,且z是双亲pz的左孩子上述变换仍保持性质5不变,旋转后又保持性质4. 调整终止 Note: ,根为黑色 Case1和Case2,Case3互斥,z pz,左旋z,pz,ppx,pz,z,ppz,变色pz和ppz,右旋ppz,27,28,29,13.3 Insertion(续),时间分析RB树高O(lgn),插入为O(lgn),调整为O(lgn),2个旋转O(1)(至多2个旋转)总的时间: O(lgn),30,13.4 Deleti

10、on,二叉搜索树上的删除,设被删结点为z只要短路z即可,(实际上case1是case2的特例),即用z的唯一(可能非空的)孩子x取代之,31,13.4 Deletion(续),Case3:z的两子均非空 找z的中序后继y,即右子树中最左下结点y,y的左孩子为空;或z的中序前趋,即左子树中最右下结点y,y的右孩子为空 因为y最多只有一个非空孩子x(可能两子均空),故可用x取代y,与y的双亲短路,删去y 将y的内容copy至z中即:case3是将删z的操作变为删y的操作,而 删y的操作与case1和case2相同。物理上删y,逻辑 上删z。y的内容copy至z不破坏排序树的性质,三 种情况统一到c

11、ase2处理,32,33,34,13.4 Deletion(续),调整方法 RBDeleteFixup(T,x)/恢复RB性质被删结点y为黑色,故对于任何y的祖先结点而言,它们到叶子的路径上少了一个黑点,违反性质5想象将y的黑色涂到x上,,35,13.4 Deletion(续),但是双黑结点违反性质1(非红即黑)故调整时试图恢复性质1,消去双黑结点的一层黑情况1:若x是根,不影响性质5,直接移去一层黑(黑高减1)情况2:若x原为红,则将y的黑色加到x上(注意y只有一非空孩子),终止情况3:若x非根且原为黑,则通过变色和旋转将x上额外的一层黑色向树上方移动直至x指向某个红点或x指向根时终止,调整

12、共分为八种情况:Case14与Case58对称,前者x是px的左子,后者x是px的右子,36,13.4 Deletion(续),Case1: x的兄弟w是红色 x非根, 必有兄弟w。 (严格二叉树)又w不可能是nilT,即它可能为红点 w为红, px必为黑调整后子树根的黑高不变,BST性质不变,W和px变色 px左旋 w指向x的新兄弟,37,13.4 Deletion(续),Case2Case4:x的兄弟w为黑色,由w的孩子颜色区别 Case2:x黑兄弟w的两孩子为黑(w至少有一红孩子是case3,case4)w有两黑子,故w可变红 令A及D的黑色涂到B上,现在A是单黑结点。若B原为红(例如从

13、case1而来)则终止;否则继续脱去B上的双黑,px,t(R/B),原x,w变红 x上溯至px,只有此种情况须循环,38,13.4 Deletion(续), Case3:x黑兄弟w的右子为黑(左子必为红),w变红 x上溯至px,t,t,case3,case4,w左子c变黑,w变红 w右旋,w指向x的 新兄弟,39,13.4 Deletion(续), Case4:x黑兄弟w的右子为红,左子可红可黑,之上黑点数目变换前后不变,而,之上多了一个黑点,相当于x上多余黑点计数被移去,故调整终止Ex13.4-5,40,41,42,43,Chapter 14. 数据结构扩张,44,14 数据结构扩张,工程上

14、的数据结构往往要扩充现有的数据结构,即增加附加信息。在扩充结构上要引入许多新操作,增加的info须通过原结构上的基本操作来修改维护本章讨论两种RB树的扩充结构 OS树和区间树,45,14.1 动态顺序统计,Ch9中讨论过该问题,即在无序集合上找ith最小元时间为O(n)本章相当于是在有序集合上完成上述功能, 有序可在O(lgn)时间内完成,与有序数组不同的是后者是静态结构,插删效率较低 通过修改RB树,使之支持: 选择问题:给定一个Rank,求给定集合的相应元素 Rank问题:求给定元素x在集合中的秩 快速支持O(lgn)的扩充RB树称为顺序统计树(OS树),46,14.1 动态顺序统计(续)

15、,Def:OS树是一棵RB树,在每个结点上扩充一域Sizex,它是以x为根的子树中内部结点的总数(包括x本身),即子树的Size 若定义SizeNIL=0,则有恒等式:/或SizenilT=0Sizex = Sizeleftx + Sizerightx+1,T,47,14.1 动态顺序统计 (续),选择问题 OSSelect (x,i) 找给定秩的元素在以x为根子树中检索ith最小元在T中找ith最小元,可令x=rootTStep1: r Sizeleftx + 1; 即确定x的秩(在以x为根的子树中)Step2: 若i=r, 则返回x 若ir,则递归地在x的右子树中继续找第(i-r)个最小元

16、 时间:每次递归下降一层,至多为树高O(lgn),48,14.1 动态顺序统计 (续),确定给定元素的秩设x指向给定结点,要返回它在OS树中的秩。即:确定x在树T中是第几个最小元?也就是在T的中序序列中有多少个元素排在它之前再加上x本身。 Step1在以x为根的子树中,排在它之前的结点数为: r sizeleftx+1 /包括x本身r是x在以x为根的子树中的秩,49,Step2 若x是T的根,则返回r 若x是其双亲px的左子树,则px及x的右兄弟为根的子树中所有结点均不小于x,故只需将计算结点x上移至px(即,r是x在以x和px为根的子树中的秩) 若x是px的右子树,则px及左子树中所有结点均

17、应排在x之前,故累加此数到r中后可将计算点x移至px即:r r + sizeleftpx + 1r是x在以px(新x)为根的子树中的秩重复2,3至1时终止,即当x上溯至根后,r即为整个树T中所有排在x之前的元素个数(包括x本身)即:当x=rootT时,r是x在T中的秩,50,算法,51,14.1 动态顺序统计 (续),维护子树的SizeOSSelect和OSRank之所以能快速地计算,原因是OS树中给出了Size信息。但若在修改RB树的基本操作中不能有效地维护Size信息,这些新操作就失去了意义。一般地:对基本数据结构进行扩充信息,必须保证能有效地维护这些信息,所谓有效维护附加信息是指:扩充后

18、的基本操作(主要是指修改)与扩充前的基本操作的渐近时间相同,52,14.1 动态顺序统计 (续),插入 RB树上插入分两阶段 Phase1:从根自下,插入新结点,增加Size后,只要将:搜索插入位置路径上各结点的Size加1,新结点Size置为1即可,附加成本O(lgn) Phase2:从叶子向上调整:变色,旋转;仅旋转改变了RB树结构,故为维护Size,只需考虑对该操作修改。旋转操作是局部操作,仅有执行旋转的边上(轴)的两个结点的Size域可能违反其定义,故只需在旋转操作尾部加上相应修改Size操作即可,53,14.1 动态顺序统计 (续),例如LeftRotate(T,x) (右旋与此对称

19、)sizeysizex; /y取代x为子树的根sizexsizeleftx+sizerightx+1;/旋转后的结点数每个旋转操作时间O(1),而插入过程中,至多有两个旋转 OS树上作插入总时间代价仍为O(lgn),与RB树相同,54,14.1 动态顺序统计 (续),删除 RB树上删除亦为两阶段 Phase1:物理上删去y,从y上溯至根的路径上各结点size减1,额外时间O(lgn) Phase2:至多有三个旋转会改变结构,故旋转操作所花的修改size时间为O(1)。 结论:在OS树上删除操作的时间仍为O(lgn),55,14.2 怎样扩充一个数据结构,在算法设计中,经常需要扩充一个基本的数据

20、结构,使之: 支持某些附加功能(开发新操作) 加速某些已有功能(加速已有操作) 扩充步骤 选择一基本数据结构 确定附加info(不一定仅是数据,亦可能是指针) 维护附加info(有效) 开发新操作,56,14.2 怎样扩充一个数据结构(续),不一定非得按上述次序进行,如,若第三步不能有效维护附加info,step2,4就无讨论的必要。OS树按此次序设计:Step1:选择RB作为,它有效地支持全序下的动态集合的操作(求最大/小,前趋,后继等)Step2:在RB树中增加Size,使OSSelect和OSRank能快速实现,在RB树上时间会更多Step3:有效性Step4:新操作OSSelect和O

21、SRankNote:若在RB树中增加rank域,则OSSelect和OSRank能快速进行,但插删可能引起树中每结点上Rank的修改,其时间为O(n),得不偿失,57,14.2 怎样扩充一个数据结构(续),扩充RB树定理当扩充RB树时,能否有效维护附加Info呢?若满足下述定理,则附加info可有效维护之。 Th14.1:设f是在RB树T的n个结点上扩充的域,对任意xT,假设结点x的f域的内容fx能够仅通过结点x,leftx,rightx的info(包括fleftx 和 frightx)计算,则可以在插删时维护T中所有结点的f域而不改变这些操作的渐近时间O(lgn)Pf:基本思想:fx的变化只

22、会传播到x的祖先,即改变fx只可能影响fpx的变化,而修改fpx只可能引起fppx的修改,如此向上传播,直至frootT被修改后,没有其他节点需修改为止。附加成本O(lgn)。具体插删的证明(略),58,14.2 怎样扩充一个数据结构(续),Ex 14.1-4 Ex 14.1-7,59,14.3 区间树,将RB树扩充为支持区间 闭区间:实数有序对t1,t2使得t1 t2,一区间代表一集合:t : t1 t t2 开、半开区间:本节只讨论闭区间,其结果易扩展到开/半开区间上 区间可用来表示一个事件所占用的时间,故在一时间区间数据库中,可询问某一给定区间上所有发生的事件 区间t1,t2可表示为一对

23、象i,它有两属性: lowi=t1 /起点 highi=t2 /终点,60,14.3 区间树(续),两区间重叠是指 i i 即:( lowihighi ) and ( lowihighi ) 亦即:两区间低端都不大于另一区间高端 当一区间低端大于另一区间高点时,这两区间必不重叠 任两区间i,i满足区间三分律,即下述3种恰有其一成立 i和i重叠 highilowi highilowi,61,14.3 区间树 (续),区间树是对红黑树的扩充,每个结点增加“区间”等属性:intx,它支持: 插入:IntervalInsert(T,x) 将节点x插入树中 删除:IntervalDelete(T,x)将

24、节点x从树T中删去 查找:IntervalSearch(T,i)在T中找与区间i重叠的区间,找到则返回结点,否则返回nil 结点结构,62,14.3 区间树(续),按上节四个步骤设计区间树 Step1:基本结构以RB树做基础,对任意x T x包含区间intx x的key为区间低点:key=lowintx Step2:附加info每节点x包含值maxx,它是以x为根的子树中所有结点的区间高端的最大值,63,14.3 区间树(续),Step3:维护附加info(有效性) maxx=max( highintx, maxleftx, maxrightx )即附加信息maxx由区间intx的高端及左、右

25、子树中的max值确定由Th14.1知,插,删等改变树形态的操作,其执行时间仍为O(lgn) Step4:开发新操作 查找与给定区间i重叠的区间intx,64,65,14.3 区间树(续),查找一个与i重叠的区间 基本思想 IntervalSearch (T, i): Step1: 从根开始查找:x rootT Step2: 若x非空且i与intx不重叠,则 若x左子树非空且左子树中最大端点lowi,则令xleftx,即到左子树中继续找 否则,左子树中必定找不到,故令xrightx,即到右子树中继续找 Step3:返回x /(x=nil)or intx 与 i 重叠,66,14.3 区间树(续)

26、,算法的正确性从根往下走一条路径,而不是遍历整棵树,能保证若有与i重叠的区间,就一定可以找到一个吗?即当考察结点x不与i重叠,则搜索方向是安全的吗?Th14.2 Case1:若算法从x搜索到左子树(走左分支),则左子树包含一个与i重叠的区间,或者在x的右子树中没有与i重叠的区间(即要保证走左分支时,若找不到与i重叠区间,则右子树也无区间与i重叠) Case2:若从x搜索右子树(走右分支),则左子树不含有与i重叠的区间,67,14.3 区间树(续),Pf: 先证case2 算法走右分支的条件是:leftx=nil or maxleftxlowi1)x左子树为空,则不会有与i重叠的区间2)x左子树

27、非空,但maxleftxlowimaxleftx是x左子树中最大端点,对 i x左子树,有highi maxleftx lowi /i在i之间由区间三分律知,i与i不重叠,即左子树中任一区间与i不重叠,68,14.3 区间树(续),再证case1 算法走左分支时: 若x左子树包含于i重叠的区间,则搜索该子树是安全的,case1已证 若x左子树无区间与i重叠,则此时x右子树中亦没有区间与i重叠maxleftx lowi区间 i x左子树(Note左子树非空)使得highi = maxleftx lowi /i不可能在前即highi lowi不成立,69,14.3 区间树(续),i和i不重叠 且 highi lowi不成立 有highi lowi /不重叠的两区间必有一区间高端小于另一区间低端 又区间树的key是区间低点,由搜索树性质知区间i x的右子树,则highilowi lowi /i在i之前,注意i在x的左子树中,i在x的右子树中 由三分律知,i和i不重叠 Note: 该定理只能保证从某路径搜索无结果,则从另一路径搜索亦无结果;但不能保证从某路径搜索有结果,从另一路径亦有结果 Ex 14.1-4 14.1-7 14.3-3,

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

当前位置:首页 > 生活休闲 > 社会民生

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


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

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

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