网站大量收购闲置独家精品文档,联系QQ:2885784924

第四章不相交集数据结构Union-Find.ppt

  1. 1、本文档共69页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章不相交集数据结构Union-Find

heyichao@sjzue.edu.cn 4.2 堆 排序数组: 那么插入运算就需要移动很多元素,开销也较大. 优先队列的有效实现是使用一种称为堆的简单数据结构。 对数据结构支持下面的运算: Delete-max[H]:删除最大键值的数据项 Insert[H,x]:插入项x到堆H中 Delete[H,i]:从堆H中删除第i项 Makeheap[A]:将数组A转换成堆 堆的特性蕴含着:沿着每条从根到叶子的路径,元素的键值以非升序排列。 ( 大顶堆) 元素H[j]的父节点如果不是根节点,则存储在H[ ?j/2 ? ]中。 算法复杂度分析 算法4.1 INSERT 输入:堆H[1…n]和元素x 输出:新的堆H[1…n+1], x为其元素之一 1. n= n+1{增加H的大小} 2. H[n] x 3. SIFT-UP(H, n) 看另外一个堆建立方法: 在Θ(n)的时间内,用n个元素来建立一个堆,下面给出这种方法的实现细节。 算法复杂度分析: (1)设T是一个完全二叉树,高度是k=?logn? 。 (2)设A[j]对应第i层的第j个结点,则调用sift-down函数需要调用的次数应该最多是k-i(注:k是树的高度)(自底而上扫描连接的数据)。 (3)根据二叉树的理论知:二叉树的第i层最多有2i个结点,则循环的上界应该为: 另外一种分析方法: 1、简单的分析: 每次调用SIFT-DOWN()函数的时间为O(logn),一共应该有n/2次调用,所以总的时间复杂度上线是O(nlogn)。 但是这个上限太高了。(这就意味着几乎每一个结点都在执行sift_down()函数行为) 分析一个确界: 1、 事实上,需要执行SIFT-DOWN()函数的结点很少,而且对于不同的节点执行SIFT-DOWN()函数的次数也是不同的,这跟每一个结点所处的高度和所连接的数据相关。 step 2.由于A中各项的最大值存储在A[1]中,可以将A[1] 和A[n]交换,使得A[n]是数组中最大元素。 (排序:将数据依大小,顺序放在数组中,最后一个是最大的,故交换A[1]和A[n]) 这时, A[1] 中的元素可能小于存放在它的一个子节点中的元素,于是用过程SIFT-DOWN将A[1…n-1]转换成堆。 (调整堆) 接下来将 A[1] 和A[n-1]交换,并调整数组A[1…n-2]成为堆。交换元素和调整堆的过程一直重复,直到堆的大小变成1为止,这时A[1] 是最小的。 优先级队列的应用 1、堆作为一个优先级队列,用于排序吗?可以! 但是,应用最多的还是:快速排序。 2、基于最大堆的最大优先级队列。 优先级队列:一种用于维护由一组元素构成的集合S的数据结构。 支持如下操作: INSERT(S,x): MAXIMUM(S): EXTRACT_MAX(S):去掉并返回S中的具有最大关键字的元素。 INCREASE_KEY(S,x,k): 将元素x的关键字的值增加到k,这里的k值不能小于x的原关键字的值 3、应用举例:分时OS的作业调度。 应用最大堆的优先级队列,记录需要被调度的各种作业以及他们之间的优先级的关系。 作业完成或被中断时,应用EXTRACT_MAX(S)从所有的等待队列里面选择一个优先级最大的作业进入调度,任何时候一个新作业都可以使用INSERT()操作加入到队列中。 4、小顶堆基于事件驱动的模拟器 (1)队列中的各项是需要模拟的事件; (2)每一个事件都需要一个发生事件作为关键字; (3)事件模拟需要按照事件发生的时间顺序进行; (4)一个事件的模拟可能会导致对于稍后对另外一个事件模拟的发生; (5)新来的模拟事件应用INSERT插入队列 为限制每棵树的高度,采用按秩合并的措施:给每个节点存储一个非负数作为该节点的秩,记为rank,节点的秩基本上就是它的高度。 设x和y是当前森林中两棵不同的树的根,初始状态时,每个节点的秩是0,在执行运算UNION(x,y)时,比较rank(x)和rank(y) 引理4.1 包括根节点x在内的树中节点的个数至少是2rank(x)。 证明:采用假设法进行推理。 设存在两个树x和y,x、y的秩均为0,上述定理成立。考虑非0时,未合并操作前,假设上述定理仍然成立,归纳合并情况如下: (1)rank(x)rank(y),则合并成为以y为根的一棵树,且树y的节点数增加,但rank(y)不变

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档