- 1、本文档共69页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构、算法及应用C语言描述SYL09
Chapter9 Priority Queues 堆(Heaps) 左高树(Leftist Trees) Focus 优先队列 与FIFO结构的队列不同,优先队列中元素出队列的顺序由元素的优先级决定。从优先队列中删除元素是根据优先权高或低的次序,而不是元素进入队列的次序。 例-CPU调度 优先队列 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值。 对优先队列执行的操作有: 查找 插入一个新元素 删除 优先队列的线性表描述 描述最大优先队列最简单的方法是采用无序线性表。 假设有一个具有n个元素的优先队列,插入操作可以十分容易地在表的右端末尾执行,插入所需时间为Θ(1)。删除操作时必须查找优先权最大的元素,即在未排序的n个元素中查找具有最大优先权的元素,所以删除操作所需时间为Θ(n)。 优先队列的线性表描述 如果利用链表,插入操作在链头执行,时间为Θ(1),而每个删除操作所需时间为Θ(n)。 优先队列的线性表描述 另一种描述方法是采用有序线性表,当使用公式化描述时元素按递增次序排列,使用链表时则按递减次序排列,这两种描述方法的删除时间均为Θ(1),插入操作所需时间为Θ(n)。 最大树 定义:每个节点的值都大于或等于其子节点(如果有的话)值的树。 最大树 最小树 定义:每个节点的值都小于或等于其子节点(如果有的话)值的树。 最小树 最大堆(最小堆) 定义:最大(最小)的完全二叉树。 最大堆的插入 插入时间复杂性 最大堆的删除 最大堆的删除 删除时间复杂性 最大堆的初始化 开始时堆中已经含有n(n0) 个元素。可以通过在初始为空的堆中执行n次插入操作来构建非空的堆,插入操作所需总时间为O(nlogn) 。 思考 更快的堆的初始化策略? 思想 从第一个具有孩子的节点开始,这个元素在数组中的位置为i=[n/2],如果以这个元素为根的子树已是最大堆,则此时不需调整,否则必须调整子树使之成为堆。 随后,继续检查以i-1,i-2等节点为根的子树,直到检查到整个二叉树的根节点(其位置为1)。 最大堆的初始化 最大堆的初始化 类MaxHeap 最大堆的插入 最大堆的删除 最大堆的删除 扩充二叉树 一棵二叉树,它有一类特殊的节点叫做外部节点(external node),用来代替树中的空子树,其余节点叫做内部节点(internal node)。 增加了外部节点的二叉树被称为扩充二叉树(extended binary tree)。 Leftist Trees(左高树) 堆结构是一种隐式数据结构,用完全二叉树表示的堆在数组中是隐式存贮的。由于没有存贮结构信息,这种描述方法空间利用率很高。 尽管堆结构的时间和空间效率都很高,但它不适合于所有优先队列的应用,尤其是当需要合并两个优先队列或多个长度不同的队列时。因此需要借助于其他数据结构来实现这类应用,左高树就能满足这种要求。 扩充二叉树 s 令s(x)为从节点x到它的子树的外部节点的所有路径中最短的一条,根据s(x)的定义可知,若x是外部节点,则s的值为0,若x为内部节点,则它的s值是: min{s(L),s(R)} + 1 其中L与R分别为x 的左右孩子。 扩充二叉树的s和w 高度优先左高树 定义:当且仅当一棵二叉树的任何一个内部节点,其左孩子的 s 值大于等于右孩子的 s 值时,该二叉树为高度优先左高树(height-biased leftist tree, HBLT)。 高度优先左高树-性质 定理9-1 令x为一个HBLT的内部节点,则 以x为根的子树的节点数目至少为2s(x)-1。 若子树x有m个节点,s(x)最多为log2(m+1)。 通过最右路径(即,此路径是从x 开始沿右孩子移动)从x到达外部节点的路径长度为s(x)。 最大HBLT/最小HBLT [最大HBLT] 即同时又是最大树的HBLT; [最小HBLT] 即同时又是最小树的HBLT。 最大HBLT的操作 插入 删除 合并 初始化 最大HBLT的插入 最大HBLT的插入操作可借助于最大HBLT的合并操作来完成。 假设将元素x插入到名为H的最大HBLT中,如果建造一棵仅有一个元素x的最大HBLT然后将它与H进行合并,结果得到的最大HBLT将包括H中的全部元素及元素x。因此插入操作只需先建立一棵仅包含欲插入元素的HBLT,然后将它与原来的HBLT合并即可。 最大HBLT的删除 根是最大元素,如果根被删除,将留下分别以其左右孩子为根的两棵HBLT的子树。将这两棵最大HBLT合并到一起,便得到包含除删除元素外所有元素的最大HBLT。 所以删除操作可以通过删除根元素并对两个子树进行合并来实现。 合并两棵最大HBLT 具有n个元素的最大HBLT,其最右路径的长度为O(logn)。合并操作仅需遍历欲合并的HBLT的最右路径。由于在
文档评论(0)