十 森林與並查集 1 什麼是並查集

2021-07-11 12:51:51 字數 1277 閱讀 7948

摘自計蒜客:

在電腦科學中,並查集(merge-find set),也被稱為不相交集合(disjoint set),是用於解決若干的不相交集合的如下幾種操作的統稱:

make-set(x):即初始化操作,建立乙個只包含元素 x 的集合。

union(x, y):即合併操作,將包含 x 和 y 的集合合併為乙個新的集合。

find-set(x):即查詢操作,計算 x 所在的集合。

並查集通常同時指代不相交集合的資料結構及其對應的演算法,其在有些教材中的英文名稱也叫做 disjoint set union,表示用於求不相交集合並集的相關演算法。

通常我們會用有根樹來表示集合,樹中的每乙個結點都對應集合的乙個成員,每棵樹表示乙個集合。

每個成員都有一條指向父結點的邊,整個有根樹通過這些指向父結點的邊來維護。每棵樹的根就是這個集合的代表,並且這個代表的父結點是它自己。

通過這樣的表示方法,我們將不相交的集合轉化為乙個森林,也叫不相交森林。接下來我們會介紹,如何通過不相交森林實現並查集的初始化、合併和查詢操作。

通常並查集初始化操作是對每個元素都建立乙個只包含該元素的集合。這意味著每個成員都是自身所在集合的代表,所以我們只需要將所有成員的父結點設為它自己就好了。

在不相交森林中,並查集的查詢操作,指的是查詢出指定元素所在有根樹的根結點是誰。我們可以通過每個指向父結點的邊回溯到結點所在有根樹的根,也就是對應集合的代表元素。

並查集的合併操作需要用到查詢操作的結果。合併兩個元素所在的集合,需要首先求出兩個元素所在集合的代表元素,也就是結點所在有根樹的根結點。接下來將其中乙個根結點的父親設定為另乙個根結點。這樣我們就把兩棵有根樹合併成一棵了。

並查集的合併操作非常關鍵,下面我們舉個小例子來說明合併操作對應的不相交森林的狀態變化。

如上圖所示,圖(a)為兩個合併前的集合對應的不相交森林,兩個集合對應的有根樹的根分別是 c 和 f。我們將兩個集合進行合併,就會得到圖(b)所示的新集合,集合對應的有根樹的根為 f。

並查集的查詢操作最壞情況下的時間複雜度為 o(n),其中 n 為總元素個數。最壞情況發生時,每次合併對應到森林上都是乙個點連到一條鏈的一端。此時如果每次都查詢鏈的最底端,也就是最遠離根的位置的元素時,複雜度便是 o(n) 了。

為了改善時間效率,可以通過啟發式合併方法,將包含較少結點的樹接到包含較多結點的樹根上,可以防止樹退化成一條鏈。另外,我們也可以通過路徑壓縮的方法來進一步減少均攤複雜度。同時使用這兩種優化方法,可以將每次操作的時間複雜度優化至接近常數級。

團夥 並查集 什麼是 「並查集」 ?

本文作者封承成,年僅12歲,非常感謝他的投稿。並查集是什麼 並查集,是一種判斷 遠房親戚 的演算法。打個比方 你身邊的某個 朋友 很有可能就是你父親的母親的姑媽的大姨的哥哥的表妹的孫子的女兒的父親的孫子。如果給定這麼一張 家譜 無向圖 如何判斷兩個頂點是不是 親戚 呢?用人話說,就是判斷乙個圖中兩個...

團夥 並查集 什麼是 「並查集」 ?

本文作者封承成,年僅12歲,非常感謝他的投稿。並查集是什麼 並查集,是一種判斷 遠房親戚 的演算法。打個比方 你身邊的某個 朋友 很有可能就是你父親的母親的姑媽的大姨的哥哥的表妹的孫子的女兒的父親的孫子。如果給定這麼一張 家譜 無向圖 如何判斷兩個頂點是不是 親戚 呢?用人話說,就是判斷乙個圖中兩個...

初學並查集 並查集1

現在,我是用乙個初學者的眼光來寫並查集,此文最初寫於我學並查集的那天,後經過多次修改。1 並查集是什麼 並查集是乙個具有多個連通分支的圖,他擁有合併兩個連通分支,和查詢兩個元素是否位於同乙個連通分支的功能。2 並查集的簡單應用 並查集解決什麼問題 假如有一些點,你知道哪些點是直接相連的,但實際上間接...