演算法4 並查集

2021-10-01 06:28:56 字數 1695 閱讀 4894

1、並查集(動態連通問題適用)

時間複雜度為n^2的演算法:

#include

"class.h"

const

int n =10;

intmain()

c.printff()

; cin.

get();

cin.

get();

return0;

}

#pragma once

#include

using

namespace std;

class

class

;private:

intfind

(int p)

;void

union

(int p,

int q);}

;

#include

"class.h"

class::

class

(int n)

int class::

find

(int p)

void class::

union

(int p,

int q)

} count--;}

bool class::

connect

(int p,

int q)

void class::

printff()

上述並查集演算法的時間複雜度為平方級別的,處理資料較為多時,時間消耗較多,所以經過優化後的**如下:

quick-union:

#include

"class.h"

class::

class

(int n)

int class::

find

(int p)

void class::

union

(int p,

int q)

bool class::

connect

(int p,

int q)

void class::

printff()

加權quick-union:

#include

"class.h"

class::

class

(int n)

}int class::

find

(int p)

void class::

union

(int p,

int q)

else

; count--;}

bool class::

connect

(int p,

int q)

void class::

printff()

最優化的演算法是將樹扁平化處理,即在 find方法中新增乙個迴圈,將經過的路徑全部直接鏈結到根節點,稱為路徑壓縮的加權quick-union演算法,但是並非所有操作都能在常數時間內完成,最壞的情況可能不是常數級別的!其它的幾種優化演算法一概如此!在用例比較明確的情況下,大部分時間複雜度為常數級別;

並查集演算法

所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...

並查集演算法

並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...

並查集演算法

includeint pre 10 int find int x 查詢祖先節點 int i x,j while i r 壓縮路徑 return r void join int x,int y int main 2 食物鏈問題 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈...