《算法设计与分析》课件 第1章 数据结构.pptx

《算法设计与分析》课件 第1章 数据结构.pptx

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

算法设计与分析堆和不相交集

数据结构算法的实现离不开数据结构。选择一个合适的数据结构对设计一个有效的算法有十分重要的影响。结构化程序设计创始人NiklausWirth(瑞士苏黎士高工)提出一个著名的论断:“程序=算法+数据结构”。1984年,Wirth因开发了Euler、Pascal等一系列崭新的计算语言而荣获图灵奖,有“结构化程序设计之父”之美誉我们已经学过数组、队列、栈、二叉树等数据结构,这里学习堆和不相交集

堆(Heap)在许多算法中,需要大量用到如下两种操作:插入元素和寻找最大(小)值元素。为了提高这两种运算的效率,必须使用恰当的数据结构。普通队列:易插入元素,但求最大(小)值元素需要搜索整个队列。排序数组:易找到最大(小)值,但插入元素需要移动大量元素。堆则是一种有效实现上述两种运算的简单数据结构。

堆(Heap)

堆(Heap):特征堆是一棵完全二叉树,堆所对应树的节点的排列必须是从上到下,从左到右的依次排列,否则将不构成堆在最大堆中,根节点值最大,叶子节点值较小,从根到叶子的一条路径上,节点值以非升序排列任何一个父节点的值都大于等于其子节点的值,但节点的左右子节点值并无顺序要求,且上层节点的值不一定大于下层节点的值堆中每个结点的子树都是堆

堆(Heap)有n个节点的堆T,可以用一个数组a[1…n]来存储,按照节点从上到下,从左到右的顺序依次存储用下面的方式来表示:T的根节点存储在a[1]中假设T的节点x存储在a[j]中,那么,它的左右子节点分别存放在a[2j]及a[2j+1]中(如果有的话)。a[j]的父节点如果不是根节点,则存储在a[?j/2?]中

堆(Heap)

堆(Heap):上移若某个节点a[i]键值大于其父节点的键值,就违背了堆的特性,需要进行调整。调整方法:上移。沿着a[i]到根节点的唯一一条路径,将a[i]移动到合适的位置上:比较a[i]及其父节点a[?i/2?]的键值,若key(a[i])key(a[?i/2?]),则二者进行交换,直到a[i]到达合适位置。

堆(Heap):上移所需要的时间是O(logn).

堆(Heap):下移假如某个内部节点a[i](i≤?n/2?),其键值小于儿子节点的键值,即key(a[i])key(a[2i])或key(a[i]key(a[2i+1])(如果右儿子存在),违背了堆特性,需要进行调整。调整方法:下移。沿着从a[i]到子节点(可能不唯一,则取其键值较大者)的路径,比较a[i]与子节点的键值,若key(a[i])max(a[2i],a[2i+1])则交换之。这一过程直到叶子节点或满足堆特性为止。

堆(Heap):下移所需要的时间是O(logn).

堆(Heap):插入思路:先将x添加到a[]的末尾,然后利用Sift-up,调整x在a[]中的位置,直到满足堆特性。树的高度为?logn?,所以将一个元素插入大小为n的堆所需要的时间是O(logn).

堆(Heap):删除思路:先用a[n]取代a[i],然后对a[i]作Sift-up或Sift-down),直到满足堆特性。所需要的时间是O(logn).

堆(Heap):删除堆顶元素输入:堆H[1…n]输出:返回最大键值元素,并将其从堆中删除x←H[1]2.delete(H,1)3.returnx

堆(Heap):构建方法1:从一个空堆开始,逐步插入A中的每个元素,直到A中所有元素都被转移到堆中。时间复杂度为O(nlogn)因为插入一个元素需要logn,总共需要插入n个元素

堆(Heap):构建其他方法:直接对数据进行调整自上而下的调整一次调整需要O(nlogn),总共需要logn次调整,总复杂度为O(nlog2n)

堆(Heap):构建自下而上的调整调整一次即可(对以节点i为根的子树进行调整)但复杂度依然是O(nlogn)优化:1.叶子节点不需要调整;2.对子树进行调整第i层的节点的调整最多交换?logn??i次

堆(Heap):构建例:给定数组A[1…10]={5,15,19,12,6,10,7,36,11,8,9,16},构建堆

堆(Heap):构建

堆(Heap):构建复杂度

堆(Heap):构建复杂度

堆(Heap):d堆d堆:如三叉堆,四叉堆;树的层数为logdn

不相交集在离散数学我们学过等价类是对集合S的一个划分,对集合S的划分形成了集合S的不相交集

不相交集不相交集可以用树表示4个子集1:{1,7,10,11},3:{2,3,5,6},8:{4,8},9:{9}并分别命名。1111072653984

不相交集:查找、合并FIND(x):寻找包含元素x的集合的名字记root(

您可能关注的文档

文档评论(0)

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

精品资料

版权声明书
用户编号:7040145050000060

1亿VIP精品文档

相关文档