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...