启发式合并

  启发式合并是对集合合并类问题的一种高效处理方式。

  • 通常启发式合并优化的是合并多个相同数据结构的时间,通过暴力的合并来

     将两个相同的数据结构合并,从而使得维护的零散信息(性质)逐渐合一。

  • 举个十分简单的例子:起初有 n 个数组,且每个数组有且仅有 1 个数,接下

    来有 n-1 个指令,需要你每次合并两个指定数组(将其中一个数组中的数一

    个一个插入另一个数组)。使插入操作的次数最少。

  • 最坏需要插入 nlogn次。做法:每次合并两个数组时,首先比较两个数组的

    大小,将小数组中的数暴力插入大数组中就可以了。

  • 证明:对于每一个数,考虑何时会对其进行插入操作。显然是它所在的集合

    大小比另一个集合小的时候。也就是说,在每次它被进行插入操作的合并指

    令后,它所在的集合大小会翻至少一倍,那么显然最多翻 logn 次啊。所以这

    样合并集合的时间复杂度是 nlogn 的。

一些题目:

P3201 [HNOI2009]梦幻布丁

P3224 [HNOI2012]永无乡

P3302 [SDOI2013]森林

posted @ 2019-02-24 11:29  Hevix  阅读(140)  评论(0编辑  收藏  举报