您的位置:首页 > 其它

可持久化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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: