演算法學習 Union Find演算法

2021-07-05 15:42:28 字數 1347 閱讀 7805

union-find演算法有它的實際用途。多用於動態連通的應用場景。

union-find演算法是:給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的

舉兩個例子作為主要表現:

1、在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候可以採用union-find演算法思想;

2、參考編譯器在編譯乙個變數時,額外宣告多個指標指向同一變數,這時候,能獲知哪些指標實際的指向,也是應用union-find思想的時候。

思考路線:

1、首先,構建陣列儲存編號id [ n ] ,確定一共有多少節點 (n);我們通常選擇樹的結構儲存像這樣的資料,樹的結構有利於

2、編寫find函式,find函式旨在告訴我們,find(int p)裡面的p屬於那乙個 id[p];

3、編寫union函式,union函式作用是鏈結兩個節點union(int a,int  b)而通常,兩個節點都有屬於自己的group。

4、之後我們開始優化,find函式和union函式;

5、find函式,參考(quick-union 演算法),讓find 函式增加判斷,讓所尋找的值等於根節點 id[ p ],因為在樹的連線時,id號變更了 ;參考(路徑壓縮的weighted quick-union演算法)我們把它進行改造讓它實現find時,返回的值與樹的根部接近且為1;

6、union函式,有兩步改造參考(quick-union 演算法)在兩個節點聯合的時候,把兩棵樹的其中一棵變為另外一棵樹的子樹;第二步,參考(weighted quick-union演算法),增加兩棵樹大小的判斷,引入樹的大小參量。

下面是**:

#include class uf  

int count()

bool connected(int p, int q)

int find(int p)

void union(int p, int q)

//不好的地方是需要全部遍歷

//下面是各種改良

//quick-union

int find(int p)

void union(int p, int q)

//weighted quick-union

int *sz;//增加sz作為樹的大小

uf(int n)

void union(int p, int q)

else

count--;

} //路徑壓縮的weighted quick-union演算法,讓樹更扁平化

int find(int p)

return p;

} };

四 union find演算法

問題 問題總結 就是輸入乙個整數對代表兩個融點 也就是物件,融點是術語 如果兩個融點未連通,則將它們連在一起 呼叫union方法,下面黑色的部分 並列印 如果兩個融點已經連通則處理下一對資料 下圖灰色的部分,什麼也不幹 過程如下 設計乙個資料結構來儲存程式已知的所有整數對的足夠多的資訊,並用它們來判...

《演算法》1 5union find演算法

union find的抽象類 author azhu date 2021 2 9 17 19 public abstract classuf 查詢觸點p所在分量的識別符號 param p 觸點 return 分量的識別符號 public abstract intfind int p 在p和q之間新增...

union find演算法的研究

三種union find演算法的效能特點演算法 建構函式 union find quick find演算法nn 1quick union演算法 n樹的高度 樹的高度 加權quick union演算法 nlgn lgnpublic intfind int p public void union int...