加权合并启发式

概述

加权合并启发式(Weighted-Union Heuristic)是不相交集合数据结构链表表示中的优化策略。在执行 UNION 操作时,总是将较短的链表合并到较长的链表上,从而最小化指针更新的总代价。

定义

加权合并启发式

在链表表示的并查集中,每个集合用一个带头节点的单链表表示,头节点即为集合代表。每个元素维护一个指向集合代表的指针 set

加权合并规则:执行 UNION(x, y) 时,设 的大小为 的大小为

  • :将 的链表追加到 的链表末尾,更新 中所有元素的 set 指针指向 的代表
  • :反之

合并后集合大小为

链表表示的数据结构

集合 S_i 的链表表示:

head ──→ [obj_1] ──→ [obj_2] ──→ [obj_3] ──→ ... ──→ [obj_ni]
           │             │             │                    │
           ↓             ↓             ↓                    ↓
         set ──→ head  set ──→ head  set ──→ head        set ──→ head
  • head:链表头节点,也是集合代表
  • set:每个元素指向集合代表的指针,用于 的 FIND-SET
  • size:头节点维护的集合大小属性

核心性质

引理:元素指针更新次数上界

引理

在使用加权合并启发式的链表表示中,对 个元素执行任意序列的 MAKE-SET 和 UNION 操作,每个元素的 set 指针最多被更新 次。

证明思路

考虑某个元素 set 指针何时会被更新。当 所在的集合 被合并到另一个更大的集合 中时(即 ), 中的所有元素的 set 指针都需要更新。

关键观察:每次 set 指针被更新, 所在集合的大小至少翻倍

形式化地,设 次更新 set 指针后所在集合的大小为 。由于加权合并保证 (因为小集合合并到大集合,合并后大小至少是原来的两倍),且初始 ,所以:

由于集合大小不超过 ,有 ,即 。因此每个元素最多被更新 次。

定理19.1:总操作复杂度

定理 19.1

在使用加权合并启发式的链表表示中,对 个元素执行 次 MAKE-SET、UNION、FIND-SET 操作的序列,总时间为

证明思路聚合分析):

  • MAKE-SET 每次,共
  • FIND-SET 每次(直接通过 set 指针),共
  • UNION:需要更新较小集合中所有元素的 set 指针
    • 由引理,每个元素最多被更新
    • 个元素的总更新次数
    • 合并链表本身

因此总时间 =

操作复杂度

操作单次代价说明
MAKE-SET(x)创建单元素链表
FIND-SET(x)直接读取 set 指针
UNION(x, y)更新较小集合的所有指针

局限性

加权合并启发式虽然将总复杂度从 优化到 ,但 UNION 操作的单次代价仍可能为 。更高效的不相交集合森林表示可以进一步将均摊代价降至

参见