線上等價類與離線等價類(概念)
1.定義:等價類是指相互等價的元素的最大集合。
2.線上等價類
⑴ 初始時,只有n個元素,每個元素屬於一個獨立的等價類。
⑵需要執行以下操作:
把包含a,b的等價類合併成一個類combina(a,b); 確定哪個類包含元素e,即確定兩個元素是否在同一Find(e);不同類返回不同結果。combina(a,b) 等效i=Find(a), j=Find(b); if(i!=j) Union(i,j);
⑶解決方案: 將每個集合(類)描述為一棵樹,採用連結串列的方法來描述樹。每個節點必須有一個parent域,但不必有children域 。節點內的數字是其parent域的值,節點外的數字為其索引。索引同時也就是該節點所表示的元素。根節點的 parent域被置為0;
⑷程式碼實現:
int Find(int e)
{
while(!root[e])
e= parent[e];
returne;
}
高度規則:若樹i的高度小於樹j的高度,則將j作為i的父節點。
重量規則:若樹i的節點數大於樹j的節點數,則將j作為i的父節點。
在合併演算法中,每個節點上增加 一個布林域root,若當前節點為跟節點,則其root域為true,
每個根節點的parent域用來儲存該樹中節點的總數。
voidUnion(int i, int j) //將根為i,j的兩棵樹進行合併;
{
if(parent[i]< parent[j])
{
parent[j]+= parent[i];
root[i]= false;
parent[i]= j;
}
else
{
parent[i]+= parent[j];
root[j]= false;
parent[j]= i;
}
}
路徑壓縮:
int Find(int e)
{
Int j = e;
while(!root[j]) //搜尋根節點
j =parent[j];
int f =e;
while(f!=j)
{
Int pf= parent[f];
Parent[f]= j;
F =pf;
}
return j;
}
3.離線等價類
離線等價類的輸入時元素數目n,關係數目r以及r對關係,問題的目標是吧n個元素分配至相應的等價類中。