首先我們必須明白不相交集這種資料結構是用來幹什麼的。不相交即主要用來實現動態等價問題的求解。動態
等價問題
這裡不再說明等價關係的概念,這個可以參考數理邏輯之類的書。假設我們有乙個集合和乙個等價關係~,針對集合中的任意兩個元素
a 和
b,我們如何確定他們有等價關係~,即a~b.那麼我們需要等價類的概念,乙個元素a∈
s 的等價類是s的乙個子集,它包含所有和
a 有關係~的元素。這樣,等價類就把s進行了子集的劃分,其實,如果我們能夠找到這種子集劃分,那麼針對集合中的兩個元素是否有~的問題就轉變成這兩個元素是否在同乙個等價類中。這便是解決動態等價問題的思想。
要想找到所有的等價類,乙個最基礎的操作就是我如何找到集合
s 中的乙個元素所屬的等價類,我們將這個操作記為fi
nd。第二個問題就是如何將有等價關係的兩個元素並在一起,我們稱作un
ion ,如何檢驗兩個元素是否有等價關係呢?我們可以用操作fi
nd找到這兩個元素所屬的等價類,從而確定這兩個元素的等價關係(這裡需要注意的一點就是,我們是已知了集合s中任意兩個元素之間的等價關係,但是我們必須對這個資訊進行儲存,從而在需要確定兩個元素是否有等價關係時,能夠快速判斷。),所以這種演算法叫做un
ion/
find
演算法。
我們這裡只介紹基於樹的一種實現方法。首先我們給出每個元素乙個編號1,
...|
s|(要能反找到相應的元素),下面會注意到這個編號也可以表示某乙個等價類名稱。首先定義乙個陣列ar
ray ,長度為|s
| .第i個位置表示編號為i-1的元素,array[i]表示編號為i的元素的父節點的編號。我們的目的就是將乙個等價類表示成一棵樹,根節點表示這個等價類名稱,在合併兩個元素時,將乙個元素作為另乙個元素的父節點,在查詢時,逐步查詢該元素的父節點,直到找到根節點。我們便可以得到該元素的類標號。對array陣列進行初始化時,都為0,表示每個元素初始時,分別是一類(這時),也就是有|s
| 棵樹,如果array[k]=0表示k是乙個根節點。下面將實現這個想法。
typedef int root;
typedef int element;
typedef int adjoint_set[n+1];
void init(adjoint_set as)
void union(adjoint_set as,root root1,root root2)
int find(adjoint_set as,element x)
將int重新定義成root,表示等價類標號(根),定義成element,表示s中的元素標號。可以看出un
ion 是將兩個「等價類」進行了合併。運用遞迴的方法來尋找乙個元素所屬的等價類。
這種方法在進行un
ion 時所用的時間為o(
1).但是進行fi
nd操作的時間依賴於所尋找元素在其所在的等價類樹中的深度。注意到我們進行un
ion 操作時,很有可能構造出乙個深度為n−
1 的鏈樹,這樣進行查詢的時間就是o(
n),進行一系列查詢的時間可能為o(
mn) ,這種時間是不可接受的。
我們接下來給出兩種改進方法使得查詢的最壞時間得到改進。
按大小求並
就是在求un
ion 運算時,我們將小樹(節點少)作為大樹(節點多)的子樹,這樣fi
nd操作的時間為o(
logn
) ,原因在於將一顆樹並到另一棵樹中時,前者的每個節點深度增加1,但是這樣的並運算,最多進行lo
g(n)
次。所以一系列的fi
nd操作的時間複雜度為om
(log
n)。下面是**實現:
void union(adjoint_set as,root root1,root root2)
else
}int find(adjoint_set as,element x)
void init(adjoint_set as)
我們將陣列初始化為-1.同時,如果adjoint_set[i]<0表示它為乙個根節點(等價類),其實是負號表示根,絕對值表示樹的大小,進行un
ion 操作時,要更新union後的樹的大小。該種結構的連續m次操作的平均時間為o(
m).
路徑壓縮針對f
ind 操作進行改進,假設操作為fi
nd(x
) ,路徑壓縮的效果是:從x到根的路徑上的每個節點都使它的父節點變成根。
int find(adjoint_set as,element x)
不相交集ADT
1.不相交集是解決等價關係的一種資料結構,執行合併和查詢的速度都非常快,m次執行合併和查詢的執行時間為 m logn 在乙個集合中,對於每一對元素 a,b a,b s,對於關係r如果滿足下面三個條件,則成關係r為等價關係 1 自反性 對於所有a s,ara 2 對稱性 arb當且僅當bra 3 傳遞...
資料結構 不相交集ADT
若對於每一對元素 a,b a b屬於s,arb或者為true或者為false,則稱在集合s上定義關係r。如果arb是true,那麼我們說a與b有關係。等價關係是滿足下列三個性質的關係r 自反性 對於所有的a屬於s,ara 對稱性 arb當且僅當bra 傳遞性 若arb且brc,則arc 乙個元素a屬...
並查集(不相交集)ADT
等價關係 需要同時滿足下列三個性質的關係r 等價集合 如果乙個元素a 屬於集合s,則元素a的等價集合是集合s的乙個子集,它包含所有與元素a有等價關係的元素。輸入資料最初是n個元素 元素也是乙個集合 的集合,其中每個集合只含有乙個元素,且互不相同,也不存在等價關係,使得這些集合互不相交,此時只能進行兩...