[1. 개요]
최소 공통 조상 문제는 보통 트리에서 임의의 두 노드가 있을 때,
두 노드의 공통 조상을 찾는 문제이다.
트리를 대상으로 하기 때문에,
어떤 노드의 부모노드는 단 하나 만 존재하게 된다.
최소 공통 조상을 찾는 방법은 아래와 같다.
- 모든 노드의 Height 를 먼저 계산한다.
- 두 노드의 높이를 맞춘다.
- 두 노드가 서로 같아 질 때 까지 위로 올라 간다.
=> 최대 root 까지 갈 수 있다.
먼저 height 를 계산해야 한다.
- root 노드를 선택한다.
=> root 노드는 임의의 아무 노드나 선택해도 된다.
=> 그 이유는 아래 그림 참조 - root 노드로 부터 DFS 와 같은 그래프 탐색을 이용하여, 모든 노드를 방문한다.
- 이 과정에서 각 노드의 height 를 계산 할 수 있다.
위 그림에서 왼쪽 트리는 root 가 5인 균형잡힌 노드이다.
오른쪽 트리는 왼쪽 트리에서 root 를 1로 했을 때의 모습이다.
즉, 왼쪽 트리와 오른쪽 트리는 본질적으로 같다.
그래서 tree 가 입력으로 주어졌을 때, LCA 를 찾기 위해서 임의의 노드를 root 로 잡아도 된다.
두번째와 세번째 과정은 비슷한 원리로 동작 한다.
sparse table 을 이용하여 빠르게 찾는데,
이 table 을 최초 1회 생성하면,
table 을 이용하여 LCA 를 찾는 과정은 상수 시간에 수렴한다.
sparse table 에 대한 이해는 아래 그림으로 설명 가능하다.
이 그림을 일반화 하면,
u 의 2N 번째 조상 == u 의 2N-1 번째 조상의 2N-1 번째 조상
- 2N = 2 x 2N-1
자세한 구현은 아래 예제1번 링크를 참조하도록 하고,
구현을 한가지 패턴으로 이해하도록 한다.
========= LCA 구현 패턴 ==========
- root 를 1번 노드로 지정하고, dfs 를 진행하여, 각 노드의 높이와 부모 노드 등을 설정한다.
- sparse table 을 구한다.
- u 가 v 보다 root 에 더 가깝도록 한다.
=> 구현 패턴이다.
=> hegihts[u] > hegihts[v] 인 경우, u 와 v 를 swap 한다. - 두 노드 u 와 v 의 높이를 맞춘다.
=> v 가 u 의 높이와 같아지도록, u 를 위로 올린다. - 두 노드 u 와 v 가 서로 같은 경우 바로 종료한다.
=> 반드시 해주도록 한다. - n 값을 30 부터 0 까지 내려가면서 아래 작업을 수행한다.
=> u 와 v 의 2^n 번째 조상이 다른 경우, u 와 v 를 업데이트 한다. - 반복문 종료 후, u 와 v 의 첫번째 조상이 찾고자 하는 LCA 이다.
=> 반드시 수행하도록 한다.
u 와 v 를 통해 접근해야 하는 테이블이 있다면,
이 테이블을 반드시 먼저 접근하고, u 와 v를 업데이트 하도록 한다.
- 당연한 사항이지만, 가끔 실수 할 수 있다고 생각함.
[2. 예제]
- https://testkernelv2.tistory.com/397
=> LCA 구현 방법 자세한 설명 - https://testkernelv2.tistory.com/504
- b
- c
- d
- e
- f
'알고리즘 > 분류' 카테고리의 다른 글
문자열-KMP 관련 솔루션 (0) | 2023.04.21 |
---|---|
SCC 관련 솔루션 (0) | 2022.12.29 |
위상 정렬 솔루션 (0) | 2022.12.27 |
최소신장트리 솔루션 (0) | 2022.12.26 |
플로이드-워셜 솔루션 (0) | 2022.12.25 |