- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Size Balanced Tree 陈启峰 (Farmer John) 中国广东纪念中学 Email:344368722@QQ.com 摘要 这篇论文将展现一个独特巧妙的策略动态地维护二叉搜索树(Binay Search Trees,缩写为BST),并且它在最坏的情况下也有着良好的期望运行速度。Size Balanced Tree,顾名思义,这是一棵通过大小(Size)域来维持平衡的二叉搜索树。 这是一种简单、高效并且在各方面都通用的数据结构。 这也是一种很容易被语言工具表述的数据结构,它有着简单明了的定义,和令人惊叹的运行速度,而且你会惊讶于它简单的证明。 这是目前为止速度最快的高级二叉搜索树[1]。 此外,它比其它一些知名的高级二叉搜索树要快得多,并且在实践中趋于完美。 它不仅支持典型的二叉搜索树操作,而且也支持Select和Rank。 Size Balanced Tree SBT Maintain 翻译 By 竹子的叶子 文档经过处理,可以使用“视图”——“文档结构图”来方便阅读。 希望大家不要随便修改,谢谢! 1 介绍Size Balanced Tree之前,有必要详细说明一下二叉搜索树的旋转,左旋(Left-Ratote)和右旋(Right-Ratote)。 1.1 二叉搜索树 二叉搜索树是一种非常重要的高级数据,它支持很多动态操作,其中包括搜索(Search),取小(Minimum),取大(Maximun),前驱(Predecessor),后继(Successor),插入(Insert)和删除(Delete)。它能够同时被当作字典和优先队列使用。 [2],并且我们定义key[t]来表示结点t用来做比较的值。另外,我们增加s[t],表示以t为根的子树的大小(Size),维持它成为这棵树上结点的个数。特别地,当我们使用0时,指针指向一棵空树,并且s[0]=0。 1.2 旋转 为了保持二叉搜索树的平衡(而不是退化成为链表),我们通常通过旋转改变指针结构,从而改变这种情况。并且,这种旋转是一种可以保持二叉搜索树特性的本地运算[3]。 图 1.1 图 1.1:左旋Left-Ratote(x)操作通过更改两个常数指针将左边两个结点的结构转变成右边的结构,右边的结构也可以通过相反的操作Right-Ratote(x)来转变成左边的结构。 右旋的伪代码 Right-Rotate(t) 1 k ← left[t] 2 left[t] ← right[k] 3 right[k] ← t 4 s[k] ← s[t] 5 s[t] ← s[left[t]] + s[right[t]] + 1 6 t ← k 左旋的伪代码 左旋操作假定右儿子存在。 Left-Rotate (t) 1 k ← right[t] 2 right[t] ← left[k] 3 left[k] ← t 4 s[k] ← s[t] 5 s[t] ← s[left[t]] + s[right[t]] + 1 6 t ← k 2 Size Balanced Tree Size Balanced Tree(SBT)是一种通过大小(Size)域来保持平衡的二叉搜索树。它支持许多运算时间级别为O(logn)的主要操作: Insert(t,v) 在以t为根的SBT中插入一个关键字为v的结点。 Delete(t,v) 从以t为根的SBT中删除一个关键字为v的结点,如果树中没有一个这样的结点,删除搜索到的最后一个结点。 Find(t,v) 查找并返回结点关键字为v的结点。 Rank(t,v) 返回v在以t为根的树中的,也就是比v小的那棵树的大小加一。 Select(t,k) 返回在第k位置上的结点。显然它包括了取大(Maximum)和取小(Minimun),取大等价于Select(t,1),取小等价于Select(t,s[t])。 Pred(t,v) 返回比v小的最大的数。 Succ(t,v) 返回比v大的最小的数。 性质b: 图 2.1 图2.1:结点L和R分别是结点T的左右儿子。子树A、B、C和D分别是结点L和R各自的左右子树。 符合性质a和性质b, 3 Maintain 如果我们要在一个BST插入一个关键字为v的结点,通常我们使用下列过程来完成任务。 Simple-Insert (t,v) 1 If t=0 then 2 t ← NEW-NODE(v) 3 Else 4 s[t] ← s[t]+1 5 If v key[t] then 6 Simple-Insert(left[t],v) 7 Else 8 Simple-Insert(right[t],v) 在执行完简单的插入之后,性质a或性质b可能就不满足了,于是我们需要调整SBT。
文档评论(0)