Treap学习(一)

BST是重要且简洁易懂的数据结构,但是面对一些数据特别是针对竞赛弄的***钻数据而言,普通BST经常会退化成一条链,效率大打折扣。所以,平衡二叉树的学习是很重要的。

平衡二叉树主要有AVL,红黑树,Treap,伸展树,SBT等等,各有优劣。竞赛时,后三者比较常见。网上分析对比很多,就不复制粘贴了。

Treap是编程实现十分简单的一种平衡二叉树。仅涉及两个旋转,并且大多数代码都是对称的,想偷懒的话可以复制粘贴一下,所以特别适合我这样的懒人学习。

但是学习起来还是很有坎坷的。首先,我一直不明白为什么满足堆序和二叉树性质的树是唯一的,这在前几天才弄懂。其次,转来转去花了好长时间理解。另外,学习时断时续,理论学习之后没有编程实现,经常忘记。还有,难以找到一个Pascal版本的完整实现的例程。最杯具的是,找到了Pascal版本的例程却是大根堆的,而我看的资料全是小根堆的,这让我花了一个晚上才想明白为什么例程是对的。

练习Treap的入门题目是POJ3481,只是插入和找出最小值和最大值并删除的操作。我模仿例程打了一遍之后自己按照资料上的小根堆的实现打了多遍均出现诡异的错误,纠结了三个晚上,不过倒是把Treap练得比较熟了,3481这样的题目基本20分钟内搞定。不过,这种水题要练到10分钟内直接编译通过AC才行。另外维护子树大小等应用都还没尝试过。

我的学习时的资料:

数据结构与算法分析(C语言描述)和算法导论相关章节

BYVoid大牛的文章http://www.byvoid.com/blog/treap-analysis-and-application/

另外一篇文章http://dongxicheng.org/structure/treap/

维基百科:http://zh.wikipedia.org/wiki/Treap

posted on 2011-05-11 23:06  oa414  阅读(437)  评论(0编辑  收藏  举报

导航