並查集學習筆記 遲來的總結

2022-06-02 00:48:14 字數 990 閱讀 2109

並查集,在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往在空間上過大,計算機無法承受;即使在空間上勉強通過,執行的時間複雜度也極高,根本就不可能在比賽規定的執行時間(1~3秒)內計算出試題需要的結果,只能用並查集來描述。

並查集,顧名思義,也就是支援 「並」, 「查」, 「集」的一種資料結構,可以合併,查詢以及集合。是一種極為重要的演算法,在各個方面均有應用。

並查集一般支援兩個操作:

for (int i = 1; i <= n; i++) fa[i] = i;
然後,我們還要乙個 find 函式用於查詢他的祖先,具體的原理就是遞迴實現。

注 : 我們最好不要用 find,因為它好像是乙個關鍵字還是函式之類的東西,並且單駝峰命名也是乙個好習慣

int find (x)
我們就會發現,萬一有乙個集合是下面的樣子呢?

那麼我們就會發現,我們的每一次訪問都可能會浪費掉很多時間,又因為我們每一次查詢的目的都是為了查詢乙個點的祖先,所以我們可以在查詢 x 的祖先的時候,就直接把他的父親的值直接賦成他的祖先,也就是:

int find (x)
沒錯,就是上面的**,只是變了一點點而已,但他卻可以大大優化你的時間複雜度(大多數題都會卡你),並且他還有乙個很高大上的名字 :路徑壓縮我們還需要乙個 merge 函式來進行合併兩個數,原理就附在**上

bool merge (int x, int y)

並查集總結學習

主要是為了複習內容,好讓自己安心一點 之前學習並查集的時候,並沒有系統地學習圖論的知識,現在再看過來,又要好一些了。根據目前的理解,並查集就是 無向圖中有關聯的部分連通 判斷一條邊是否成環 前提全域性變數 int fa n 祖宗 int rank n 成員數 void init find函式 找爸爸...

並查集學習總結

並查集,在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往在...

並查集學習筆記

並查集是一種用來管理資料分組狀況的資料結構,可以進行合併操作,但無法進行分割。並查集的結構 並查集也是用樹形結構來實現的,但不是二叉樹。每個資料,元素對應乙個節點,每個組對應一棵樹。並查集的實現 並查集有幾個基本操作初始化 查詢樹的根 合併x,y所屬集合 判斷x,y是否屬於同一集合。查詢是查詢樹的根...