並查集-理論知識

概念

並查集(union & find)是一種樹形數據結構,用於處理不交集的查找和合並。數組

find:肯定元素屬於哪一個子集;判斷兩個元素是否屬於同一個子集。數據結構

union:合併兩個子集。優化

拆分複雜,一般不支持也不經常使用拆分。ui

做用

幫派識別spa

數據結構實現和代碼

數組code

public class QuickUnionUF {

    private int[] roots;

    public QuickUnionUF(int N) {
        roots = new int[N];
        for (int i = 0; i < N; i++) {
            roots[i] = i;
        }
    }
}
複製代碼

roots[i] = i 表示節點上級爲本身it

僞代碼以下io

function MakeSet(x) x.root := x function Find(x) if x.root := x return x else return Find(x.root) function Union(x, y) xRoot := Find(x)
        yRoot := Find(y)
        xRoot.root = yRoot
複製代碼

兩種優化方式

  1. 合併的時候減小樹的深度(rank),把深度低的子集merge到深度高的子集上
function MakeSet(x) x.root := x
        x.rank := 0
        
    function Union(x, y) xRoot := Find(x)
        yRoot := Find(y)
        if yRoot.rank > xRoot.rank
            xRoot.root := yRoot
        else if yRoot.rank < xRoot.rank
            yRoot.root := xRoot
        else
            xRoot.root := yRoot
            yRoot.rank := yRoot.rank + 1
複製代碼
  1. 路徑壓縮,直接找到最大的老大賦值爲直接上級
public int Find(int x) {
        int root = x;
        while (root != roots[root]) root = roots[root];
        
        while (x != roots[x]) {
            int tmp = roots[x];roots[x] = root;x = tmp;
        }
        return root;
    }
複製代碼
相關文章
相關標籤/搜索