01算法设计第四讲_第1页
01算法设计第四讲_第2页
01算法设计第四讲_第3页
01算法设计第四讲_第4页
01算法设计第四讲_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Algorithms Design Techniques and Analysis第四章 堆和不相交集数据结构Algorithms Design Techniques and Analysis本章内容堆 堆上的运算(sift-up, sift-down, insert, delete)创建堆堆排序最小堆和最大堆不相交集数据结构RepresentationUnion-find 算法union-find 算法的分析Algorithms Design Techniques and Analysis4.2 堆 为什么需要堆? 在很多算法中,需要支持下面两种运算的数据结构:插入元素和寻找最大元素 。使用

2、普通队列,寻找最大元素需要搜索整个队列,开销比较大。采用排序数组,插入运算需要移动很多元素,开销也会比较大。优先队列使用堆作为数据结构,更加有效的支持插入和寻找最大值元素这两种运算,QAAlgorithms Design Techniques and Analysis4.2 堆 - contd 什么是堆?定义 4.1 一个(二叉)堆是一个几乎完全的二叉树,它的每个节点都满足堆的特性:如果v和p(v)分别是节点和它的父节点,那么存储在p(v)中的数据项键值不小于存储在v中数据项的键值。QAlgorithms Design Techniques and Analysis 下面哪些是堆?空树 ( )

3、单节点树 ( ) ( ) ( )2094510937XAlgorithms Design Techniques and Analysis堆的表示方式一个有n个节点的堆T,可以由一个数组H1.n 用下面的方式表示:T的根节点存储在H1中假设T的节点x存储在Hj中,如果它有左子节点,这个子节点存储在H2j中;如果它也有右子节点,这个子节点存储在 H2j+1中元素Hj的父节点如果不是根节点,则存储在Hj/2中Algorithms Design Techniques and Analysis75935411101720123456791081234567891020179101145375EndAlg

4、orithms Design Techniques and Analysis 堆的特性堆的特性蕴含着:沿着每条从根到叶子的路径,元素的键值以非升序排列。因此堆可以看做是二叉树,而它实质上是一个数组H1.n 。它有如下性质:对于任何索引j, 2jn, key(Hj/2)key(Hj)。如果树的节点以自顶向下、从左到右的方法,按1到n的顺序编号,那么,每一项Hi在对应的树中表示成编号为i的节点Algorithms Design Techniques and Analysis堆数据结构支持的运算delete-maxH:从一个非空的堆H中删除最大键值的数据项并将数据项返回。insertH,x:插入项x

5、到堆H中。deleteH,i:从堆H中删除第i项。makeheapA:将数组A转换成堆。Algorithms Design Techniques and Analysis4.2.1 堆上的运算Sift-upSift-downInsertDeleteDelete-maxAlgorithms Design Techniques and AnalysisSift-up 什么时候使用? 假定对于某个i1, Hi变成了键值大于它父节点键值的元素,这样就违反了堆的特性,因此这种数据结构就不再是堆了。如要修复堆的特性,需要用称为Sift-up的运算把新的数据项上移到在二叉树中适合它的位置上,这样堆的属性就修

6、复了。 sift-up 运算沿着从Hi到根节点的惟一一条路径,把Hi移到适合它的位置上。 在沿着路径的每一步上,都将Hi键值和它父节点的键值Hi/2相比较。QAAlgorithms Design Techniques and Analysis 过程 SIFT-UP输入:数组H1n和位于1和n之间的索引i输出 :上移Hi (如果需要),以使它不大于父节点。 1. donefalse 2. if i=1 then exit 节点i为根 3. repeat 4. if key (Hi)key(H i/2) then 互换 Hi and H i/2 5. else donetrue 6. i i/2

7、7. until i=1 or doneAlgorithms Design Techniques and Analysis 例子310945725112517252025111720EndAlgorithms Design Techniques and AnalysisSift-down 什么时候使用? 假定对于in then exit 节点 i 是叶子 3. repeat 4. i2i 5. if i+1 n and key(Hi+1)key(Hi) then ii+1 6. if key(H i/2)n or doneAlgorithms Design Techniques and Ana

