在一些有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.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...