[Algorithm] Union-Find
3909 ワード
Union-Find
:Disjoint setで使用するアルゴリズムを示します
Disjoint Set
:重複しない部分集合の要素情報を格納および操作するデータ構造
ААААААА
Union Findはツリー構造を用いて実現する.
ツリー構造を使用する理由
-タイルを使用する場合 を初期化
勘定科目の時間複雑度O(N)2479182
時間複雑度O(1)2479182
-ツリーを使用する場合
時間的複雑度はO(N)よりも小さいため、find演算の時間的複雑度は2479182である.
АААААААААААААААА\104
平均時間複雑度は木の高さに比例するためO(logn)
Union Find操作
-xを一意の要素とする新しいセット を作成します.
-xが属する集合とyが属する集合の合計
勘定科目xおよびyが属する2つのセットの演算
-xは、属する集合のルートノード値を返します.
どの集合に属するかを検索する演算 Union Findコード
2479142=別のブート・ツリーとして、Union勘定科目の勘定科目xまたはyを含む部分集合を表すツリーを作成します.
リファレンス
リファレンス
リファレンス
:Disjoint setで使用するアルゴリズムを示します
Disjoint Set
:重複しない部分集合の要素情報を格納および操作するデータ構造
ААААААА
Union Findはツリー構造を用いて実現する.
ツリー構造を使用する理由
-タイルを使用する場合
Array[i]
:i号要素が属する集合の番号(ルートノード番号)make-set(x)
:Array[i]=iのように、異なる集合番号でunion(x, y)
:配列内のすべての要素を巡り、yの集合番号をxの集合番号に変更します.勘定科目の時間複雑度O(N)2479182
find(x)
:一度にxが属するコレクション番号を検索時間複雑度O(1)2479182
-ツリーを使用する場合
같은 집합 = 하나의 트리
➡️ 집합 번호 = 루트노드
make-set(x)
:各ノードはルートノードであるため、N個のノードを作成して自身に初期化する時間的複雑度はO(N)よりも小さいため、find演算の時間的複雑度は2479182である.
find(x)
:ノードの集合番号はルートノードです.したがって、ルートノードを確認して、同じ集合であるかどうかを確認します.АААААААААААААААА\104
平均時間複雑度は木の高さに比例するためO(logn)
Union Find操作
make-set(x)
-初期化-xを一意の要素とする新しいセット
union(x, y)
-合-xが属する集合とyが属する集合の合計
勘定科目xおよびyが属する2つのセットの演算
find(x)
-検索-xは、属する集合のルートノード値を返します.
どの集合に属するかを検索する演算
int find(int x) {
if(parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return;
parent[y] = x;
/**
* x와 y의 루트 노드가 같다면 같은 집합이므로 종료하고
* 그게 아니라면 y의 부모를 x로 바꿈
*/
}
2479142=Find勘定科目のルートノードを検索する関数で、ルートノードに到達するまで親ノードに遡ります.2479142=別のブート・ツリーとして、Union勘定科目の勘定科目xまたはyを含む部分集合を表すツリーを作成します.
リファレンス
リファレンス
リファレンス
Reference
この問題について([Algorithm] Union-Find), 我々は、より多くの情報をここで見つけました https://velog.io/@dbsrud11/Algorithm-Union-Findテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol