浅谈启发式合并
浅谈启发式合并
本篇随笔简单浅谈一下启发式合并。
启发式合并的概念
顾名思义,启发式合并解决的是合并类的问题。
现在给一个最基本的合并问题。
我们要把\(N\)个集合,总共\(M\)个元素合并成一个大集合。
很容易得出,最坏的情况下需要合并\(N\)次,每次合并\(M\)个元素,也就是\(O(MN)\)的时间复杂度。
(一个集合有所有元素,然后傻呵的一直把这个最大的往空集里合并,合并了\(N\)次)
然后我们想,这种合并策略山P就山P在把最大的往小的里合并。
同样的问题,如果我们把小的往大的里合,是不是就快很多?
看看这个思路,是不是很像拍脑门临时得出来的?
是不是很受启发?
好了,它就叫启发式合并。
其思路是:每次把较小集合往较大集合里合并。
其原理是,因为是较小集合往较大集合里合,于是较小集合的元素个数被扩充了至少一倍,也就是变成了原来的二倍多,这样的话,我们就能保证,最坏的合并次数是\(O(\log N)\)。
启发式合并的应用
在刚刚讲过的概念中,我们可以得知启发式合并是对数据结构的一种合并,比如多棵树、集合、线性数据结构等等。
当然我们最常见的还是并查集的启发式合并优化。
在此不过多赘述,具体的应用请读者通过具体题目自行体会。