版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
并查集路徑壓縮與按秩合并的實現(xiàn)一、并查集概述
并查集是一種樹型的數(shù)據(jù)結構,用于處理一些不交集的合并及查詢問題。其主要操作包括:
(一)查找操作:確定某個元素屬于哪個集合
(二)合并操作:將兩個集合合并為一個集合
二、并查集的實現(xiàn)原理
并查集的核心是維護一個父節(jié)點數(shù)組,通過路徑壓縮和按秩合并優(yōu)化性能。
(一)基本結構
1.父節(jié)點數(shù)組:`parent[i]`表示節(jié)點`i`的父節(jié)點
2.集合大小數(shù)組(按秩合并用):`rank[i]`表示以節(jié)點`i`為根的樹的高度
(二)按秩合并
按秩合并通過比較兩個根節(jié)點的秩來優(yōu)化樹的高度,具體步驟如下:
1.查找元素`x`的根節(jié)點`root(x)`
2.查找元素`y`的根節(jié)點`root(y)`
3.若`root(x)==root(y)`,無需合并
4.若`rank[root(x)]<rank[root(y)]`,將`root(x)`指向`root(y)`
5.若`rank[root(x)]>rank[root(y)]`,將`root(y)`指向`root(x)`
6.若`rank[root(x)]==rank[root(y)]`,將`root(y)`指向`root(x)`,并增加`rank[root(x)]`
(三)路徑壓縮
路徑壓縮通過遞歸或非遞歸方式將查詢路徑上的節(jié)點直接指向根節(jié)點,優(yōu)化后續(xù)查詢效率,具體步驟如下:
1.查找元素`x`的根節(jié)點`root(x)`
2.在查找過程中,將`x`的父節(jié)點更新為`root(x)`
3.返回`root(x)`
三、代碼實現(xiàn)
```python
classUnionFind:
def__init__(self,size):
self.parent=list(range(size))初始化父節(jié)點數(shù)組
self.rank=[1]size初始化秩數(shù)組
deffind(self,x):
ifself.parent[x]!=x:
self.parent[x]=self.find(self.parent[x])路徑壓縮
returnself.parent[x]
defunion(self,x,y):
root_x=self.find(x)
root_y=self.find(y)
ifroot_x==root_y:
return
ifself.rank[root_x]<self.rank[root_y]:
self.parent[root_x]=root_y
elifself.rank[root_x]>self.rank[root_y]:
self.parent[root_y]=root_x
else:
self.parent[root_y]=root_x
self.rank[root_x]+=1
四、性能分析
(一)時間復雜度
1.初始狀態(tài):所有操作為O(1)
2.路徑壓縮后:接近O(α(n)),α為阿克曼函數(shù)的反函數(shù)
3.按秩合并后:接近O(log(n))
(二)空間復雜度
O(n),用于存儲父節(jié)點和秩數(shù)組
五、應用場景
并查集適用于解決動態(tài)連通性問題,如:
1.圖的連通分量
2.離線最小生成樹算法
3.網(wǎng)絡游戲中的玩家分組
四、性能分析(續(xù))
(一)時間復雜度(續(xù))
1.初始狀態(tài)下的操作分析
在未進行任何優(yōu)化(即父節(jié)點直接指向其子節(jié)點,秩數(shù)組未使用)的情況下,并查集的合并和查找操作可能面臨性能瓶頸。
查找操作(Find):最壞情況下,需要遍歷整個樹的高度,時間復雜度為O(h),其中h為樹的高度。在極端情況下(所有節(jié)點構成一條鏈),h可能達到n(節(jié)點總數(shù)),導致查找操作退化為O(n)。
合并操作(Union):合并操作本身通常只涉及改變一個父節(jié)點指針,看似為O(1)。但查找操作是合并的前提,因此合并操作的總時間復雜度受限于查找操作,最壞情況下也為O(n)。
2.路徑壓縮(PathCompression)的優(yōu)化效果
路徑壓縮旨在顯著降低查找操作的平攤時間復雜度。其核心思想是在查找過程中,將沿途經(jīng)過的節(jié)點直接指向根節(jié)點。
實現(xiàn)方式:在遞歸查找`find(x)`時,如果發(fā)現(xiàn)`parent[x]!=x`,則將`parent[x]`更新為`find(parent[x])`(即直接指向根節(jié)點),然后返回`find(parent[x])`。
攤還分析:雖然單次查找的最壞情況仍可能為O(n),但根據(jù)阿克曼函數(shù)的反函數(shù)α(n)的性質(zhì),可以證明:對于任何節(jié)點x,經(jīng)過路徑壓縮后,其所有后代節(jié)點在未來進行的查找操作中,其路徑長度將接近于常數(shù)。這意味著雖然偶爾會出現(xiàn)較長的查找路徑,但平均下來,每次查找的攤還(Average-case)時間復雜度可以接近O(1)。α(n)增長非常緩慢,因此α(n)在實際中通常是一個非常小的常數(shù)(如對32位整數(shù),α(n)≤4)。
效果:引入路徑壓縮后,并查集的查找操作攤還時間復雜度降低至O(α(n)),合并操作的總時間復雜度也隨之降低。
3.按秩合并(UnionbyRank)的優(yōu)化效果
按秩合并旨在優(yōu)化合并操作,防止樹高度無限制增長,從而間接降低查找操作的時間。
秩(Rank)的定義與作用:`rank[i]`表示以節(jié)點`i`為根的樹的高度。在初始化時,通常令所有節(jié)點的秩為1(或0)。秩用于在合并時決定樹的連接方式。
合并策略:在執(zhí)行`union(x,y)`時,比較`rank[root(x)]`和`rank[root(y)]`:
情況1:`rank[root(x)]<rank[root(y)]`。將樹`root(x)`作為樹`root(y)`的子樹。操作:`parent[root(x)]=root(y)`。
情況2:`rank[root(x)]>rank[root(y)]`。將樹`root(y)`作為樹`root(x)`的子樹。操作:`parent[root(y)]=root(x)`。
情況3:`rank[root(x)]==rank[root(y)]`。任選一個根作為另一棵樹的父節(jié)點,并增加其秩。操作:`parent[root(y)]=root(x)`且`rank[root(x)]+=1`。
效果:按秩合并保證了合并后的樹的高度盡可能小。在每次合并操作中,樹的高度至多增加1(在秩相等時)。這導致樹的高度大致保持在O(logn)量級。因此,即使不使用路徑壓縮,按秩合并也能將查找操作的時間復雜度限制在O(logn)。結合路徑壓縮,并查集的整體性能非常出色。
(二)空間復雜度
1.存儲需求:并查集需要兩個主要的數(shù)據(jù)結構來維護信息:
父節(jié)點數(shù)組(`parent`):一個長度為n的數(shù)組,存儲每個節(jié)點的父節(jié)點索引。初始時,`parent[i]=i`。占用空間為O(n)。
秩數(shù)組(`rank`):一個長度為n的數(shù)組,存儲每個根節(jié)點對應的樹的高度。初始時,`rank[i]=1`(或0)。占用空間為O(n)。
2.總空間復雜度:由于父節(jié)點數(shù)組和秩數(shù)組均占用線性空間,因此并查集的總空間復雜度為O(n)。
五、應用場景(續(xù))
并查集因其高效處理動態(tài)連通性問題的能力,在多個領域有廣泛應用,以下列舉幾個典型場景:
(一)圖形算法
1.連通分量(ConnectedComponents):在無向圖中,判斷兩個頂點是否屬于同一連通分量。可以通過將每個頂點初始化為獨立的集合,然后根據(jù)邊的連接關系執(zhí)行合并操作,最終每個連通分量由一個代表元(根節(jié)點)唯一標識。
2.最小生成樹(MinimumSpanningTree,MST):某些基于并查集的最小生成樹算法,如Kruskal算法,在處理邊的連通性檢查時使用并查集。每次選擇一條邊時,檢查其兩個頂點是否屬于同一集合,若否則合并,這樣就能確保生成的樹是無環(huán)的。按秩合并在此場景中尤為重要,因為它能保證MST算法的效率。
(二)數(shù)據(jù)結構構建
1.不相交集合數(shù)據(jù)結構:并查集本身就是一種核心的不相交集合數(shù)據(jù)結構,用于模擬動態(tài)的集合合并與查詢操作。
(三)網(wǎng)絡問題
1.網(wǎng)絡連通性管理:在網(wǎng)絡拓撲中,管理不同網(wǎng)絡設備或節(jié)點的連通狀態(tài),動態(tài)地添加或刪除連接(邊),并快速查詢?nèi)我鈨蓚€節(jié)點是否連通。
(四)地理信息系統(tǒng)(GIS)
1.區(qū)域合并:在地圖上,根據(jù)地理邊界(如道路連接)動態(tài)合并相鄰區(qū)域,判斷區(qū)域是否相鄰或屬于同一區(qū)域。
(五)游戲開發(fā)
1.游戲地圖與尋路:在游戲地圖中管理地塊的連通性,例如,草地和草地相連,草地和道路相連,但道路和道路不一定相連。并查集可以快速判斷兩點是否可通過游戲角色直接移動。
2.玩家分組或聯(lián)盟:在多人在線游戲中,動態(tài)管理玩家之間的聯(lián)盟關系,合并或拆分聯(lián)盟。
六、實現(xiàn)細節(jié)與注意事項
(一)初始化
1.父節(jié)點數(shù)組初始化:`parent=[iforiinrange(n)]`,其中n是元素總數(shù)。每個元素自成一個集合,其父節(jié)點指向自己。
2.秩數(shù)組初始化:`rank=[1]n`或`rank=[0]n`。通常初始化為1,因為每個節(jié)點初始時視為一棵只有自己的樹。
(二)查找操作的遞歸與非遞歸實現(xiàn)
1.遞歸實現(xiàn)(含路徑壓縮):
```python
deffind(self,x):
ifself.parent[x]!=x:
self.parent[x]=self.find(self.parent[x])路徑壓縮
returnself.parent[x]
```
優(yōu)點:代碼簡潔。
缺點:在極端情況下(所有節(jié)點形成一條長鏈),遞歸深度可能達到n,對??臻g有要求。
2.非遞歸實現(xiàn)(含路徑壓縮):
```python
deffind(self,x):
非遞歸路徑壓縮(路徑halving)
orig=x
whileself.parent[x]!=x:
x=self.parent[x]
路徑halving的另一種寫法
whileself.parent[orig]!=orig:
orig,self.parent[orig]=self.parent[orig],x
returnx
```
優(yōu)點:避免了棧溢出的風險。
缺點:代碼相對遞歸實現(xiàn)稍復雜。兩種實現(xiàn)都能達到O(α(n))的攤還復雜度。
(三)秩的更新時機
1.合并操作時更新:在`union(x,y)`函數(shù)中,只有在秩相等且需要將一棵樹連接到另一棵樹時(即`rank[root(x)]==rank[root(y)]`且選擇將`root(x)`連接到`root(y)`),才執(zhí)行`rank[root(x)]+=1`。這確保了秩的增長是合理的,且樹的高度被有效控制。
(四)數(shù)據(jù)類型選擇
1.索引類型:父節(jié)點數(shù)組和秩數(shù)組通常使用整數(shù)索引,范圍從0到n-1。
2.性能考量:在某些高級應用中,可能需要處理更復雜的標識符(如字符串或自定義對象),這時通常需要建立一個映射(如哈希表)將標識符映射到內(nèi)部索引,但這會增加實現(xiàn)的復雜度和空間開銷。在基礎實現(xiàn)中,使用整數(shù)索引最簡單高效。
一、并查集概述
并查集是一種樹型的數(shù)據(jù)結構,用于處理一些不交集的合并及查詢問題。其主要操作包括:
(一)查找操作:確定某個元素屬于哪個集合
(二)合并操作:將兩個集合合并為一個集合
二、并查集的實現(xiàn)原理
并查集的核心是維護一個父節(jié)點數(shù)組,通過路徑壓縮和按秩合并優(yōu)化性能。
(一)基本結構
1.父節(jié)點數(shù)組:`parent[i]`表示節(jié)點`i`的父節(jié)點
2.集合大小數(shù)組(按秩合并用):`rank[i]`表示以節(jié)點`i`為根的樹的高度
(二)按秩合并
按秩合并通過比較兩個根節(jié)點的秩來優(yōu)化樹的高度,具體步驟如下:
1.查找元素`x`的根節(jié)點`root(x)`
2.查找元素`y`的根節(jié)點`root(y)`
3.若`root(x)==root(y)`,無需合并
4.若`rank[root(x)]<rank[root(y)]`,將`root(x)`指向`root(y)`
5.若`rank[root(x)]>rank[root(y)]`,將`root(y)`指向`root(x)`
6.若`rank[root(x)]==rank[root(y)]`,將`root(y)`指向`root(x)`,并增加`rank[root(x)]`
(三)路徑壓縮
路徑壓縮通過遞歸或非遞歸方式將查詢路徑上的節(jié)點直接指向根節(jié)點,優(yōu)化后續(xù)查詢效率,具體步驟如下:
1.查找元素`x`的根節(jié)點`root(x)`
2.在查找過程中,將`x`的父節(jié)點更新為`root(x)`
3.返回`root(x)`
三、代碼實現(xiàn)
```python
classUnionFind:
def__init__(self,size):
self.parent=list(range(size))初始化父節(jié)點數(shù)組
self.rank=[1]size初始化秩數(shù)組
deffind(self,x):
ifself.parent[x]!=x:
self.parent[x]=self.find(self.parent[x])路徑壓縮
returnself.parent[x]
defunion(self,x,y):
root_x=self.find(x)
root_y=self.find(y)
ifroot_x==root_y:
return
ifself.rank[root_x]<self.rank[root_y]:
self.parent[root_x]=root_y
elifself.rank[root_x]>self.rank[root_y]:
self.parent[root_y]=root_x
else:
self.parent[root_y]=root_x
self.rank[root_x]+=1
四、性能分析
(一)時間復雜度
1.初始狀態(tài):所有操作為O(1)
2.路徑壓縮后:接近O(α(n)),α為阿克曼函數(shù)的反函數(shù)
3.按秩合并后:接近O(log(n))
(二)空間復雜度
O(n),用于存儲父節(jié)點和秩數(shù)組
五、應用場景
并查集適用于解決動態(tài)連通性問題,如:
1.圖的連通分量
2.離線最小生成樹算法
3.網(wǎng)絡游戲中的玩家分組
四、性能分析(續(xù))
(一)時間復雜度(續(xù))
1.初始狀態(tài)下的操作分析
在未進行任何優(yōu)化(即父節(jié)點直接指向其子節(jié)點,秩數(shù)組未使用)的情況下,并查集的合并和查找操作可能面臨性能瓶頸。
查找操作(Find):最壞情況下,需要遍歷整個樹的高度,時間復雜度為O(h),其中h為樹的高度。在極端情況下(所有節(jié)點構成一條鏈),h可能達到n(節(jié)點總數(shù)),導致查找操作退化為O(n)。
合并操作(Union):合并操作本身通常只涉及改變一個父節(jié)點指針,看似為O(1)。但查找操作是合并的前提,因此合并操作的總時間復雜度受限于查找操作,最壞情況下也為O(n)。
2.路徑壓縮(PathCompression)的優(yōu)化效果
路徑壓縮旨在顯著降低查找操作的平攤時間復雜度。其核心思想是在查找過程中,將沿途經(jīng)過的節(jié)點直接指向根節(jié)點。
實現(xiàn)方式:在遞歸查找`find(x)`時,如果發(fā)現(xiàn)`parent[x]!=x`,則將`parent[x]`更新為`find(parent[x])`(即直接指向根節(jié)點),然后返回`find(parent[x])`。
攤還分析:雖然單次查找的最壞情況仍可能為O(n),但根據(jù)阿克曼函數(shù)的反函數(shù)α(n)的性質(zhì),可以證明:對于任何節(jié)點x,經(jīng)過路徑壓縮后,其所有后代節(jié)點在未來進行的查找操作中,其路徑長度將接近于常數(shù)。這意味著雖然偶爾會出現(xiàn)較長的查找路徑,但平均下來,每次查找的攤還(Average-case)時間復雜度可以接近O(1)。α(n)增長非常緩慢,因此α(n)在實際中通常是一個非常小的常數(shù)(如對32位整數(shù),α(n)≤4)。
效果:引入路徑壓縮后,并查集的查找操作攤還時間復雜度降低至O(α(n)),合并操作的總時間復雜度也隨之降低。
3.按秩合并(UnionbyRank)的優(yōu)化效果
按秩合并旨在優(yōu)化合并操作,防止樹高度無限制增長,從而間接降低查找操作的時間。
秩(Rank)的定義與作用:`rank[i]`表示以節(jié)點`i`為根的樹的高度。在初始化時,通常令所有節(jié)點的秩為1(或0)。秩用于在合并時決定樹的連接方式。
合并策略:在執(zhí)行`union(x,y)`時,比較`rank[root(x)]`和`rank[root(y)]`:
情況1:`rank[root(x)]<rank[root(y)]`。將樹`root(x)`作為樹`root(y)`的子樹。操作:`parent[root(x)]=root(y)`。
情況2:`rank[root(x)]>rank[root(y)]`。將樹`root(y)`作為樹`root(x)`的子樹。操作:`parent[root(y)]=root(x)`。
情況3:`rank[root(x)]==rank[root(y)]`。任選一個根作為另一棵樹的父節(jié)點,并增加其秩。操作:`parent[root(y)]=root(x)`且`rank[root(x)]+=1`。
效果:按秩合并保證了合并后的樹的高度盡可能小。在每次合并操作中,樹的高度至多增加1(在秩相等時)。這導致樹的高度大致保持在O(logn)量級。因此,即使不使用路徑壓縮,按秩合并也能將查找操作的時間復雜度限制在O(logn)。結合路徑壓縮,并查集的整體性能非常出色。
(二)空間復雜度
1.存儲需求:并查集需要兩個主要的數(shù)據(jù)結構來維護信息:
父節(jié)點數(shù)組(`parent`):一個長度為n的數(shù)組,存儲每個節(jié)點的父節(jié)點索引。初始時,`parent[i]=i`。占用空間為O(n)。
秩數(shù)組(`rank`):一個長度為n的數(shù)組,存儲每個根節(jié)點對應的樹的高度。初始時,`rank[i]=1`(或0)。占用空間為O(n)。
2.總空間復雜度:由于父節(jié)點數(shù)組和秩數(shù)組均占用線性空間,因此并查集的總空間復雜度為O(n)。
五、應用場景(續(xù))
并查集因其高效處理動態(tài)連通性問題的能力,在多個領域有廣泛應用,以下列舉幾個典型場景:
(一)圖形算法
1.連通分量(ConnectedComponents):在無向圖中,判斷兩個頂點是否屬于同一連通分量??梢酝ㄟ^將每個頂點初始化為獨立的集合,然后根據(jù)邊的連接關系執(zhí)行合并操作,最終每個連通分量由一個代表元(根節(jié)點)唯一標識。
2.最小生成樹(MinimumSpanningTree,MST):某些基于并查集的最小生成樹算法,如Kruskal算法,在處理邊的連通性檢查時使用并查集。每次選擇一條邊時,檢查其兩個頂點是否屬于同一集合,若否則合并,這樣就能確保生成的樹是無環(huán)的。按秩合并在此場景中尤為重要,因為它能保證MST算法的效率。
(二)數(shù)據(jù)結構構建
1.不相交集合數(shù)據(jù)結構:并查集本身就是一種核心的不相交集合數(shù)據(jù)結構,用于模擬動態(tài)的集合合并與查詢操作。
(三)網(wǎng)絡問題
1.網(wǎng)絡連通性管理:在網(wǎng)絡拓撲中,管理不同網(wǎng)絡設備或節(jié)點的連通狀態(tài),動態(tài)地添加或刪除連接(邊),并快速查詢?nèi)我鈨蓚€節(jié)點是否連通。
(四)地理信息系統(tǒng)(GIS)
1.區(qū)域合并:在地圖上,根據(jù)地理邊界(如道路連接)動態(tài)合并相鄰區(qū)域,判斷區(qū)域是否相鄰或屬于同一區(qū)域。
(五)游戲開發(fā)
1.游戲地圖與尋路:在游戲地圖中管理地塊的連通性,例如,草地和草地相連,草地和道路相連,但道路和道路不一定相連。并查集可以快速判斷兩點是否可通過游戲角色直接移動。
2.玩家分組或聯(lián)盟:在多人在線游戲中,動態(tài)管理玩家之間的聯(lián)盟關系,合并或拆分聯(lián)盟。
六、實現(xiàn)細節(jié)與注意事項
(一)初始化
1.父節(jié)點數(shù)組初始化:`parent=[iforiinrange(n)]`,其中n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 客戶關系專員招聘面試題
- 2025海南??谑兄嗅t(yī)醫(yī)院(考核)招聘事業(yè)單位人員(第七號)考試筆試備考試題及答案解析
- 銷售人員面試必考題與應對方法
- 餐飲企業(yè)店長面試題與解答
- 防雷測試員安全操作規(guī)程
- 2025貴州水投水庫運營管理黔東南有限公司第二次招聘筆試考試參考試題及答案解析
- 南方航空乘面試技巧與問題集
- 2025-2026廣東佛山里水中學教師招聘考試筆試模擬試題及答案解析
- 工程造價崗位實操與面試問題集
- 航空業(yè)客服經(jīng)理的招聘考試題目
- 【MOOC期末】《模擬電子技術基礎》(華中科技大學)期末考試慕課答案
- 腦炎的護理課件
- 胎頭吸引技術課件
- 電池PACK箱體項目可行性研究報告(備案審核模板)
- 貴州省2023年7月普通高中學業(yè)水平合格性考試地理試卷(含答案)
- 實施“十五五”規(guī)劃的發(fā)展思路
- 資金無償贈予協(xié)議書
- 課件王思斌:社會工作概論
- 2025年度交通運輸安全生產(chǎn)費用使用計劃
- 防水工程驗收單
- 2025年高考數(shù)學總復習《立體幾何》專項測試卷及答案
評論
0/150
提交評論