启发式合并

Posted hehe54321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启发式合并相关的知识,希望对你有一定的参考价值。

平衡树的启发式合并是每一次把小的树的各个节点插入大的树,然后删除小的树

复杂度是由于:每一个元素进行一次移动时,其所在集合的大小最少扩大到原来的二倍

线段树/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

证明是:

技术分享图片

或者说:

调用一次合并函数的时间是常数,
而合并函数每调用一次就会删掉一个点,
所以合并的总代价为删掉的点数和

结合节点的产生的复杂度是正确的,可以说明复杂度正确

 

以上是关于启发式合并的主要内容,如果未能解决你的问题,请参考以下文章

树上启发式合并/dsu on tree

启发式合并及其应用

模板:启发式合并

启发式合并(堆setsplaytreap)/线段树合并学习小记

学习笔记::启发式合并

HDU - 4358 Boring counting (树上启发式合并/线段树合并)