成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一分鐘說清楚并查集

開發 開發工具 前端
分離集合(disjoint set)是一種經典的數據結構,它有三類操作,它非常適合用來解決集合合并與查找的問題,也常稱為并查集。

分離集合(disjoint set)是一種經典的數據結構,它有三類操作:

  • Make-set(a):生成包含一個元素a的集合S;
  • Union(X, Y):合并兩個集合X和Y;
  • Find-set(a):查找元素a所在集合S,即通過元素找集合句柄;

它非常適合用來解決集合合并與查找的問題,也常稱為并查集。

[[250832]]

一、并查集的鏈表實現

并查集的鏈表實現

如上圖,并查集可以用鏈表來實現。

(1) 鏈表實現的并查集,Find-set(a)的時間復雜度是多少?

集合里的每個元素,都指向“集合的句柄”,這樣可以使得“查找元素a所在集合S”,即Find-set(a)操作在O(1)的時間內完成。

(2) 鏈表實現的并查集,Union(X, Y)的時間復雜度是多少?

假設有集合:

  1. S1={7,3,1,4} 
  2. S2={1,6} 

合并S1和S2兩個集合,需要做兩件事情:

  • ***個集合的尾元素,鏈向第二個集合的頭元素(藍線1);
  • 第二個集合的所有元素,指向***個集合的句柄(藍線2,3);

合并完的效果是:

變成了一個更大的集合S1。

集合合并時,將短的鏈表,往長的鏈表上接,這樣變動的元素更少,這個優化叫做“加權合并”。

畫外音:實現的過程中,集合句柄要存儲元素個數,頭元素,尾元素等屬性,以方便上述操作進行。

假設每個集合的平均元素個數是n,Union(X, Y)操作的時間復雜度是O(n)。

(3) 能不能Find-set(a)與Union(X, Y)都在O(1)的時間內完成呢?

可以,這就引發了并查集的第二種實現方法。

二、并查集的有根樹實現

(1) 什么是有根樹,和普通的樹有什么不同?

常用的set,就是用普通的二叉樹實現的,其元素的數據結構是:

  1. element{ 
  2.          int data; 
  3.          element* left; 
  4.          element* right; 

通過左指針與右指針,父親節點指向兒子節點。

而有根樹,其元素的數據結構是:

  1. element{ 
  2.          int data; 
  3.          element* parent; 

通過兒子節點,指向父親節點。

假設有集合:

  1. S1={7,3,1,4} 
  2. S2={1,6} 

通過如果通過有根樹表示,可能是這樣的:

所有的元素,都通過parent指針指向集合句柄,所有元素的Find-set(a)的時間復雜度也是O(1)。

畫外音:假設集合的***元素,代表集合句柄。

(2) 有根樹實現的并查集,Union(X, Y)的過程如何?時間復雜度是多少?

通過有根樹實現并查集,集合合并時,直接將一個集合句柄,指向另一個集合即可。

如上圖所示,S2的句柄,指向S1的句柄,集合合并完成:S2消亡,S1變為了更大的集合。

容易知道,集合合并的時間復雜度為O(1)。

會發現,集合合并之后,有根樹的高度變高了,與“加權合并”的優化思路類似,總是把節點數少的有根樹,指向節點數多的有根樹(更確切的說,是高度矮的樹,指向高度高的樹),這個優化叫做“按秩合并”。

(3) 新的問題來了,集合合并之后,不是所有元素的Find-set(a)操作都是O(1)了,怎么辦?

如圖S1與S2合并后的新S1,***“通過元素6來找新S1的句柄”,不能在O(1)的時間內完成了,需要兩次操作。

但為了讓未來“通過元素6來找新S1的句柄”的操作能夠在O(1)的時間內完成,在***進行Find-set(“6”)時,就要將元素6“尋根”路徑上的所有元素,都指向集合句柄,如下圖。

某個元素如果不直接指向集合句柄,***Find-set(a)操作的過程中,會將該路徑上的所有元素都直接指向句柄,這個優化叫做“路徑壓縮”。

畫外音:路徑上的元素第二次執行Find-set(a)時,時間復雜度就是O(1)了。

實施“路徑壓縮”優化之后,Find-set的平均時間復雜度仍是O(1)。

結論

通過鏈表實現并查集:

  • Find-set的時間復雜度,是O(1)常數時間
  • Union的時間復雜度,是集合平均元素個數,即線性時間

畫外音:別忘了“加權合并”優化。

通過有根樹實現并查集:

  • Union的時間復雜度,是O(1)常數時間
  • Find-set的時間復雜度,通過“按秩合并”與“路徑壓縮”優化后,平均時間復雜度也是O(1)

使用并查集,非常適合解決“微信群覆蓋”問題。

思路比結論重要,有收獲就是好的。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-02-11 08:08:09

Spring Boot配置架構

2017-03-30 19:28:26

HBase分布式數據

2017-02-21 13:00:27

LoadAverage負載Load

2018-07-31 16:10:51

Redo Undo數據庫數據

2018-06-26 05:23:19

線程安全函數代碼

2017-07-06 08:12:02

索引查詢SQL

2020-05-21 19:46:19

區塊鏈數字貨幣比特幣

2022-07-18 06:16:07

單點登錄系統

2018-12-12 22:51:24

Java包裝語言

2020-07-17 07:44:25

云計算邊緣計算IT

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2011-02-21 17:48:35

vsFTPd

2020-06-11 08:04:12

WDMDWDMMWDM

2013-11-15 07:24:50

4G LTE圖解

2015-11-12 10:32:40

GitHub控制系統分布式

2016-12-16 11:05:00

分布式互斥線程

2021-08-06 08:50:45

加密貨幣比特幣區塊鏈

2018-03-27 09:28:33

緩存策略系統

2018-06-26 10:52:45

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线h| 999久久久久久久久6666 | 综合久久网 | 日本免费网 | 亚洲精品久久久久久一区二区 | 精品国产91 | 欧美人妇做爰xxxⅹ性高电影 | 国产精品视频观看 | 欧美黑人一区二区三区 | 亚洲高清在线 | 有码一区 | 91精品国产91久久久久游泳池 | 日韩成人在线观看 | 欧美日韩在线一区二区 | 国产一区二区影院 | 天天影视亚洲综合网 | 成人依人 | 久草视频观看 | 中文在线观看视频 | 免费观看www7722午夜电影 | 北条麻妃99精品青青久久主播 | 国产91精品久久久久久久网曝门 | 国产一区久久精品 | 欧美视频第二页 | 中文字幕在线免费观看 | 中文字幕在线观看第一页 | 一区二区国产在线观看 | 麻豆精品国产91久久久久久 | 亚洲成av | 成人午夜精品 | 男女视频在线观看免费 | 亚洲一区二区在线 | 国产精品一区在线观看你懂的 | 免费中文字幕日韩欧美 | 中文在线www | 日韩精品在线观看视频 | 一区二区三区在线免费观看 | 日本黄色片免费在线观看 | 成人欧美一区二区三区黑人孕妇 | 国产玖玖| 成人免费视频网站 |