easyfight   2년 전

안녕하세요. 

다름이 아니라. Union Find할때 

보통 아래와 같은 코드 패턴으로 하는 것으로 알고 있습니다.

그런데 코드의 예제와 같이 (1,2) (3, 4) (2,3) 의 순서로 Union을 한다면

Parent[4]에는 1로 변경되길 기대 했으나, 3으로 남아 있습니다.

질문은 예제와 같은 경우를 방지하기 위해 Union하기 전에 sort를 해서

(1,2)  (2,3) (3, 4) 순서로 만들어 준 후 Union을 해야 하는지 문의 드립니다.

bamgoesn   2년 전

일반적으로 그렇게 하지 않습니다. 그래도 실행 속도가 충분히 빠르기 때문입니다.

어차피 이후 4와 다른 수의 관계를 확인할 일이 생겼을 때 자동적으로 Find(4)가 호출될 것이고, 그러면서 자연스럽게 4의 부모로 그 서브트리의 루트가 알아서 설정될 것이기 때문입니다.

그 한 번은 소요시간이 조금 길 수 있어도, 그 한 번을 지나고 나면 그 후로는 모든 연산이 훨씬 효율적이기 때문에, 전체 실행 시간을 놓고 보면 굉장히 효율이 좋음을 확인할 수 있습니다. 즉, "전체 평균" 퍼포먼스는 매우 좋습니다. (amortized time complexity)

lcr7324   2년 전

Union-find에서 두 원소 x,y가 같은 원소에 있을지 확인할 때는 parent[x]와 parent[y]를 직접 비교하는 것이 아니라 Find(x)와 Find(y)가 같은 값을 반환하는지를 확인합니다.

위 코드를 실행하면 parent[4]는 3이 되지만, if(Find(4) == Find(1)) { // do something! } 같은 코드를 추가한다면 이 if문의 내부는 실행될 것입니다.

댓글을 작성하려면 로그인해야 합니다.