資料結構之並查集Union-Find Sets_資料結構

來源:互聯網
上載者:User
1、  概述

並查集(Disjoint set或者Union-find set)是一種樹型的資料結構,常用於處理一些不相交集合(Disjoint Sets)的合并及查詢問題。

2、  基本操作

並查集是一種非常簡單的資料結構,它主要涉及兩個基本操作,分別為:

A. 合并兩個不相交集合

B. 判斷兩個元素是否屬於同一個集合

(1)       合并兩個不相交集合(Union(x,y))

合併作業很簡單:先設定一個數組Father[x],表示x的“父親”的編號。那麼,合并兩個不相交集合的方法就是,找到其中一個集合最父親的父親(也就是最久遠的祖先),將另外一個集合的最久遠的祖先的父親指向它。

上圖為兩個不相交集合,b圖為合并後Father(b):=Father(g)

(2)       判斷兩個元素是否屬於同一集合(Find_Set(x))

本操作可轉換為尋找兩個元素的最久遠祖先是否相同。可以採用遞迴實現。

3、  最佳化

(1)       Find_Set(x)時,路徑壓縮

尋找祖先時,我們一般採用遞迴尋找,但是當元素很多亦或是整棵樹變為一條鏈時,每次Find_Set(x)都是O(n)的複雜度。為了避免這種情況,我們需對路徑進行壓縮,即當我們經過”遞推”找到祖先節點後,”回溯”的時候順便將它的子孫節點都直接指向祖先,這樣以後再次Find_Set(x)時複雜度就變成O(1)了,如下圖所示。可見,路徑壓縮方便了以後的尋找。

(2)       Union(x,y)時,按秩合并

即合并的時候將元素少的集合合并到元素多的集合中,這樣合并之後樹的高度會相對較小。

4、  編程實現 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.