Union Find構造
2267 ワード
1.反発セットとUnionFind構造
Union Find構造を表示する前に,反発集合について議論する.反発集合とは,各集合が共通要素を持たない集合を指す.反発集合中の要素の情報を格納し操作する資料構造はUnion-Find資料構造である.後述するunion関数とfind関数がサポートされるため、union-poind資料構造と呼ばれます.
2.ユニオンシード構造の3つの関数初期化:n個の要素を初期化し、各セットに含める. ルックアップ(find)演算:要素aが与えられたときに、その要素が属する集合のルートの演算を返す.(ツリーとルートが1対1であるため、見つかったルートは要素が属する集合を表します.) 連結演算:2つの要素a、bが与えられたときに、それらが属する集合を互いに連結する演算. 3.関連コード
3.1初期化関数
各要素のルートを自己に初期化します.
親[u]は、uの親ノードではなくルートノードを格納することによってfind(u)が呼び出されるとすぐにルートノードに戻る.これをパス圧縮最適化(Path Compression Optimization)と呼びます.
2つの要素u,vが与えられると、find関数によって2つの要素が属する集合のルートが検索されます.2つの値が同じ場合は、同じセットに属しているため、関数を終了します.2つの値が異なる場合、ルートの値は1つの小さなセットに別のセットを含みます.
グラフィックタイプでループの存在を決定するために使用
最も代表的なのはMSTアルゴリズムの中のクルーズアルゴリズムがツリーが拡張時にループが発生するかどうかを決定する際にUnion Find構造を用いたことである.
6.時間の複雑さ
find関数は呼び出すたびに実行時間が変更されるため、分割支払(?)が分析されます.また,実行ごとに必要とされる平均時間はO(a(n))である.a(n)は
結論:O(1)の時間的複雑さ
参考資料
アルゴリズムトラブルシューティングポリシー(本いっぱいから)
Union Find構造を表示する前に,反発集合について議論する.反発集合とは,各集合が共通要素を持たない集合を指す.反発集合中の要素の情報を格納し操作する資料構造はUnion-Find資料構造である.後述するunion関数とfind関数がサポートされるため、union-poind資料構造と呼ばれます.
2.ユニオンシード構造の3つの関数
3.1初期化関数
各要素のルートを自己に初期化します.
DisjointSet(int n): parent(n){
for(int i=0;i<n;i++)
parent[i]=i;
}
3.2 Find関数親[u]は、uの親ノードではなくルートノードを格納することによってfind(u)が呼び出されるとすぐにルートノードに戻る.これをパス圧縮最適化(Path Compression Optimization)と呼びます.
int find(int u){
if(u==parent[u])
return u;
return parent[u]=find(parent[u]);
}
3.3 Union関数2つの要素u,vが与えられると、find関数によって2つの要素が属する集合のルートが検索されます.2つの値が同じ場合は、同じセットに属しているため、関数を終了します.2つの値が異なる場合、ルートの値は1つの小さなセットに別のセットを含みます.
void union(int u,int v){
u=find(u);v=find(v);
if(u==v)
return;
if(u>v)
swap(u,v)
parent[v]=u;
}
4.Union-Find構造全体コードstruct DisjointSet{
vector<int> parent;
//1. parent 초기화
DisjointSet(int n): parent(n){
for(int i=0;i<n;i++)
parent[i]=i;
}
// 2. 루트 노드를 찾는 함수. 이때 경로 압축 기법을 사용한다.
int find(int u){
if(u==parent[u])
return u;
return parent[u]=find(parent[u]);
}
// 3. 두 트리를 합치는 함수. rank를 활용한 개선된 방법도 있으나 기본적인 방법을 사용하겠음.
void union(int u,int v){
u=find(u);v=find(v);
if(u==v)
return;
if(u>v)
swap(u,v) // 두 트리 중 루트의 숫자가 작은 것이 합친 트리의 루트가 될 수 있게끔 하기 위함.
parent[v]=u;
}
};
5.いつ使いますか.グラフィックタイプでループの存在を決定するために使用
最も代表的なのはMSTアルゴリズムの中のクルーズアルゴリズムがツリーが拡張時にループが発生するかどうかを決定する際にUnion Find構造を用いたことである.
6.時間の複雑さ
find関数は呼び出すたびに実行時間が変更されるため、分割支払(?)が分析されます.また,実行ごとに必要とされる平均時間はO(a(n))である.a(n)は
앵커만 상수
と呼ばれる関数であり、すべてのサイズのnにとって4未満の値である.つまり一定時間が必要です.結論:O(1)の時間的複雑さ
参考資料
アルゴリズムトラブルシューティングポリシー(本いっぱいから)
Reference
この問題について(Union Find構造), 我々は、より多くの情報をここで見つけました https://velog.io/@rafael/유니온-파인드-구조テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol