- 1、本文档共54页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NOIP堆与可并堆幻灯片
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 可并优先队列 常用的可并优先队列有四种 左偏树与斜堆 实现简单, 实用性高 二项堆 实现有一定难度, 是Fibnacci堆的基础 Fibonacci堆 理论时间复杂度非常优秀. 但是实现难度相当大 左偏树 左偏树的定义: 是一棵二叉树(左子树与右子树都是左偏树) 满足堆性质 : 根的键值小于等于儿子键值 满足左偏性质(Leftist Property) Null Path Length 一个节点的NPL(Null path length)定义为 到达子孙中最近的外节点的距离 外节点 两个儿子不同时存在的节点 0 1 0 1 0 0 左偏性质 记左偏树的根为root root.left.NPL ≥ root.right.NPL (左偏性质) 注意这个性质是递归的,因为根的左子树和右子树也是左偏树 由左偏性质可知: 一个点的NPL即为其最右路径的长度 左偏树的性质 定理: 若一棵左偏树有N个节点, 则该左偏树的NPL不超过 ?log(N+1)? -1. A B D 0 0 0 1 2 E H F 0 G 0 1 C 最右路径长度即为该点NPL 最右路径: A-C-G 最右路径长度 = 2 8个节点的左偏树?log(8+1)? -1 = 2 基本操作: 合并 若A或B为空, 要返回另外一棵树, 否则 第一步: 假设A的根≤B的根(否则交换A和B),把A的根作为新树的根,合并A.right和B 第二步: 如果合并后A.rightA.left(NPL), 交换 第三步: 更新A.NPL=A.right.NPL + 1 A B 合并伪代码 Function Merge(A, B) If A = NULL Then return B If B = NULL Then return A If B.key A.key Then swap(A, B) A.right ← Merge(A.right, B) If A.right.NPL A.left.NPL Then swap(A.left, A.right) If A.right = NULL Then A.NPL ← 0 Else A.NPL ← A.right.NPL + 1 return A End Function 合并示例 下面是一个合并的例子: 6 12 18 24 37 18 7 0 0 1 2 0 0 1 3 10 8 26 17 0 1 0 0 0 Merge (3, 6) 合并示例 下面是一个合并的例子: 6 12 18 24 37 18 7 8 26 17 Merge (8, 6) Merge (3, 6) 合并示例 下面是一个合并的例子: 37 18 7 8 26 17 Merge (8, 7) Merge (8, 6) Merge (3, 6) 合并示例 下面是一个合并的例子: 18 Merge (8,18) Merge (8, 7) Merge (8, 6) Merge (3, 6) NULL 8 26 17 合并示例 下面是一个合并的例子: Merge (8, 7) Merge (8, 6) Merge (3, 6) 18 8 26 17 37 7 0 1 ? 合并示例 下面是一个合并的例子: Merge (8, 6) Merge (3, 6) 1 1 2 26 17 37 18 8 6 12 18 24 7 合并示例 下面是一个合并的例子: Merge (3, 6) 0 2 ? 26 17 7 37 18 8 6 12 18 24 3 10 合并示例 下面是一个合并的例子: Merge (3, 6) 26 17 7 37 18 8 6 12 18 24 3 10 2 0 1 合并操作的分析 每次递归合并时分解右子树 它的距离至少减少1 故时间复杂度为O(logN1+logN2) 左偏树的其他操作 插入新节点 将单独一个点作为一棵左偏树, 进行合并操作 删除最小点 合并左右子树 Merge Merge 左偏树性质定理的证明 定理: 若一棵左偏树有N个节点, 则该左偏树的NPL不超过 ?log(N+1)? -1. 要证明这个定理, 我们只需要证明另一个引理即可: 若一棵左偏树的NPL(最右路径长度)为r , 则该树包含至少2r+1-1个节点 归纳证明 如果r = 0 , 左偏树至少包含一个节点 否则我们假设上述定理对于r=0..k均成立 考虑一棵最右路径长度为k+1的左偏树 由定义知根的右子树的NPL
文档评论(0)