8、lysis An example201094537511331135EndAlgorithms Design Techniques and Analysis插入基本思想: 为了把元素x插入到堆H中,先将堆大小加1,然后将x添加到H的末尾,再根据需要,把x上移,直到满足堆的特性。算法 4.1 INSERT输入: 堆H1n 和元素x。输出: 新的堆 H1n+1 ,x为其元素之一。 1. nn+1 增加H的大小 2. Hnx 3. SIFT-UP(H,n)时间复杂度:O(logn)Algorithms Design Techniques and Analysis删除基本思想: 要从大小为n的堆H中删

9、除元素Hi,可先用Hn替换Hi,然后将堆栈大小减1,如果需要的话,根据Hi的键值与存储在它父节点和子节点中元素键值的关系,对Hi做Sift-up或Sift-down运算,直到满足堆特性为止。Algorithms Design Techniques and Analysis 算法 4.2 DELETE输入:非空堆H1n和位于1和n之间的索引i。输出:删除Hi之后的新堆H1n-1 。 1. xHi; yHn 2. nn-1 decrease the size of H 3. if i=n+1 then exit done 4. Hiy 5. if key(y) key(x) then SIFT-U

10、P(H,i) 6. else SIFT-DOWN(H,i) 7. end if时间复杂度:O(logn).Algorithms Design Techniques and Analysis删除最大值基本思想: This这项运算在一个非空堆H中删除并返回最大键值的数据项。直接完成这项运算要用到删除运算:只要返回根节点中的元素并将其从堆中删除。算法 4.3 DELETEMAX输入: 堆H1n.输出:返回最大键值元素x并将其从堆中删除。1. xH12. DELETE(H,1)3. return x时间复杂度:O(logn)Algorithms Design Techniques and Analys

11、is4.2.2 创建堆方法1: 给出一个有n个元素的数组A1.n ,很容易创建一个包含这些元素的堆,可以这样进行:从空的堆开始,不断插人每一个元素,直到A完全被转移到堆中为止。 将数组A1.10=4,3,8,10,11,13,7,30,17,26 转换成一个堆.时间复杂度:因为插人第j个键值用时O(logj),因此用这种方法创建堆栈的时间复杂性是O(nlogn)。Algorithms Design Techniques and Analysis4.2.2创建堆- contd方法 2: 把一棵n个节点的几乎完全的二叉树转换成堆H1.n。从最后一个节点开始(编码为n的那一个)到根节点(编码为1的节

12、点),逐个扫描所有的节点,根据需要,每一次将以当前节点为根节点的子树转换成堆。这些元素An/2+1,A n它们对应于T的叶子,这样可以从A n/2开始调整数组,并且继续An/2-1,A1进行调整。Algorithms Design Techniques and Analysis108 1113730172612345678910将数组A1.10=4,3,8,10,11,13,7,30,17,26 转换成一个堆. 例子43EndAlgorithms Design Techniques and Analysis算法 4.4 MAKEHEAP 输入: n个元素的数组A1n 。输出: A1n 转换成堆

13、 1. for i n/2 downto 1 2. SIFT-DOWN(A, i) 3. end forAlgorithms Design Techniques and AnalysisMAKEHEAP算法分析设T是对应于数组A1.n的一棵几乎完全的二叉树,那么由观察结论3.4可知,T的高是k = logn 。令Aj对应该树的第i层中第j个节点,当语句SIFT-DOWN( A ,j),调用过程SiFI-DOWN时,重复执行的次数最多是k-i因为在第i层上正好有2i个节点, 0ik ,循环执行的总次数的上界是:Algorithms Design Techniques and AnalysisMA

