算法讲义PPT-Chapter-2 数学基础与数据结构.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2 数学基础与数据结构 2 数学基础与数据结构 集合、关系和函数 求和计算 递归方程求解 (*) 基本数据结构 (*) 递归方程求解 常系数线性同质递归方程 (linear homogeneous with constant coefficients) 几类特殊的非同质递归方程求解 常系数线性同质递归方程 例: 举例 费氏数列是由0,1开始,之后的每一项等于前两项之和: 0,1,1,2,3,5,8,13,21,34,55,89,144...... 。 时间复杂度分析: 非同质递归方程的求解 几个例子 数据结构 算法的实现离不开数据结构。选择一个合适的数据结构对设计一个有效的算法有十分重要的影响。结构化程序设计创始人Niklaus Wirth(瑞士苏黎士高工)提出一个著名的论断: “程序=算法+数据结构”。1984年,Wirth因开发了Euler、Pascal等一系列崭新的计算语言而荣获图灵奖, 有“结构化程序设计之父”之美誉。 本章我们将回顾几种重要的数据结构,包括二叉树、堆、不相交集。 堆(Heap) 在许多算法中,需要大量用到如下两种操作:插入元素和寻找最大(小)值元素。为了提高这两种运算的效率,必须使用恰当的数据结构。 普通队列:易插入元素,但求最大(小)值元素需要搜索整个队列。 排序数组:易找到最大(小)值,但插入元素需要移动大量元素。 堆则是一种有效实现上述两种运算的简单数据结构。 堆的定义:堆是一个几乎完全的二叉树,每个节点都满足这样的特性:任一父节点的键值(key)不小于子节点的键值。(最大堆) 观察结论: 根节点键值最大,叶子节点键值较小。从根到叶子,键值以非升序排列。 节点的左右儿子节点键值并无顺序要求。 堆的数组表示呈“基本有序”状态。相应地,并非节点的高度越高,键值就越大。 堆的基本操作 make-heap(A): 从数组A创建堆 insert(H,x): 插入元素x到堆H中 delete(H,i): 删除堆H的第i项 delete-max(H): 从非空堆H中删除最大键值并返回数据项 辅助运算Sift-up 若某个节点H[i]键值大于其父节点的键值,就违背了堆的特性,需要进行调整。 调整方法:上移。 沿着H[i]到根节点的唯一一条路径,将H[i]移动到合适的位置上:比较H[i]及其父节点H[?i/2?]的键值,若key(H[i])key(H[?i/2?]),则二者进行交换,直到H[i]到达合适位置。 辅助运算Sift-down 假如某个内部节点H[i] ( i≤?n/2?),其键值小于儿子节点的键值,即key(H[i])key(H[2i])或key(H[i] key(H[2i+1]) (如果右儿子存在),违背了堆特性,需要进行调整。 调整方法:下渗。 沿着从H[i]到子节点(可能不唯一,则取其键值较大者)的路径,比较H[i]与子节点的键值,若key(H[i]) max(H[2i], H[2i+1])则交换之。这一过程直到叶子节点或满足堆特性为止。 操作insert(H,x): 插入元素x到堆H中 思路:先将x添加到H的末尾,然后利用Sift-up,调整x在H中的位置,直到满足堆特性。 操作 delete(H,i) 思路:先用H[n]取代H[i],然后对H[i]作Sift-up或Sift-down),直到满足堆特性。 操作delete-max(H) make-heap(A): 从数组A创建堆 方法1:从一个空堆开始,逐步插入A中的每个元素,直到A中所有元素都被转移到堆中。 时间复杂度为O(nlogn).为什么?(阅读教材) 方法2: 复杂度分析 树高k=?logn?,第i层正好2i个节点, 0?ik,(不含最深的叶子节点层), 每个节点的down过程最多执行k-i次,故down过程执行次数上限为 不相交集(Disjoint Sets) 假设有n个元素,被分成若干个集合。例如S={1,2,…11}分成4个子集1:{1,7,10,11},3:{2,3,5,6},8:{4,8},9:{9}并分别命名。 事实上,每个子集可以用树表示,除根节点外,每个节点都有指针指向父节点。上例可以用树表示为: 假如要执行如下计算任务: FIND(x): 寻找包含元素x的集合的名字 UNION(x,y): 将包含元素x和y的两个集合合并,重命名。 记root(x)为包含元素x的树的根,则FIND(x)返回root(x). 执行合并UNION(x, y)时,首先依据x找到root(x),记为u,依据y找到root(y),记为v;然后,将u指向v。 优点:简单明了 缺点:多次合并后,树高度可能很大,查找困难。 南京理工大学 称为k 阶常系数线性同质递归方程。 其特征方程(characteristi

文档评论(0)

I LOVE YOU + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档