伸展树【信息技术】.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
伸展树及其应用 刘汝佳 目录 BST与平衡BST 伸展操作 伸展树的五种基本操作 五个基本应用 可合并队列 欧拉回路树(ET-tree) 动态树(Dynamic Tree) 基本BST 基本BST(Binary Search Tree)定义 二叉树 左子树 根 右子树 递归定义: 左子树和右子树均是BST 基本实现方式 查找: 从根往下走O(h) 插入: 查找失败后O(1). 总O(h) 删除: 分情况讨论, O(h) 问题: 退化情况下h很大 平衡BST n个key的BST不是唯一的, 因此在操作后可以把树调整得尽量平衡, 让h=O(logn) 几种常见的平衡BST AVL树: 严格平衡, 但常数因此较大 伸展树: 不严格平衡, 但操作的平摊效果好 红黑树: CLRS有详细讨论 Treap: 概率意义下平衡, 程序简单 … 伸展操作 伸展操作Splay(x,S): 把x旋转到树根, 同时保持树是一棵合法的BST 设y=father(x), z=father(y) 情况一: y是根结点: zig或zag 情况二: y不是根结点, 且x与y同是(自己父亲的)左孩子或同是右孩子: zig-zig或zag-zag 情况三: y不是根结点, 且x与y中一个是左孩子一个是右孩子: zig-zig或zag-zig 情况一 y是根结点 情况二 y不是根结点, 且x与y同是(自己父亲的)左孩子或同是右孩子 情况三 y不是根结点, 且x与y中一个是左孩子一个是右孩子 伸展操作举例 基本操作 Find(x, S): BST查找, 然后Splay Insert(x, S): BST插入, 然后Splay Delete(x, S): Find(x, S), 合并x的左右儿子 Join(S1, S2): 见后 Split(x, S): 见后 伸展操作是基础! 合并与分离 Join(S1, S2): 伸展S1中的最大元素 Split(x, S): 伸展x, 断开儿子 小结 伸展: 三种情况, 两种基本旋转(zig, zag) 五种基本操作: 以伸展为基础 n个结点的伸展树, 每个操作的平摊时间复杂度为O(logn) (不证) 下面的讨论均假定所有key均不相同. 如果有相同的key呢? 方法一: 加计数器 方法二: 允许多个相同结点, 注意各种操作 应用一、字典 要求: 支持以下操作 INSERT(key) DELETE(key) FIND(key) 实现: 直接用伸展树即可. 每个操作平摊时间均为O(logn) 应用二、前趋后继 要求: 支持以下操作 INSERT(key) DELETE(key) FIND(key) PRED(key) SUCC(key) 前趋和后继的实现: 首先查找key, 则查找后key被伸展到树根, 左子树的最右点就是PRED, 而右子树的最左点就是SUCC 应用三、k小值查询 要求: 支持以下操作 INSERT(key) DELETE(key) FIND(key) SELECT(k): 取第k小值 结点附加信息: c(p)表示结点p为根的子树一共有多少个结点 如何用c(p)计算SELECT(k)? 如何维护c(p)? SELECT的计算 如下图, 查询k=6 时间复杂度同FIND c(p)的维护 维护就是保证它在任何时刻的值都符合定义, 而不要只在使用的时候假设它符合定义. 局部性: 没有变的东西不用改,只需要修改那些有可能改变的东西 BST插入过程: 沿途给各结点c(p)加1. 其他结点的c(p)不变. 想一想, 为什么 伸展操作: 见后, 三种旋转分别维护 问题: 删除时需要沿途给各结点c(p)减1么? 不需要, 因为伸展树的删除=Find+Union 伸展操作时附加信息的维护 举例: zig/zag时c(p)的维护 A, B, C结构完全不变, 其中所有结点信息不变 c(x)和c(y)可重新用c(A), c(B), c(C)算出 熟记三个图(zig/zag, zig-zig/zag-zag, zig-zag/zag-zig), 用图上的字母推导维护算法 维护小结 维护就是保证它在任何时刻的值都符合定义, 而不要只在使用的时候假设它符合定义. 局部性: 没有变的东西不用改,只需要修改那些有可能改变的东西 维护附加信息有两个方面 BST插入过程: 沿途修改 伸展过程: 用图上字母推导 查找过程信息不变, Delete=Find+Union 思考: Join和Split需要专门维护么? 应用四、连续和查询 要求: 支持以下操作 INSERT(key) DELETE(key) FIND(key) SUM(k1, k2): 求满足k1 key k2的所有key之和 结点附加信息: s(p)表示结点p为根的子树的所有

文档评论(0)

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

1亿VIP精品文档

相关文档