14、KEHEAP算法分析由于在过程SIFT-DOWN的每一个循环中,最多有两次元素的比较。因此元素比较的总次数的上界是4n.而且因为在每次调用过程SIFT-DOWN时,都要至少执行一次循环,元素比较的最小次数是2n/2n-1. 定理 4.1算法MAKEHEAP用来构造一个n元素的堆,令C(n)为执行该算法的元素比较次数,那么n-1 C(n) 4n。时间复杂度: (n), 空间复杂度: (1)Algorithms Design Techniques and Analysis4.2.3 堆排序 基本思想给出数组A1n, 首先将A变换成堆,并使其具有这样的性质,每个元素的键值是该元素本身,即key(Ai

15、)=Ai。由于A中各项的最大值存储在A1中,可以将A1和An交换,使得An是数组中最大元素。这时,A1中的元素可能小于存放在它的一个子节点中的元素,于是用过程SIFT-DOWN将A1n-1转换成堆。接下来将A1和An-1交换,并调整数组A1n-2成为堆。交换元素和调整堆的过程一直重复,直到堆的大小变成i为止,这时,A1是最小的。Algorithms Design Techniques and Analysis 算法 4.5 HEAPSORT输入: n个元素的数组A1n 。输出:以非降序排列的数组。 1. MAKEHEAP(A) 2. for jn downto 2 3. 互换 A1 and A

16、j 4. SIFT-DOWN(A1j-1,1) 5. end forAlgorithms Design Techniques and Analysis将数组A1.10=4,3,8,10,11,13,7,30, 17,26 进行非降排序 例子108 1113730172612345678910431234567891026438101113730171713 11871034123456789103026123456789104302613171187103Algorithms Design Techniques and AnalysisSort the array A1.10=4,3,8,10

17、,11,13,7,30, 17,26 in non-descending order. An example1713 11871033012345678910426123456789103042613171187103Algorithms Design Techniques and AnalysisSort the array A1.10=4,3,8,10,11,13,7,30, 17,26 in non-descending order. An example1713 118710330123456789104261234567891030426131711871031013 1187433

18、0123456789102617123456789103026171310118743Algorithms Design Techniques and Analysis算法分析空间:这个算法的一个重大好处在于它是在原有的空间里排序,它不需要辅助存储空间。时间: 建立堆用(n)时间Sift-down运算用O(logj)时间,并且要重复n一1次, Theorem 4.2 算法HEAPSORT对n个元素排序要用(nlogn)时间和(1)空间。Algorithms Design Techniques and Analysis4.2.4 最小堆和最大堆最大堆: 存储在根节点以外的节点的键值,小于或等于存

19、储在它父节点中的键值。 最小堆:存储在根节点以外的节点的键值,大于或等于存储在它父节点中的键值。 Algorithms Design Techniques and AnalysisA1.10=4,3,8,10,11,13,7,30,17,26 转换成堆. 例子1713 11871034123456789103026Max heap107 111383017261234567891034Min heapAlgorithms Design Techniques and Analysis4.3 不相交集数据结构什么是不相交集?假 设给出一个有n个不同元素的集合S,这些元素被分成不相交集合。在每个子集

20、中,用一个特殊的元素作为集合的名字或代表。 例如,如果集合S=1,2,11有4个子集,分别是1,7,10,11, 2,3,5,6, 4,8 和9, ,这些子集可以依次被标记为1,3,8,9。. QAAlgorithms Design Techniques and Analysis不相交集的操作FIND(x): 寻找并返回包含元素x的集合的名字。UNION(x,y):包含元素x和y的两个集合用它们的并集替换。并集的名字或者是原来包含元素x的那个集合的名字,或者是原来包含元素y的那个集合的名字,这将会在以后确定。 例如,如果集合S=1,2,11有4个子集 1,7,10,11, 2,3,5,6, 4

21、,8 和 9,这些子集可以依次被标记为1,3,8,9。FIND(11) 运算返回结果 1;UNION(1,3) 运算返回新子集被标记为1 或 3Algorithms Design Techniques and Analysis 我们的目的是什么?我们的目的是设计有效算法进行FIND和UNION操作。为此需要一种数据结构,它既要简单,同时又要考虑到能有效地实现合并和寻找这两种运算。How to represent a set?Algorithms Design Techniques and Analysis比特向量表示法 S=1,2,11 and 4 subsets S1=1,7,10,11,

