Skip to content

Latest commit

 

History

History
53 lines (48 loc) · 2.33 KB

并查集.md

File metadata and controls

53 lines (48 loc) · 2.33 KB

什么是并查集

并查集可以视为连通图的构造,若节点a与b之间连通,则a所在的图与b所在的图就是连通的,即可以合并。 并查集常用于元素分组的问题,用于管理一系列不相交集合。

并查集支持的操作

  • 查找

    判断两个元素是否在同一个集合中

  • 合并

    将两个集合合并为一个集合

并查集的模板

  • 构建数组

    构建数组,保存每个元素所在集合的父节点 若保存根节点,则每次发生合并时,需要将集合内的所有元素都更新根节点

  • 初始化

    初始化时每个元素的父节点为自身

  • 查找

    查找当前元素所在集合的根节点 只需递归查找当前元素的父节点,当元素的父节点为自身时就是根节点

  • 合并

    将两个节点所在集合的根节点的父节点置为另一个根节点

并查集的优化

  • 路径压缩

    由于数组保存的是父节点,因此查找一个元素的根节点需要的递归次数为构成的树的高度 树越高,查找越慢,因此有必要优化 所以在每次合并操作时,更新递归查找路径中的元素的父节点为根节点

  • 按秩合并

    合并操作时应尽可能将高度低的树挂到高度高的树下,这样树的高度变化得最小 因此可以另构建一个数组保存元素的子树的高度 合并时根据树的高度选择最终集合的根节点

解法要点

  • 初始化

    构建一维数组,初始化值为自身

  • 查找

    递归查找当前元素的父节点,直到节点的值为本身

  • 合并

    给定两个节点合并,查找两个节点的父节点,将其中一个的值改为另一个

  • 映射

    对于给定的多维数组,可以通过函数映射为一维数组

  • 虚拟节点

    对于某些特定场景,某些集合本身不属于一个集合,但是可以视为一个集合,可以采用虚拟节点做为集合合并的纽带

解法套路

当确定了一个题目可以由并查集解答时,采用一下步骤

  • 初始化
  • 查找合并

    遍历给定数组,将连通的节点进行查找合并 对于多维数组,使用函数映射为一维数组

  • 分析结果

    根据合并结果得出解答结果 例如集合的数量,替换连通集合的元素值等