Union Find data structure 又稱 disjoint set data structure。它是一個資料結構,用來儲存一堆 disjoint set。它提供兩個操作,一個是用來合併兩個 sets,另一個是用來尋找給定元素的 set。
Table of Contents
Union Find
Union Find data structure 中有一個叫 parents
的 array。它記錄著每一個元素歸屬的 set。一開始,每個元素自成一個 set。之後,透過呼叫 union() 來合併給定的兩個 sets。find() 回傳傳入元素的 set 編號。
public class UnionFind { private final int[] parents; public UnionFind(int size) { parents = new int[size]; for (int i = 0; i < size; i++) { parents[i] = i; } } int find(int x) { while (x != parents[x]) { parents[x] = parents[parents[x]]; x = parents[x]; } return x; } void union(int x, int y) { int parentX = find(x); int parentY = find(y); if (parentX < parentY) { parents[parentY] = parentX; } else if (parentX > parentY) { parents[parentX] = parentY; } } }
時間與空間複雜度
在一開始初始化 parents
時,需要的時間複雜度為 O(n),其中 n
為元素數量。
Find() 需要的時間複雜度為 O(α(n)),其中 α
是 inverse Ackermann function,它會成長非常地慢,所以可以將它視為常數時間。所以,O(α(n)) ≈ O(1)。因此,Find() 的時間複雜度為 O(1)。
Union() 使用到 Find(),所以它的時間複雜度是 O(1)。
Union Find data structure 內部需要一個 parents
。所以,它的空間複雜度為 O(n)。
範例
參考
- Ellis Horowitz, Sartaj Sahni, Sanguthevar Rajasekaran, Computer Algorithm.
- Disjoint-set data structure, Wikipedia.