매일을 설렘으로

[Algorithm] Union-Find 알고리즘 본문

알고리즘

[Algorithm] Union-Find 알고리즘

하루설렘 2021. 11. 19. 14:54

Union-Find는 대표적인 그래프 알고리즘이며, 서로소 집합(Disjoint-Set) 알고리즘이라고도 불린다. 합집합 찾기라는 의미입니다. 여러개의 노드가 존재할 때 두 개의 노드를 선택해서 현재 이 두 노드가 서로 같은 그래프에 속하는지 판별하는 알고리즘입니다. 

 

1. 자기 자신만을 집합의 원소로 가지고 있다고 생각하면 아래 표와 같다.

부모노드 1 2 3 4 5 6 7 8
자식노드 1 2 3 4 5 6 7 8

2. 1, 2와 3이 연결되어있다고 생각하면, 작은값을 부모 노드로 올리는게 일반적이다.이것을 합침(Union)이라고 한다.

하지만, 1,2,3이 같은 집합내에 있지만, 3의 부모노드가 다르다는걸 알 수 있다.  이를 확인하기 위해서 재귀함수를 사용하고, Union-Find라고 한다. 

부모노드 1 1 2 4 5 6 7 8
자식노드 1 2 3 4 5 6 7 8

 

 

함수 구현

## 부모 노드를 찾는 함수
def getParent(parent, x :int):
    if parent[x] == x: return x
    return getParent(parent, parent[x])

## 두 부모 노드를 합치는 함수
def unionParent(parent, a, b):
    a= getParent(parent, a)
    b= getParent(parent, b)
    if a < b: parent[b] = a
    else: parent[a] = b

## 부모가 같은지 확인하는 함수
def findParent(parent, a, b):
    a = getParent(parent, a)
    b = getParent(parent, b)
    if a == b: return 1
    else: return 0
 
## 위 함수 구현 확인 예제
parent=list(range(5))
unionParent(parent, 1, 2)
unionParent(parent, 2, 3)

if findParent(parent, 2,4):
    print('같은 부모입니다.')
else:
    print('다른 부모입니다.')

 

 

 

 

 

 

 

 

 

# 참고 자료