[算法] 合并查找(Union Find)

文章目录

      • Union Find算法基础
      • 算法优化
      • 算法性能
      • 伪代码
      • Python代码
    • 题解

Union Find算法基础

Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作:

  • Find: 确定元素属于哪一个子集,判断两个元素是否属于同一子集(即,查找元素的root,当两元素root相同时判定他们属于同一个子集)
  • Union: 将两个子集合并为一个子集(即通过修改元素的root或parent来合并子集)

并查集是一种树形的数据结构,其可用数组或unordered_map表示,下面这个图很清晰的展示了并、查、集。摘自 UnionFind Algorithm。
[算法] 合并查找(Union Find)_第1张图片

算法优化

有两种常用的方法用来降低并查集的树形结构的高度、以减少Uinon Find算法的时间复杂度,这两种方法是:

  • Weighting(或称作Ranking): 使用一个数组记录每个root的size,Uinon时将size小的集合挂到size大的集合下
  • Path compression: 寻找 root(i) 的过程中(即Find的过程中)将 i 自身及其各层parent元素都直接挂到root下,就不再是原数据层层parent的结构。
    [算法] 合并查找(Union Find)_第2张图片
    Weighted union,是把low rank(size)的tree,merge到high rank(size)的tree。尽量使得tree不那么tall,而是更加flat。并且merge的过程也不是直接merge这两个tree,而是通过Union p和q,在这里是Union3和5。在Union的过程中,其实是Find root(5)和Find root(8),发现不是同一个root,那么就把rank更小的set所在的root,merge到rank更大的root,在这里就是把6指向9。

[算法] 合并查找(Union Find)_第3张图片
Path compression,是在Find的过程中顺便做的,例如,在Find(9)过程中,顺便将9的从下到上各层parent节点都直接挂在root下,这样虽然在Find(9)时候的复杂度是O(n),但是后面如果再Find其中某个parent节点,就都只要O(1)即可,因此均摊复杂度就是O(1)。如果不执行Find,那么就不会去执行path compression,也就是说,union的过程是不执行path compression的,union就只是把其中一个root指向另一个root即可,只有Find才会触发pat

你可能感兴趣的:(数据结构和算法,并查集,图,算法)