1. 程式人生 > >資料結構之 --- 樹的應用(並查集)

資料結構之 --- 樹的應用(並查集)

概念:

並查集是一種簡單的集合表示,它支援一下三種操作:

1)Union(S, Root1, Root2):

    把集合S中的子集合Root2併入集合Root1中。要求Root1和Root2互不相交,否則不執行合併。

2)Find(S, x):

     查詢集合S中單元素x所在的子集合,並返回該子集合的名字。

3)Inital(S):將集合S中的每一個元素都初始為只有一個單元的子集合。

通常用樹(森林)的雙親表示作為並查集的儲存結構,每個子集合以一棵樹表示。所有表示子集合的樹構成森林,

存放在雙親表示陣列內,通常用陣列元素的下表代表元素名,根結點的下標代表子集合名,根結點的雙親位負數。

例如,若設有一個全集合為S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},初始化時每個元素自成一個單元子集合,每個子集合的陣列值是 -1

經過一段時間的計算,這些子集合合併成三個更大的子集合

S1 = {0, 6, 7, 8}

S2 = {1, 4, 9}

S3 = {2, 3, 5}

此時並查集的樹形表示和儲存結構如下所示。


為了得到兩個子集合的並,只要將其中一個子集合的根結點的雙親指標指向另一個集合的根結點即可。

模板程式碼如下:
#define SIZE 100
int UFSets[SIZE];

void Initial(int S[])
{
	for(int i = 0; i < size; i++)
			S[i] = -1;
}

int Find(int S[], int x)
{
	while(S[x] >= 0)
			x = S[x];
	return x;
}

void Union(int S[], int Root1, int Root2)
{
		S[Root2] = Root1;
}