최소 공통 조상 예제 - 2

문제 분석

  • 노드의 개수와 질의의 개수가 매우 커졌다.

  • 일반적인 최소 공통 조상 구하기 방식으로 해결하려고 하면 시간 초과가 발생한다.

  • 제곱수 형태를 이용한 빠르게 최소 공통 조상 구하기 방식으로 문제를 해결해본다.

손으로 풀어보기

  1. 인접 리스트로 트리 데이터를 구현한다.

  2. 탐색 알고리즘(BFS 또는 DFS)을 이용해 각 노드의 깊이와 바로 위 부모 노드를 구한다.

img_7.png
  1. 점화식을 이용해 Parent 배열(부모 노드 배열)을 구한다.

    • 부모 노드 배열 점화식

    • P[K][N] = P[K - 1][P[K - 1][N]]

img_8.png
  1. 예를 들어 15와 8의 최소 공통 조상을 찾아보면, 깊이가 큰 노드는 Parent 배열을 이용해 2^k만큼 빠르게 이동시켜 깊이를 맞춘다. 깊이가 2만큼 차이나므로 15번 노드를 15의 2^1번째 부모 노드인 5로 변경해 깊이를 맞춘다. 한 칸씩 오르는 것이 아닌 2의 제곱수로 빠르게 올라간다.

  2. 부모 노드로 올라가면서 최소 공통 조상을 찾는다. Parent 배열을 이용해 2^k만큼 넘어가면서 찾는 것이 핵심이다. k는 depth의 최댓값에서 1씩 감소한다.

img_9.png

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated