資料結構學習 並查集講解(思路,時間複雜度)

2021-07-09 04:24:34 字數 3940 閱讀 6492

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

70

71

72

73

74

75

76

77

78

79

intfather[max];/* father[x]表示x的父節點*/

intrank[max];/*rank[x]表示x的秩*/

voidmake_set(intx)

/* 查詢x元素所在的集合,回溯時壓縮路徑*/

intfind_set(intx)

returnfather[x];

}

/*

按秩合併x,y所在的集合

下面的那個if else結構不是絕對的,具體根據情況變化

但是,宗旨是不變的即,按秩合併,實時更新秩。

*/

voidunion(intx,inty)

else

father[x] = y;

}

}

5、  複雜度分析

空間複雜度為o(n),建立乙個集合的時間複雜度為o(1),n次合併m查詢的時間複雜度為o(m alpha(n)),這裡alpha是ackerman函式的某個反函式,在很大的範圍內(人類目前觀測到的宇宙範圍估算有10的80次方個原子,這小於前面所說的範圍)這個函式的值可以看成是不大於4的,所以並查集的操作可以看作是線性的。具體複雜度分析過程見參考資料(3)。

6、  應用

並查集常作為另一種複雜的資料結構或者演算法的儲存結構。常見的應用有:求無向圖的連通分量個數,最近公共祖先(lca),帶限制的作業排序,實現kruskar演算法求最小生成樹等。

7、  參考資料

(1)       並查集:

(2)       博文《並查集詳解》:

(3)       thomas h. cormen, charles e. leiserson, ronald l. rivest, and clifford stein. introduction to algorithms, second edition. mit press and mcgraw-hill, 2001. isbn 0-262-03293-7. chapter 21: data structures for disjoint sets, pp. 498–524.

更多關於資料結構和演算法的介紹,請檢視:資料結構與演算法彙總

,作者介紹:

本部落格的文章集合:

資料結構 並查集

並查集,顧名思義,合併 查詢 集合 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。對於概念等等的這裡不再贅述,直接講解應用。應用1 判斷圖中有多少聯通分量 或者圖是否聯通 聯通分量 1 hdu 1213 應用2 判斷圖是否...

資料結構 並查集

time limit 1000ms memory limit 65536k 某城市有n個人,現在給定關於n個人的m條資訊,m條資訊是兩個人在同乙個小區,根據所給資訊,判斷這個城市最多可能有多少個小區。n個人編號為1 n。多組輸入。每組第一行有兩個整數n,m 2 n 50000,0 m n 2 接下來...

資料結構 並查集

一 基本概念 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。在一些有n個元素的集合應用問題中,通常是在開始時讓每個元素構成乙個單元素的...