平衡树的启发式合并是每一次把小的树的各个节点插入大的树,然后删除小的树
复杂度是由于:每一个元素进行一次移动时,其所在集合的大小最少扩大到原来的二倍
线段树/01字典树的启发式合并是:https://wenku.baidu.com/view/88f4e134e518964bcf847c95.html
https://blog.csdn.net/zawedx/article/details/51818475
void merge(root1,root2){//合并到root1上
if 两颗左子树中有空树 直接给root1接上不是空树的左子树
else merge(root1.leftson,root2.leftson)
if 两颗右子树中有空树 直接给root1接上不是空树的右子树
else merge(root1.rightson,root2.rightson)
删掉root2这个点
}
或者暴力一点:
if(!root1) return root2;
if(!root2) return root1;
root1.leftson=merge(root1.leftson,root2.leftson);
root1.rightson=merge(root1.rightson,root2.rightson);
clean(root2);
return root1
证明是:
或者说:
调用一次合并函数的时间是常数,
而合并函数每调用一次就会删掉一个点,
所以合并的总代价为删掉的点数和
结合节点的产生的复杂度是正确的,可以说明复杂度正确