可持久化Treap学习小结
2016-08-18 14:36
225 查看
可持久化Treap与Treap
可持久化Treap与Treap的区别在于哪里?维持平衡的方式:可’用Split和Merge,而Treap使用rotate
Other:可’可以分裂(Split)和合并(Merge)
Merge
Merge操作类似于线段树的合并,但是Merge的两棵Treap一定要保证一棵的key值都小于第二棵的key值int Merge(u,v){//保证u的子树的key值小于v的子树的key值,返回的int表示Merge之后的树根 if (!u||!v)return u^v;//其中一个树为空直接返回另一棵树 down(u);down(v);//下传标记 if (fix[u]<fix[v]){//如果u的堆值小于v的堆值那么以u为根 tree[u].r=Merge(tree[u].r,v); updata(u); return u; } //如果v的堆值小于u的堆值那么以v为根 tree[v].l=Merge(u,tree[v].l); updata(v); return v; }
Split
Split操作就是将树分成两块typedef pair<int,int> P; P Split(int x,int n){//Split操作将以x为根的Treap的前n个划分出来变成两棵Treap,所以返回的是pair if (!n)return P(0,x); down(x);//下传标记 if (n<=size[tree[x].l]){//如果要分裂出来的左边的块在左子树中 P f=Split(tree[x].l,n); tree[x].l=f.second;//更换左子树 updata(x); return P(f.first,x); } //与上面类似 P f=Split(tree[x].r,n-size[tree[x].l]-1); tree[x].r=f.first; updata(x); return P(x,f.second); }
Insert
Insert操作就是要在一棵Treap里面加入一个新的节点x,由于可持久化Treap不能够旋转,所以我们可以用Split和Merge来实现,首先将这棵Treap按照加入的点的key值Split成两棵Treap(设为u,v)然后先Merge(u,x)再Merge(u,v)Delete
Delete操作就是要删除一个节点x,与Insert操作类似,先将Treap给Split成两棵Treap,然后再Split,最后将最左和最右的Merge相关文章推荐
- Treap树学习小结
- 可持久化treap学习笔记
- treap学习小结(一)
- 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
- Treap和Splay学习小结
- 可持久化(非旋转式)treap 学习记录
- 近期学习小结(2005-2-13)
- [持续更新] 学习历程 迭代计划和小结
- Java学习小结
- TPersistent 与持久化的一些学习和Assign对象CLONE
- Page 的生命周期学习小结
- 学习C++小结
- ASP.NET学习小结(1)--Cookie,XML(建立xml文档,和查找一个结点)
- 学习小结(2005-2-22)
- c++学习小结
- 民航学概论学习小结
- C# 静态成员和方法的学习小结
- Duwamish配置持久化学习笔记
- 学习Python知识小结 杂记二
- Duwamish配置持久化学习笔记