KEMBAR78
disjoint-set data structures | PPTX
Disjoint-set Data Structures  원저자: vlad_D  발표자: 심준현
목   차Disjoint Sets
 The Problem
The Solution
Basic Functions
 LL Implementation
Root Tree Implementation
PracticeDisjoint Sets간단히 말해서i ≠ k인 모든 (i, k)에 대하여Ai ∩ Ak = ϕ인 집합들
The Problem312Input451 25 45 1
새로운 개념대표값(Representatives): 어떤 집합의 고유한, 집합의 Key값Disjoint Set이므로 해당 집합 안에 있기만 하면 자격 충분!이번에는 편의상 최대값으로 설명
The Solution – Step 131245{1} {2} {3} {4} {5}모든 원소가 자신이 속한 집합의 대표값
The Solution – Step 231245{1, 2} {3} {4} {5}집합 1, 2가 합쳐진 집합의 대표값은2
The Solution – Step 331245{1, 2} {3} {4, 5}집합 4, 5가 합쳐진 집합의 대표값은5
The Solution – Step 431245{1, 2, 4, 5} {3}집합 {1, 2}, {4, 5}가 합쳐진 집합의 대표값은5
The SolutionQ: 원소 a와 원소 b가 같은 집합에 있는지 확인하는 방법은?31245A: 원소가 속한 집합의 대표값을 비교한다!같으면 O 다르면 X
Basic Functions1. CREATE_SET(x) 원소 x를 유일한 원소로 갖는 집합 생성2. MERGE_SETS(x, y) x가 속한 집합과 y가 속한 집합을 통합3. FIND_SET(x)x가 속한 집합의 대표값 또는 그에 대한 포인터를 리턴
Basic FunctionsPseudo CodeRead N; for (each person x from 1 to N) CREATE-SET(x);for (each pair of friends (x y) ) if (FIND-SET(x) != FIND-SET(y)) 	MERGE-SETS(x, y);
LL Implementation원소 하나가 한 개의 노드각 노드는대표 노드를 가리키는 포인터와다음 노드를 가리키는 포인터를 갖는다.1122{1} ← {2} Merge의 경우
LL Implementation다수의 원소를 갖는 집합끼리의 Merge는?한 집합의 대표노드를 그대로 다른 집합의 꼬리 노드에Append (즉, 앞 집합의 꼬리 노드의Next 포인터를 뒷 집합의 대표 노드로 이어줌)뒷 집합에 속한 각 노드의 대표 노드 포인터를모두 앞 노드의 대표 노드로 이어준다.
LL Implementation결  과
LL Implementation개선의 여지가 있다!한 집합의 대표노드를 그대로 다른 집합의 꼬리 노드에Append뒤에 붙는 집합의 원소 수가 더 작을 수록T.C. 감소… 그렇다면?대표 노드에subnode의 수를 기록!
LL ImplementationLL Impl. T.C. : O(M+NlogN), S.C.: O(N)BFS Impl.T.C. : O(M+N),       S.C.: O(M+N)M: FIND, MERGE, CREATE 호출 횟수N: 원소의 개수아직 뭔가 부족하다..
Root Trees Implementation원소 하나 당 노드 하나각 노드는 원소 값과부모 노드에 대한 포인터를 갖는다.루트 노드== 대표 노드LL Impl.과의 차이점: 대표 노드 포인터와 Next 포인터가 사라지고 대신 Prev포인터(부모 포인터)가 생겼다.
Root Trees Impl. – Step 1for(int i = 1; i <= 5; i++)CREATE_SET(i);
Root Trees Impl. – Step 2MERGE_SETS(1, 2);
Root Trees Impl. – Step 3MERGE_SETS(5, 4);
Root Trees Impl. – Step 4 (Final)MERGE_SETS(5, 1);
Root Trees Impl.지금까지의 Computational Complexity는 LL Impl.과 동일개선 방법Union by rank노드마다Subnode의 로그 깊이를 저장Path compression탐색 단계 하나 당 로그 깊이가 1씩 감소

disjoint-set data structures

  • 1.
    Disjoint-set Data Structures 원저자: vlad_D 발표자: 심준현
  • 2.
    차Disjoint Sets
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    PracticeDisjoint Sets간단히 말해서i≠ k인 모든 (i, k)에 대하여Ai ∩ Ak = ϕ인 집합들
  • 9.
  • 10.
    새로운 개념대표값(Representatives): 어떤집합의 고유한, 집합의 Key값Disjoint Set이므로 해당 집합 안에 있기만 하면 자격 충분!이번에는 편의상 최대값으로 설명
  • 11.
    The Solution –Step 131245{1} {2} {3} {4} {5}모든 원소가 자신이 속한 집합의 대표값
  • 12.
    The Solution –Step 231245{1, 2} {3} {4} {5}집합 1, 2가 합쳐진 집합의 대표값은2
  • 13.
    The Solution –Step 331245{1, 2} {3} {4, 5}집합 4, 5가 합쳐진 집합의 대표값은5
  • 14.
    The Solution –Step 431245{1, 2, 4, 5} {3}집합 {1, 2}, {4, 5}가 합쳐진 집합의 대표값은5
  • 15.
    The SolutionQ: 원소a와 원소 b가 같은 집합에 있는지 확인하는 방법은?31245A: 원소가 속한 집합의 대표값을 비교한다!같으면 O 다르면 X
  • 16.
    Basic Functions1. CREATE_SET(x)원소 x를 유일한 원소로 갖는 집합 생성2. MERGE_SETS(x, y) x가 속한 집합과 y가 속한 집합을 통합3. FIND_SET(x)x가 속한 집합의 대표값 또는 그에 대한 포인터를 리턴
  • 17.
    Basic FunctionsPseudo CodeReadN; for (each person x from 1 to N) CREATE-SET(x);for (each pair of friends (x y) ) if (FIND-SET(x) != FIND-SET(y)) MERGE-SETS(x, y);
  • 18.
    LL Implementation원소 하나가한 개의 노드각 노드는대표 노드를 가리키는 포인터와다음 노드를 가리키는 포인터를 갖는다.1122{1} ← {2} Merge의 경우
  • 19.
    LL Implementation다수의 원소를갖는 집합끼리의 Merge는?한 집합의 대표노드를 그대로 다른 집합의 꼬리 노드에Append (즉, 앞 집합의 꼬리 노드의Next 포인터를 뒷 집합의 대표 노드로 이어줌)뒷 집합에 속한 각 노드의 대표 노드 포인터를모두 앞 노드의 대표 노드로 이어준다.
  • 20.
  • 21.
    LL Implementation개선의 여지가있다!한 집합의 대표노드를 그대로 다른 집합의 꼬리 노드에Append뒤에 붙는 집합의 원소 수가 더 작을 수록T.C. 감소… 그렇다면?대표 노드에subnode의 수를 기록!
  • 22.
    LL ImplementationLL Impl.T.C. : O(M+NlogN), S.C.: O(N)BFS Impl.T.C. : O(M+N), S.C.: O(M+N)M: FIND, MERGE, CREATE 호출 횟수N: 원소의 개수아직 뭔가 부족하다..
  • 23.
    Root Trees Implementation원소하나 당 노드 하나각 노드는 원소 값과부모 노드에 대한 포인터를 갖는다.루트 노드== 대표 노드LL Impl.과의 차이점: 대표 노드 포인터와 Next 포인터가 사라지고 대신 Prev포인터(부모 포인터)가 생겼다.
  • 24.
    Root Trees Impl.– Step 1for(int i = 1; i <= 5; i++)CREATE_SET(i);
  • 25.
    Root Trees Impl.– Step 2MERGE_SETS(1, 2);
  • 26.
    Root Trees Impl.– Step 3MERGE_SETS(5, 4);
  • 27.
    Root Trees Impl.– Step 4 (Final)MERGE_SETS(5, 1);
  • 28.
    Root Trees Impl.지금까지의Computational Complexity는 LL Impl.과 동일개선 방법Union by rank노드마다Subnode의 로그 깊이를 저장Path compression탐색 단계 하나 당 로그 깊이가 1씩 감소
  • 29.
    Root Trees Impl.– Steps 1 & 21/02/01/12/05/04/05/14/0
  • 30.
    Root Trees Impl.– Step 31/11/22/02/05/14/05/14/0
  • 31.
    Root Trees Impl.– Final State1/25/12/04/0
  • 32.
    Root Trees Impl.– Pseudo CodeLet P[x] = the parent of node x. CREATE-SET(x) P[x] = x rank[x] = 0 MERGE-SETS(x, y) PX = FIND-SET(X) PY =FIND-SET(Y) If (rank[PX] > rank[PY]) P[PY] = PX Else P[PX] = PY If (rank[PX] == rank[PY]) rank[PY]++FIND-SET(x) If (x != P[x]) P[x] = FIND-SET(P[X]) Return P[X]
  • 33.
    Practice ProblemsgrafixMask Problem각좌표를 하나의 노드로 본다각 노드에서 그 상하좌우 노드에 대한판별 작업 후 막혀 있지 않으면 MERGE_SETS(Node1, Node2) 처리해서 통합