22、S2=2,3,5,6, S3=4,8 and S4=9, S1=10000010011; S2= ; S3= ; S4= 问题: 耗费太多额外资源union操作时间与n相关,而不是两个子集的长度Algorithms Design Techniques and AnalysisList 列表表示法The subset is represented as a list of its elements. For example, S=1,2,11 and 4 subsets S1=1,7,10,11, S2=2,3,5,6, S3=4,8 and S4=9Problems: For non-sort

23、ed lists, the time of union operation is proportional to the multiply of the sizes of two subsets; For sorted lists, the time of union operation is proportional to the sum of sizes of two subsets.Algorithms Design Techniques and AnalysisTree 树表示法To represent each set as a rooted tree with data eleme

24、nts stored in its nodes. Each element x other than the root has a pointer to its parent p(x) in the tree. The root has a null pointer, and it serves as the name or set representative of the set.Notation:Root(x) denote the root of the tree containing x. Thus:FIND(x) always returns root(x);UNION(x,y)

25、actually means UNION(root(x), root(y).1234567891011Algorithms Design Techniques and Analysis树的表示法一个子集用一棵树表示,则所有的不相交子集组成森林。如果假定元素是整数1,2,n,则森林可以方便地用数组A1.n来表示,Aj 是元素j的父节点。空的父节点可以用数字0 来表示。1234567891011Algorithms Design Techniques and Analysis 表示法的例子1234567891011030822100111234567891011EndAlgorithms Desi

26、gn Techniques and Analysis直接实现的方法FIND(x): 在进行FIND( x )运算时,只是沿着从x开始直到根节点的路径,然后返回root(x)。UNION(x,y):在进行UNION 运算时,令root(x)的链接指向roo(y),也就是说,如果rooa(x)是u,root(y)是v。,就令v是u的父节点。Algorithms Design Techniques and AnalysisFIND(X)流程Input: A node x.Output: root(x), the root of the tree containing x.1. yx2. while

27、p(y) null Find the root of the tree containing x3. yp(y)4. end while5. return y;UNION(x,y)流程Input: Two elements x and y.Output: The union of the two trees containing x and y. The original trees are destroyed 1. uFIND(x); vFIND(y) 2. p(u) v;Algorithms Design Techniques and AnalysisAre they useful?考虑以

28、下不相交集合1,2,n 以及操作UNION(1,2), FIND(1), UNION(2,3), FIND(1), UNION(3,4), FIND(1), UNION(4,5),FIND(1), UNION(n-1,n), FIND(1).得到结果如右所示:nn-11The last find operation requires n times.我们是否能重建没一棵树的高度?Algorithms Design Techniques and Analysis4.3.1 按秩合并措施为限制每棵树的高度,采用按秩合并措施;是使包含较少结点的树的根指向包含较多结点的树的根,而这个树的大小可以抽象为

29、树的高度,即高度小的树合并到高度大的树,这样资源利用更加合理。 基本思想给每个节点存储一个非负数作为该节点的秩,记为rank,节点的秩基本上就是它的高度。设x和y是当前森林中两棵不同的树的根初始状态时,每个节点的秩是0在执行运算UNION(x, y),时,比较rank(x) 和 rank(y)。如果rank(x)rank(y),就使得x 为y 的父节点否则,i如果rank(x)=rank(y),就使得y 为x 的父节点,并将 rank(y) 加1。Algorithms Design Techniques and Analysis4.3.1 按秩合并措施为了实现一个按秩合并的不想交集合森林,要记

30、录下秩的变化。对于每个结点x,有一个整数rankx,它是x的高度(从x到其某一个后代叶结点的最长路径上边的数目)的一个上界。(即树高)。当由MAKE-SET创建了一个单元集时,对应的树中结点的初始秩为0,每个FIND-SET操作不改变任何秩。当对两棵树应用UNION时,有两种情况,具体取决于根是否有相等的秩。当两个秩不相等时,我们使具有高秩的根成为具有较低秩的根的父结点,但秩本身保持不变。当两个秩相同时,任选一个根作为父结点,并增加其秩的值。Algorithms Design Techniques and Analysis 例子n12start213nUNION(1,2)2134nUNION(

31、2,3)2145nUNION(FIND(3),4)32134nUNION(FIND(n-1),n)The result is much better than Straightforward method.Algorithms Design Techniques and Analysis观察结论令x是任意节点,p(x)是x的父节点,有下面两个基本的观察结论 观察结论 4.1rank(p(x) rank(x)+1. 观察结论 4.2rank(x)的值初始化为0,在后继合并运算序列中递增,直到x不再是根节点。一旦x变成了其他节点的一个子节点,它的秩就不再改变了。 Algorithms Design

32、 Techniques and Analysis 引理引理 4.1 包括根节点x在内的树中节点的个数至少是2rank(x).证明: 对合并运算的次数应用归纳法。最初,x自身形成一棵树,它的秩为0;设x和y为两个根,考虑运算UNION(x,y)。假定引理在这项运算之前成立;如果rank(x)rank(y), 以y(或x)为根形成的树比老的以y(或x)为根的树的节点多,并且它的秩未改变。如果rank(x)rank(y),引理4.1在运算之后成立。如果rank(x)=rank(y),根据归纳法,在这种情况下,以y为根形成的树至少有2rank(x) +2rank(y)= 2rank(y)+1个节点。由

33、于rank (y)每次加1,所以运算之后引理4.1成立。Algorithms Design Techniques and Analysis算法分析每次FIND运算的代价是O(logn).由引理4.1可知,在以x为根的树中的节点数是k,那么树的高度至多是logk。但在最坏情况下,树退化成为一条链,使得每一次查询的算法复杂度为O(N)。运算UNION(x,y)所需要的时间:如果两个参数都是根的话,是O(1)。如果x和y不都是根,那么运行时间减少到寻找运算的运行时间。因此,合并运算的时间复杂性和寻找运算的时间复杂性相同,都是O (log n)Algorithms Design Techniques

34、and Analysis算法分析 结论: 可以得出,采用按秩合并措施,m次合并和寻找指令的交替执行序列的时间复杂性是O(m log n)。我们能否进一步加强FIND操作的效率?边查询边“路径压缩” 其实,我们还能将集合查找的算法复杂度进一步降低:采用“路径压缩”算法。它的想法很简单:在集合的查找过程中顺便将树的深度降低。采用路径压缩后,每一次查询所用的时间复杂度为增长极为缓慢的阿克曼函数(ackerman函数)的反函数(x)。对于可以想象到的n,(n)都是在5之内的。返回Algorithms Design Techniques and Analysis4.3.2 路径压缩在FIND(x) 运算

35、中,找到根节点y之后,我们再一次遍历从x到y的路径,并沿着路径改变所有节点指向父节点的指针,使它们直接指向y。Algorithms Design Techniques and Analysis 例子12341432执行带有路径压缩的寻找运算F7ND(4)的效果元素的合并图示13245合并1和2合并1和3合并5和4合并5和3路径压缩示意图13245由此我们得到了一个复杂度只是O(1)的算法Algorithms Design Techniques and Analysis4.3.3 union-find 算法(路径压缩)算法 4.6 FIND输入: 节点x.输出: root(x),包含x的树的根。

36、 1. yx 2. while p(y) null 寻找包含x的树的根 3. yp(y) 4. end while 5. rooty; yx 6. while p(y) null 执行路径压缩 7. wp(y); p(y)root; yw 8. end while 9. return rootAlgorithms Design Techniques and Analysis算法 4.7 UNIONInput:两个元素x和yOutput:包含x和y的两个树的合并,原来的树被破坏。1. uFIND(x); vFIND(y)2. if rank(u) rank(v) then3. p(u)v4. if rank(u) =rank(v) then rank(v)rank(v)+1 5. else p(v)u6. end if4.3.3 union-find算法(按秩合并)Algorithms Design Techniques and Analysis 例子设S=1,2,9,考虑用下面的合并和寻找序列:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论