資料結構與演算法 並查集陣列實現

2021-09-26 16:34:30 字數 1211 閱讀 6376

在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

主要涉及操作:

初始化把每個點所在集合初始化為其自身。

通常來說,這個步驟在每次使用該資料結構時只需要執行一次,無論何種實現方式,時間複雜度均為o(n)。

查詢查詢元素所在的集合,即根節點。

合併將兩個元素所在的集合合併為乙個集合。

通常來說,合併之前,應先判斷兩個元素是否屬於同一集合,這可用上面的「查詢」操作實現。

下面用c++利用陣列進行並查集實現:

#pragma once

#define parent_max 1024

using namespace std;

struct element

element

(int va)

:val

(va)};

class

unionfind

;#include

#include

#include

#include

#include "unionfind.h"

using namespace std;

unionfind:

:unionfind()

unionfind::~

unionfind()

unionfind:

:unionfind

(int arr[

], int len)

}int unionfind:

:findhead

(int element)

//優化:扁平化,沿途所有的element全部直接指向他的parent

while

(son != element)

return element;

}void unionfind:

:unionset

(int element1, int element2)

bool unionfind:

:issameset

(int element1, int element2)

並查集資料結構的幾種實現

第一種實現 每乙個節點都只是指向根節點 find是 常數時間複雜度的,union是 線性時間複雜度的。class quickfind count n boolean connected int p int q int find int p void union int p int q for int...

資料結構與演算法之並查集

並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...

資料結構與演算法之並查集

並查集 union find 是一種高效的資料結構,主要的操作有 為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係 需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...