某$OI$选手写的,其中一些观点看法让我受益颇深
启发式合并
#先来分类
一般来说,$OI$中的名词大概分成这几大类.
思想 : 模拟,贪心,动态规划,模型转换
策略 : 固定策略,随机化策略,启发式策略
算法 : …
显然在合并时使用启发式策略的算法,被称之为启发式合并.
#定义
形如在两个对象合并时,参考两个对象(任何类型)的启发式函数,决定谁并入谁的合并,我们称之为启发式合并.
一般地,对象类型是集合,启发式函数为集合的大小,合并方式为小的集合并入大的集合.
#一般模型 - 按秩合并
考虑有$n$个元素,分别属于不同的集合,现在要将某两个集合合并,进行多次操作,考虑到按题意模拟,有很大概率被卡成$O(n^{2})$
所以我们选择按秩合并,即把小的集合并入大的集合,复杂度可以分开每个元素考虑,一个元素从一个集合进入另一个集合的操作占主要复杂度,一个元素从一个集合进入另一个集合仅当另一个集合大于等于当前集合,则可以发现一个元素并入的集合呈指数增长,则一个元素最多被合并$O(lnn)$次,所以总体而言,复杂度为$O(nln^{2}$)的.
几大经典应用
并查集按秩合并:加上路径压缩成为并查集的两大优化
优先队列的启发式合并:P3377 【模板】左偏树(可并堆)
从来就不可能码什么可并堆,$O(nln^{2}n)$随便水
平衡树的启发式合并:各种乱搞
#特殊模型
树上启发式合并$(dsu$ $on$ $tree)$
怎么说呢,其实就是很简单的优化暴力,类似莫队的玩法(其实上面也差不多),但是有着优秀的复杂度$O(nlnn)$,证明同上。$Codeforces$上有篇博客就写的很好 [Tutorial] Sack (dsu on tree)
建议有树剖基础的同学食用.
参考自: