平衡树性质总结 胡天翔.docVIP

  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文档。上传文档
查看更多
平衡树性质总结 胡天翔

平衡树性质总结 长郡中学 胡天翔 目录 前言 平衡树的定义 平衡树的实现 平衡树的应用 总结 前言 平衡树作为一种功能极其强大,实现较为方便,操作十分灵活的数据结构,在近几年的各级比赛中层出不穷。在动态统计一类问题中,平衡树这种数据结构,能够以普通算法成千上万倍的速度,和更少的冗余,来解决问题。 在阅读了不少关于平衡树的论文,以及做了不少关于平衡树的题目之后,本人获得了不少心得,于是在这里,将平衡树最基础的一些性质和操作,进行总结。 平衡树的定义 平衡树来源于二叉搜索树,只是加上维护其二叉树性质(平衡)的操作后,无论是在速度还是在空间以及变成复杂度上都有了极大的优化。根据维护方式以及储存方式的不同,平衡树又分为点型,线型,静态和动态。 【点型与线型】 这一个划分,来源于对这一棵平衡树的操作类型。点型的平衡树,其每一个节点,表示的就是离散的一个点。线型的平衡树,表示的就是一段区间。 如对于序列10,5,3,4,1,7,6,2,8,他的点型和线型表示分别为: 【静态与动态】 静态的平衡树一般存在于已经事先知道所有操作且平衡树不需要改变的情况下,可以对数据进行预处理,预先构造出平衡树,这样在之后的操作中就不需要维护平衡而减少各种复杂度。 动态的平衡树则范围更广,比如维护一个支持某些操作的数据结构时,就需要一边维护这个平衡树,一边对平衡树进行求值,这个平衡树的形态,信息都处于动态的变化之中。 一般的维护动态点型平衡树的有AVL,SPLAY,SBT等几种维护方式。 静态的线性平衡树被称为线段树。 【信息】 平衡树之所以快速,是因为在每一棵子树的根节点处保存信息,这样在对于每一次的询问或者修改时,不必完全下到每一个叶子节点,只需要从根节点处读取信息,或在根节点处标记信息即可。 信息又分为两种,区间信息和标记信息。 【区间信息】 区间信息是用于保存这棵子树的信息的,一般有区间和,区间最大值,区间结点个数,区间深度等等。保存这些信息,有利于减少重复计算,使得在需要这些信息的时候无需下到下面的节点,而直接就在这个节点获取信息。 区间信息一般是从子节点更新上来的,或者是根据这一次的操作直接修改。 【标记信息】 标记信息是用于记录这一棵子树的修改信息的,如区间所有数是否加上了一个同一个值,是否都修改成了同一个值。 保存这些信息就使得在修改一段区间的值时,不需要把每一个节点的值都修改,只需记录根节点上,有需要时再下放标记即可。 【下放标记】 标记信息大多数情况不能永远保存在根节点,在对根节点所对应的一段区间中的一部分子区间进行修改时,就需要现将根节点的标记信息下放,才能进行下一步的标记和修改。但是在平衡树是静态的,而且不下放标记不会对询问造成影响的情况下,是可以将标记信息保存在根节点的。 【修改与求值】 修改是对应于点和线的,对于点型的修改,只需在整棵平衡树中找到这个点的位置,进行修改,并将一路上的信息一并更新即可。线性的修改,基本如此,只是在线段跨越两个子树的时候分为两个过程,分别修改即可。 求值一般是对应于线的,且求值与修改基本无异,递归找到最基本的线段,在返回的路上一层层合并更新,就可以得到最终的值。 平衡树的实现 如前面所述,平衡树基于普通的二叉搜索树,对于普通的二叉搜索树的介绍,这里省去不说。 【平衡树的存储】 类似于树的存储,大多数时候建议使用虚二叉树,即编号为T的根节点,其左子树的边号为T*2,右子树的边号为T*2+1. 【平衡树的操作】 平衡树有两种基本操作,修改与求值,在上一篇说过一些,在这里介绍其基本结构。 Function 处理(T) Begin If 操作的区间完全覆盖T的区间 Then Begin 修改T的区间信息 修改T的标记信息 End Else Begin 将标记下放 处理T的左子树 处理T的右子树 更新T的区间信息 End End 根据实际需要,可以适当的添删操作。 【平衡树的维护】 对于平衡树,我们会采取一些方法,利用一些关键字,使得平衡树保持“平衡”的性质。 【为什么要维护】 不难发现,对于平衡树的每一个操作,其时间复杂度就是每一次的深度,所以,顾名思义,“平衡”就是指左右子树基本一致,这样就能使平衡树更大程度的接近于一个完全二叉树,从而使得树的平均深度最短。 【如何维护】 这里只简单的介绍一下最为简单的一种平衡树——AVL。 AVL是以树深度个数为关键字,要求左右子树深度相差不能超过1,来维持这棵AVL的性质。其主要操作就是旋转操作。 通过旋转某一个节点,使得左右子树的深度发生变化。 【单旋转】 这是left-rotate(a); Function u

文档评论(0)

zijingling + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档