這篇文章主要介紹“C++并查集怎么實現(xiàn)”,在日常操作中,相信很多人在C++并查集怎么實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++并查集怎么實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)六安免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。并查集 是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相加集合的合并和查詢問題。在使用中常常以森林來表示。 并查集也是用來維護集合的,和前面學(xué)習(xí)的set不同之處在于,并查集能很方便地同時維護很多集合。如果用set來維護會非常的麻煩。并查集的核心思想是記錄每個結(jié)點的父親結(jié)點是哪個結(jié)點。
并查集是一種多叉樹,用于處理不相交的集合的合并與查詢問題(判斷)。
通俗理解:在日常生活中,我們會因為某個人是自己的朋友,哪怕是朋友的朋友也是有朋友,會給予通融、 偏袒。而并查集的基本概念,就是判斷某兩個集合是否是“朋友”關(guān)系,并讓兩個集合成為“朋友”
初始化:每個結(jié)點單獨作為一個集合
查詢:求元素所在的集合的代表元素,即根結(jié)點
合并:將兩個元素所在的集合,合并為一個集合
合并之前,應(yīng)先判斷兩個元素是否屬于同一集合,用上面的“查詢”來實現(xiàn)
初始化:初始的時候每個結(jié)點各自為一個集合,father[i]表示結(jié)點 i 的父親結(jié)點,如果 father[i]=i,我們認為這個結(jié)點是當(dāng)前集合根結(jié)點(開始時每個節(jié)點根節(jié)點是他自己)。
void init() { for (int i = 1; i <= n; ++i) { father[i] = i; } }
查找:查找結(jié)點所在集合的根結(jié)點,結(jié)點 x 的根結(jié)點必然也是其父親結(jié)點的根結(jié)點(像是有遞歸的樣子)。
int get(int x) { if (father[x] == x) { // x 結(jié)點就是根結(jié)點 return x; } return get(father[x]); // 如果該節(jié)點不是根節(jié)點,繼續(xù)尋找父結(jié)點的根結(jié)點 }
合并:將兩個元素所在的集合合并在一起,通常來說,合并之前先判斷兩個元素是否屬于同一集合。
void hebing(int x, int y) { x = find(x); y = find(y); if (x != y) { // 不在同一個集合 father[y] = x;//將根節(jié)點合并 } }
上面三個操作是并查集常用的操作
前面的并查集的復(fù)雜度實際上在有些極端情況會很慢。比如樹的結(jié)構(gòu)正好是一條鏈,那么最壞情況下,每次查詢的復(fù)雜度達到了O(n) 。這并不是我們期望的結(jié)果。路徑壓縮的思想是,我們只關(guān)心每個結(jié)點的父結(jié)點,而并不太關(guān)心樹的真正的結(jié)構(gòu)(遞歸查找相當(dāng)浪費時間)如下:
當(dāng)想去訪問6的根節(jié)點時,要訪問5的根節(jié)點,想去訪問5的根節(jié)點,又要去訪問4的根節(jié)點..........以此類推,此時并查集退化為線性。
這樣我們在一次查詢的時候,可以把查詢路徑上的所有結(jié)點的father[i]都賦值成為根結(jié)點。只需要在我們之前的查詢函數(shù)上面進行很小的改動
int findf(int k) { if(f[k] == k) return k; return f[k] = findf(f[k]); //后來更新的點的根節(jié)點直接為最開始的點,一步找到總根節(jié)點。 }
到此,關(guān)于“C++并查集怎么實現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站標題:C++并查集怎么實現(xiàn)-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/dgoeje.html