Python并查集Disjoint?Set的具體使用
并查集是一種用于處理集合的數(shù)據(jù)結(jié)構(gòu),它主要支持兩種操作:合并兩個(gè)集合和查找一個(gè)元素所屬的集合。在本文中,我們將深入講解Python中的并查集,包括并查集的基本概念、實(shí)現(xiàn)方式、路徑壓縮和應(yīng)用場(chǎng)景,并使用代碼示例演示并查集的操作。
基本概念
并查集由一個(gè)森林(Forest)組成,每個(gè)節(jié)點(diǎn)表示一個(gè)元素,每個(gè)節(jié)點(diǎn)有一個(gè)指向父節(jié)點(diǎn)的指針,根節(jié)點(diǎn)的父節(jié)點(diǎn)指向自己。樹的根節(jié)點(diǎn)即為集合的代表元素,用于表示集合。
并查集主要有兩個(gè)操作:
- 合并(Union):將兩個(gè)不相交的集合合并成一個(gè)集合,即將一個(gè)集合的根節(jié)點(diǎn)的父節(jié)點(diǎn)指向另一個(gè)集合的根節(jié)點(diǎn)。
- 查詢(Find):查找一個(gè)元素所屬的集合,即返回該元素所在樹的根節(jié)點(diǎn)。
1. 并查集的表示
并查集通常使用樹來(lái)表示集合,其中每個(gè)節(jié)點(diǎn)表示一個(gè)元素,樹的根節(jié)點(diǎn)表示集合的代表元素。
class DisjointSet:
def __init__(self, size):
self.parent = [i for i in range(size)]
self.rank = [0] * size
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x]) # 路徑壓縮
return self.parent[x]
def union(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_x] = root_y
self.rank[root_y] += 1
# 示例
disjoint_set = DisjointSet(5)
disjoint_set.union(0, 1)
disjoint_set.union(1, 2)
disjoint_set.union(3, 4)
2. 路徑壓縮
路徑壓縮是通過(guò)在 find 操作中將節(jié)點(diǎn)直接連接到根節(jié)點(diǎn)來(lái)優(yōu)化并查集的性能。它減小了樹的高度,使得后續(xù)的 find 操作更快。
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x]) # 路徑壓縮
return self.parent[x]
應(yīng)用場(chǎng)景
并查集常用于解決集合的合并和查找問(wèn)題,例如:
- 網(wǎng)絡(luò)連接問(wèn)題: 判斷網(wǎng)絡(luò)中的節(jié)點(diǎn)是否連通。
- 社交網(wǎng)絡(luò)中的關(guān)系: 判斷兩個(gè)人是否屬于同一個(gè)社交圈。
- 圖的連通性問(wèn)題: 判斷圖中的節(jié)點(diǎn)是否在同一個(gè)連通分量中。
代碼示例:解決網(wǎng)絡(luò)連接問(wèn)題
def are_nodes_connected(disjoint_set, node1, node2):
return disjoint_set.find(node1) == disjoint_set.find(node2)
# 示例
disjoint_set_network = DisjointSet(10)
disjoint_set_network.union(0, 1)
disjoint_set_network.union(1, 2)
disjoint_set_network.union(3, 4)
print(are_nodes_connected(disjoint_set_network, 0, 2)) # 輸出: True
print(are_nodes_connected(disjoint_set_network, 0, 3)) # 輸出: False
總結(jié)
并查集是一種用于處理集合的高效數(shù)據(jù)結(jié)構(gòu),通過(guò)路徑壓縮和按秩合并等優(yōu)化策略,可以在常數(shù)時(shí)間內(nèi)執(zhí)行合并和查找操作。在Python中,可以通過(guò)類似上述示例的代碼實(shí)現(xiàn)簡(jiǎn)單而有效的并查集。理解并查集的基本概念、實(shí)現(xiàn)方式和應(yīng)用場(chǎng)景,將有助于更好地應(yīng)用并查集解決實(shí)際問(wèn)題。
這種數(shù)據(jù)結(jié)構(gòu)常被用于解決圖論中的連通性問(wèn)題,同時(shí)在網(wǎng)絡(luò)連接、社交網(wǎng)絡(luò)分析等場(chǎng)景中也有著廣泛的應(yīng)用。在實(shí)際問(wèn)題中,通過(guò)并查集,我們能夠高效地管理和處理不同元素之間的關(guān)系,提高算法的效率和性能。
到此這篇關(guān)于Python并查集Disjoint Set的具體使用的文章就介紹到這了,更多相關(guān)Python并查集Disjoint Set內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳細(xì)整理python 字符串(str)與列表(list)以及數(shù)組(array)之間的轉(zhuǎn)換方法
這篇文章主要介紹了詳細(xì)整理python 字符串(str)與列表(list)以及數(shù)組(array)之間的轉(zhuǎn)換方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python進(jìn)程和線程之多線程的使用及說(shuō)明
Python多線程通過(guò)threading模塊實(shí)現(xiàn),主線程默認(rèn)運(yùn)行,子線程由Thread類創(chuàng)建并啟動(dòng),線程共享變量易引發(fā)數(shù)據(jù)混亂,需用Lock同步,但鎖可能降低效率或?qū)е滤梨i,(79字)2025-09-09
Python利用Beautiful Soup模塊搜索內(nèi)容詳解
這篇文章主要給大家介紹了python中 Beautiful Soup 模塊的搜索方法函數(shù)。 方法不同類型的過(guò)濾參數(shù)能夠進(jìn)行不同的過(guò)濾,得到想要的結(jié)果。文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
深入淺析Python中l(wèi)ist的復(fù)制及深拷貝與淺拷貝
這篇文章主要介紹了Python中l(wèi)ist的復(fù)制及深拷貝與淺拷貝及區(qū)別解析 ,需要的朋友可以參考下2018-09-09
pytorch 圖像預(yù)處理之減去均值,除以方差的實(shí)例
今天小編就為大家分享一篇pytorch 圖像預(yù)處理之減去均值,除以方差的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python極簡(jiǎn)代碼實(shí)現(xiàn)楊輝三角示例代碼
楊輝三角形因?yàn)槠湫问胶?jiǎn)單,又有一定的使用價(jià)值,因此是入門編程題中被用的最多的,也是很好的語(yǔ)言實(shí)例標(biāo)的。這篇文章就給大家介紹了Python極簡(jiǎn)代碼實(shí)現(xiàn)楊輝三角的方法,文章給出了詳細(xì)的示例代碼和解釋,對(duì)大家理解很有幫助,感興趣的朋友們下面來(lái)一起看看吧。2016-11-11
理解Django 中Call Stack機(jī)制的小Demo
這篇文章主要介紹了理解Django 中Call Stack 機(jī)制的小Demo,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

