최소 공통 조상 빠르게 구하기 (트리, 제곱수 LCA, LCA 시간초과)

2023. 3. 24. 03:01·Coding Test/Tree
728x90

최소 공통 조상 빠르게 구하기

  • 서로 깊이를 맞춰주거나 같아지는 노드를 찾을 때 기존에 한 단계씩 올려주는 방식에서 2ᵏ씩 올라가 비교하는 방식
  • 기존에 자신의 부모 노드만 저장해 놓던 방식에서 2ᵏ번째 위치의 부모 노드까지 저장해 둬야함

원리

1. 부모 노드 저장 리스트 만들기

  • 부모 노드 리스트 정의 : P[K][N] = N번 노드의 2ᵏ 번째 부모의 노드 번호
내 바로 위에 있는 부모 노드뿐만 아니라, 내 자리에서 2ᵏ 칸 위에 있는 부모가 누군지 저장해놔야함

  • 부모 노드 리스트의 점화식 :  P[K][N] = P[K-1][P[k-1][N]]
예시)
K = 2 N=12 가정

P[2][12] = P[1][P[1][12]]

P[2][12] : 12번 노드의 2²번째 부모 = 1
P[1][12] = 12번 노드의 2¹번째 부모 = 6
P[1][P[1][12]] = (12번 노드의 2¹번째 부모 = 6)의 2¹번째 부모 = 1
 ➔ P[2][12] = P[1][P[1][12]] = P[1][P[0][P[0][12]]]

 ➔ N의 4번째 부모 노드는 N의 2번째 부모 노드의 2번째 부모노드라는 의미
  • 리스트에서 K는 '트리의 깊이 > 2ᵏ'를 만족하는 최댓값
트리의 높이가 100일 때 N의 102번째 부모노드?  ➔ 없음 

예시 트리의 최대 깊이는 5
트리의 깊이 > 2ᵏ ➔ 5 > 2² ➔ K=2

즉, 이 트리의 모든 노드는 2³번째 부모 노드를 지니고 있는 경우는 없음
K \ index
1
2
3
4
5
6
7
8
9
10
11
12 13 14 15
0   1 1 2 2 3 3 4 4 6 6 11 11 13 13
1       1 1 1 1 2 2 3
3
6
6
11
11
2                    
 
1
1
3
3

 

2. 선택된 두 노드의 깊이 맞추기

노드 2와 노드 15의 깊이 맞추기 
노드2의 깊이 : 2, 노드 15의 깊이 : 6
두 노드의 깊이차이 : 4
깊이를 맞추기 위해 더 깊이 있는 노드 15의 4번째 부모 노드를 P 리스트를 이용해 찾음 
4 = 2²이므로 K=2이고, P[2][15] = 3이므로 노드 3으로 이동


높이차이가 2048이라면
기존 한 칸씩 이동하는 LCA 알고리즘 ➔ 2048칸 올라가기
제곱수 LCA ➔ 2048 = 2¹¹이므로 11칸 올라가기

 

3. 최소 공통 조상 찾기

  • 2ᵏ 단위로 점프하면서 맞춤
  • K값을 1씩 감소하면서 P리스트를 이용해 최초로 두 노드의 부모가 달라지는 값 찾음  

 

 

[11438번] 최소 공통 조상 구하기

11438번: LCA 2 첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M

karla.tistory.com

 

 

728x90
저작자표시 (새창열림)
'Coding Test/Tree' 카테고리의 다른 글
  • [2042번] 구간합 구하기 (세그먼트 트리, 리프노드, 값 변경)
  • [11438번] 최소 공통 조상 구하기 (트리, 제곱수 LCA, LCA 시간초과)
  • 세그먼트 트리, 인덱스 트리, 구간합
  • 트리 (구성 요소, 이진 트리, 세그먼트 트리, 인덱스 트리, 최소공통 조상 LCA)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구간합
    DP
    정렬
    그래프
    재귀
    백준
    다익스트라
    힙
    파이썬
    조합
    DFS
    구현
    플로이드워셜
    스택
    동적계획법
    BFS
    자료구조
    최소신장트리
    그리디
    이분탐색
    덱
    최대공약수
    LIS
    알고리즘
    Algorithm
    월간코드챌린지
    최단거리
    큐
    프로그래머스
    트리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
최소 공통 조상 빠르게 구하기 (트리, 제곱수 LCA, LCA 시간초과)
상단으로

티스토리툴바