傻子都能看懂的並查集入門

2021-09-07 20:32:35 字數 1345 閱讀 4485

其實並查集顧名思義就是有「合併集合」和「查詢集合中的元素」兩種操作的關於資料結構的一種演算法。

並查集演算法不支援分割乙個集合。

用集合中的某個元素來代表這個集合,該元素稱為集合的代表元

乙個集合內的所有元素組織成以代表元為根的樹形結構。

對於每乙個元素 parent[x]指向x在樹形結構上的父親節點。如果x是根節點,則令parent[x] = x。

對於查詢操作,假設需要確定x所在的的集合,也就是確定集合的代表元。可以沿著parent[x]不斷在樹形結構中向上移動,直到到達根節點。

1、維護無向圖的連通性。支援判斷兩個點是否在同一連通塊內,和。2、判斷增加一條邊是否會產生環:用在求解最小生成樹的kruskal演算法裡。

《acm國際大學生程式設計競賽 知識與入門 俞勇主編》

一般來說,乙個並查集一三個操作。

並查集(union-find sets)是一種非常精巧而實用的資料結構,它主要用於處理一些不相交集合的合併問題。一些常見的用途有求連通子圖、求最小生成樹的 kruskal 演算法和求最近公共祖先(least common ancestors, lca)等。

使用並查集時,首先會存在一組不相交的動態集合 s=

s=,一般都會使用乙個整數表示集合中的乙個元素。

每個集合可能包含乙個或多個元素,並選出集合中的某個元素作為代表。每個集合中具體包含了哪些元素是不關心的,具體選擇哪個元素作為代表一般也是不關心的。我們關心的是,對於給定的元素,可以很快的找到這個元素所在的集合(的代表),以及合併兩個元素所在的集合,而且這些操作的時間複雜度都是常數級的。

並查集的基本操作有三個:

makeset(s):建立乙個新的並查集,其中包含 s 個單元素集合。

unionset(x, y):把元素 x 和元素 y 所在的集合合併,要求 x 和 y 所在的集合不相交,如果相交則不合併。

find(x):找到元素 x 所在的集合的代表,該操作也可以用於判斷兩個元素是否位於同乙個集合,只要將它們各自的代表比較一下就可以了。

並查集的實現原理也比較簡單,就是使用樹來表示集合,樹的每個節點就表示集合中的乙個元素,樹根對應的元素就是該集合的代表,如圖 1 所示。

圖 1 並查集的樹表示

圖中有兩棵樹,分別對應兩個集合,其中第乙個集合為 

,代表元素是 a

a;第二個集合為 

,代表元素是 e

e。

傻子都能看懂的並查集入門

其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...

傻子都能看懂的並查集入門

其實並查集顧名思義就是有 合併集合 和 查詢集合中的元素 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如...

(軟考)傻子都能看懂的 海明碼

看了很多大佬的解析,自己來整理一套詳盡到通俗易懂的。海明碼定義 具有糾正一位錯誤的能力。核心公式 2 r k r 1 其中r代表校驗個數 重要!從公式帶入計算可得一張表 記住這張表,選擇題就可以秒答。a 假設有8位資訊位,則需要插入 位校驗碼呀?q 4位。核心 校驗碼pi 必須是在2的n次方位置,即...