演算法 union find的C 實現

2021-10-09 20:01:58 字數 3977 閱讀 9261

問題描述:圖的動態連通性問題,要求能夠新增連線,判斷一對物件是否相連等

解決思路:若給出的兩個物件連通,則使兩者的id值置為相同,判斷是否連通時也只用判斷值是否相同即可。

**實現:

class

quick_find

}//find the root of p_id[i]

intfind

(int

*p_id,

int i)

//the function of connected

bool

connected

(int

*p_id,

int x,

int y)

//the function of union

void

union_num

(int

*p_id,

int n,

int x,

int y)

} count--;}

}//cout the cnt

void

display()

};

檢驗一下:

int

main()

cout << endl;

f.union_num

(p_id, n,4,

3); f.

union_num

(p_id, n,3,

8); f.

union_num

(p_id, n,6,

5); f.

union_num

(p_id, n,9,

4); f.

union_num

(p_id, n,2,

1); f.

union_num

(p_id, n,8,

9); f.

union_num

(p_id, n,5,

0); f.

union_num

(p_id, n,7,

2); f.

union_num

(p_id, n,6,

1); f.

union_num

(p_id, n,1,

0); f.

union_num

(p_id, n,6,

7);for

(int i =

0; i < n; i++

) cout << endl;

f.display()

;system

("pause");

return0;

}

解決思路:由於在quick find中,每次連通時都要遍歷整個陣列修改它的值,這樣是非常浪費時間的,為了提公升速度,我們在連線時將其id值設定為另乙個元素,形成鏈結,在進行下一次連線時,尋找其鏈結的根再連起來,節省時間。

class

quick_union

}//find the root of num

intfind

(int

*p_id,

int num)

//judge if two components are connected

bool

connected

(int

*p_id,

int x,

int y)

//connect two components

void

union_id

(int

*p_id,

int x,

int y)

}//cout the count of connected components

void

display()

};

寫主函式實現一下:

int

main()

cout << endl;

f.union_id

(p_id,4,

3); f.

union_id

(p_id ,3,

8); f.

union_id

(p_id,6,

5); f.

union_id

(p_id,9,

4); f.

union_id

(p_id,2,

1); f.

union_id

(p_id ,8,

9); f.

union_id

(p_id,5,

0); f.

union_id

(p_id,7,

2); f.

union_id

(p_id,6,

1); f.

union_id

(p_id,1,

0); f.

union_id

(p_id,6,

7);for

(int i =

0; i < n; i++

) cout << endl;

f.display()

;system

("pause");

return0;

}

解決思路:這時出現了新的問題,quick union有一種很壞的情況,就是將一棵大樹和小樹相連時,若不經過判斷,最後會形成一顆「**」的樹,因此引入加權演算法,簡單的新增乙個size陣列記錄樹中的節點數,一比較就知道哪個小比較好連啦。

class

weighted_quick_union

}//find the root of numbers

intfind

(int

*p_id,

int num)

//connect two numbers' root

void

union_num

(int

*p_id,

int x,

int y)

else

count = count -1;

}}//judge two numbers

bool

connected

(int

*p_id,

int x,

int y)

//cout the count of connected components

void

display()

};

實現一下:

int

main()

cout << endl;

f.union_num

(p_id,4,

3); f.

union_num

(p_id,3,

8); f.

union_num

(p_id,6,

5); f.

union_num

(p_id,9,

4); f.

union_num

(p_id,2,

1); f.

union_num

(p_id,5,

0); f.

union_num

(p_id,7,

2); f.

union_num

(p_id,6,

1);for

(int i =

0; i < n; i++

) cout << endl;

f.display()

;system

("pause");

return0;

}

union find演算法的研究

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

四 union find演算法

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

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...