Unionfind

并查集

alt

应用场景

  • 照片中的像素
  • 网络中的计算机
  • 社交网络的朋友

Code

class UnionFind:
    def __init__(self, n):
        self.id = [i for i in range(n)]
        self.size = [1] * n

    def root(self, i):
        while i != self.id[i]:
            self.id[i] = self.id[self.id[i]]
            i = self.id[i]
        return i

    def connected(self, p, q):
        return self.root(p) == self.root(q)

    def union(self, p, q):
        i = self.root(p)
        j = self.root(q)
        if i == j:
            return
        if self.size[i] < self.size[j]:
            self.id[i] = j
            self.size[j] += self.size[i]
        else:
            self.id[j] = i
            self.size[i] += self.size[j]

说明:

  • id保存对应根节点的id
  • size保存当前根节点的元素个数

关键点:

  • root,查找过程中,更新查找路径上节点的父节点值为祖父节点,达到路径压缩目的,缩短查找路径长度
  • union,连接过程中,将元素个数少的树挂载到元素个数多的树上,降低树的整体高度