ユニオン并查集
4942 ワード
解決する問題
ユニオン并查集
定義
Union Find is a data structure that keeps track of elements which are split into one or more disjoint sets.
つの主要な活動
find(elem)
: $ elem $が属するグループ/クラスを返します.union(e1,e2)
: つの要素を統一する複雑さ
操作
時間複雑度
建設
o ( n )
同盟
a ( n )
見つける
a ( n )
コンポーネントのサイズ
a ( n )
接続チェック
a ( n )
コンポーネント
o ( 1 )
償却定数時間
要素ノードの表現
#define MAX 10000
struct Node
{
int data; // 该元素保存的数据
int rank; // 以该元素为root形成的子树的高度
int parent; // parent node
}node[MAX];
int set[max];//集合index的类别,或者用parent表示
int rank[max];//集合index的层次,通常初始化为0
int data[max];//集合index的数据
//初始化集合
void Make_Set(int i)
{
set[i]=i;//初始化的时候,一个集合的parent都是这个集合自己的标号。没有跟它同类的集合,那么这个集合的源头只能是自己了。
rank[i]=0;
}
アルゴリズム
representative element
集合のrepresentative element
がセットされ、残りの要素が子要素である.parent(x)
: 要素の親ノードを返すx
.parent(root) = root
find(x)
要素のグループ/set/クラスを返すx
, ==どれが本質的にはrepresentative element
このグループの/set/class ==parent(x)
ルートノードに到達するまで.union(e1,e2)
: # to unify two elements, first find their roots
root1 = root of e1
root2 = root of e2
# if roots are different, let one be the parent of the other
if root1 == root2:
return
else:
parent[root1] = root2 / parent[root2] = root1
rank
子として、木からの退化を防ぐために.Reference
この問題について(ユニオン并查集), 我々は、より多くの情報をここで見つけました https://dev.to/yunshu67/union-find-3pkaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol