并查集 - UnionFind

基本概念

并查集能高效的查找兩個(gè)元素是否在一個(gè)集合,而且能高效的合并兩個(gè)集合。

  • 使用樹結(jié)構(gòu)(Tree)來表示集合元素之間的關(guān)系
    每個(gè)元素是樹中的一個(gè)節(jié)點(diǎn)
    同一個(gè)集合的兩個(gè)元素在同一個(gè)樹上(有相同的root節(jié)點(diǎn))
    不在同一集合的兩個(gè)元素在不同樹上(不同的root節(jié)點(diǎn))
    初始狀態(tài),每個(gè)節(jié)點(diǎn)為一棵樹
  • 路徑壓縮算法
    用于find操作的時(shí)間優(yōu)化
    每個(gè)元素只關(guān)注其root節(jié)點(diǎn)
    每次查找時(shí),將元素連接到root節(jié)點(diǎn)

實(shí)現(xiàn)

  • 查找 (Find)
    時(shí)間復(fù)雜度為O(log*n),幾乎是O(1)
    給一個(gè)元素,返回它的root節(jié)點(diǎn)
  • 合并(Union)
    時(shí)間復(fù)雜度:O(1)
    把兩個(gè)元素所在的集合合并
class UnionFindSet {
    public int[] father;
    public UnionFindSet(int size) {
        father = new int[size];
        for(int i = 0; i < size; i++) {
            father[i] = i;
        }
    }
    public int find(int x) {
        if (father[x] == x) {
            return x;
        } else {
            return father[x] = find(father[x]);
        }
    }
    public void union(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if (rootA != rootB) {
            father[rootA] = rootB;
        }
    }
}

Lintcode 相關(guān)練習(xí)

Connecting Graph
Connecting Graph II
Connecting Graph III
Number of Islands
Number of Islands II
Graph Valid Tree
Minimum Spanning Tree
Driving problem

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容