陈启峰 WC2007论文 数据结构 Size Balanced Tree 方法来证明,对于任意整数n*,P(n*)都是成立的。
6.4.1 证明
这里我只给出大概的证明。
假设结点t已经被Maintain(t,false)检查过,则有
第8页
s[left[t]]?1?s[right[t]]?2
2s[t]?1s[left[t]]?3因此如果一个结点到根的路径上的所有结点都已经被Maintain检查过,那么这个结点的深度就是O(logn)。 (1)对于n*=1,很明显P(n*)是真的;
(2)假设对于P(n*)在n* 一棵树。对于树中的每一个叶子,由它指向的子树不会在Maintain中被改变[7]。所以子树中结点的深度不会比O(logn*)+O(logn*)=O(logn*)大。 (3)因此,当n*=1,2,3…时,P(n*)是正确的。 这种方法证明出来的Maintain平摊时间依旧是O(1)。 6.5 分析更快更简单的Maintain 这里讨论有关为什么Maintain(left[t],true)和Maintain(right[t],false)被省略。 在情况1的图3.1[8]中,我们有 s[L]?2s[R]?1?2s[L]?14s[R]?1s[B]???332s[B]?18s[R]?3 s[E],s[F]???39?8s[R]?3?s[E],s[F]???s[R]?9??因此Maintain(right[t],false)相当于图3.1中的Maintain(T,false),能够被省略。同样的,Maintain(left[t],true)明显的也不需要。 在情况2的图3.2中,我们有 ?s[A]?s[E] ??s[F]?s[R]这些不平衡也意味着E的子树大小要比s[A]小,F的子树大小要比s[R]小。因而Maintain(right[t],false)和Maintain(left[t],true)可以被省略。 7 优点 7.1 SBT跑得快 7.1.2 典型问题 写一个执行n个由输入给定的操作,他们分别是: 1) 在有序集合中插入一个给定的数字; 2) 从有序集合中删除一个给定的数字; 3) 返回一个给定的数字是否在有序集合中; 4) 返回一个给定的数字在有序集合中的排名; 5) 返回有序集合中第k大的数字; 6) 返回有序集合中一个给定数字前面的数字; 7) 返回有序集合中一个给定数字后面的数字。 7.1.2 统计 陈启峰 WC2007论文 数据结构 Size Balanced Tree 插入200万个随机值结点 16 14 12 第9页 单位:秒10 8 6 4 2 0 AVL 8.34 Treap 11.36 Random BST 13.61 SBT 7.13 16 14 12 200万个操作,66%为插入,33%为删除,全部随机 单位:秒 10 8 6 4 2 0 SBT 5.59 AVL 7.42 Treap 8.86 Random BST 10.47 200万个操作,20%为插入,10%为删除,60%查询,全部随机 8 7 6 单位:秒 5 4 3 2 1 0 SBT 3.39 AVL 4.42 Treap 5.67 Random BST 6.21 陈启峰 WC2007论文 数据结构 Size Balanced Tree 第10页 在现实中,Size Balanced Tree运行优秀,从上面的图表就能看出,同样都在随机数据的情况下,SBT比其它平衡BST要快得多。此外,如果是有序数据,SBT将会是意想不到的快速。它仅仅花费2s就将200万个有序数据结点插入到SBT中。 7.2 SBT运行高效 当Maintain运行的时候平均深度一点也不会增加,因为SBT总是趋近于一个完美的BST。 插入200万个随机值结点 类型 平均深度 高度 旋转次数 SBT 19.2415 24 1568017 AVL 19.3285 24 1395900 Treap 26.5062 50 3993887 随机BST 25.5303 53 3997477 Splay 37.1953 78 25151532 完美的BST 18.9514 20 ? 插入200万个有序值结点 类型 平均深度 高度 旋转次数 SBT 18.9514 20 1999979 AVL 18.9514 20 1999979 Treap 25.6528 51 1999985 随机BST 26.2860 53 1999991 Splay 999999.5 1999999 0 完美的BST 18.9514 20 ? 7.3 SBT调试简单 首先我们可以输入一个简单的BST来保证不会出错,然后我们在插入过程中加入Maintain,并调试。如果发生错误也只需要调试和修改Maintain。此外,SBT不是基于随机性的数据结构,所以它要比Treap,跳跃表(Skip List),随机BST等更稳定。 7.4 SBT书写简单 SBT几乎是和BST同样简单。仅仅在插入过程中有一个附加的Maintain,它也仅仅比BST先旋转[9]。而且Maintain也是同样的相当容易。 7.5 SBT小巧玲珑 许许多多的平衡二叉搜索树,例如SBT,AVL,Treap,红黑树等等都需要额外的域去保持平衡。但是他们中的很多都有着毫无用处的域,像高度(height),随机因子(random factor)和颜色(color)。而相反的是SBT包含一个十分有用的额外域,大小(size)域。通过它我们可以让BST支持选择(Select)操作和排名(Rank)操作。 7.5 SBT用途广泛 现在SBT的高度是O(logn),即便在最坏情况下我们也可以在O(logn)时间内完成Select过程。但是这一点伸展树(Splay)却不能很好的支持。因为它的高度很容易退化成O(n)。上面的图表已经显示出这一点[10]。 感谢 作者感谢他的英语老师Fiona热情的帮助。 参考 [1] G.M.Adelson-Velskii and E.M.Landis, “An algorithm for the Organization of Information”, Soviet.Mat.Doklady (1962) [2] L.J.Guibas and R.Sedgewick, “A dichromatic Framework for Balanced Trees”, Proceedings of the Nineteenth Annual IEEE Symposium on Foundations of Computer Science (1978) [3] D. D. Sleator and R. E. Tarjan, ?Self-adjusting binary search trees?, JACM, 32, 652–686 (1985). [4] S.W.Bent and J.R.Driscoll, Randomly balanced searchtrees. Manuscript (1991). [5] Raimund Seidel and Cecilia R. Aragony, Randomized Search Trees.(1996). [6] M.A.Weiss, ??Data Structures and Algorithm Analysis in C++??, Third Edition, Addison Wesley, 2006. [7] R.E. Tarjan, ??Sequential access in splay trees takes linear time??, Combinatorica 5(4), 1985, pp. 367-378. [8] J. Nievergelt and E. M. Reingold, ?Binary search trees of bounded balance?, SIAM J. Computing, 2, 33–43 (1973). [9] K.Mehlhorn, and A.Tsakalidis, “Data Structures,” in Handbook of Theoretical Computer Science, Chapter 6, Vol.A,
相关推荐: