세그먼트 트리, 인덱스 트리, 구간합

2023. 3. 23. 18:42·Coding Test/Tree
728x90

1. 세그먼트 트리

주어진 데이터의 구간합과 데이터 업데이트를 빠르게 수행하기 위해 고안해낸 자료구조

 

2. 구간합

합배열(prefix sum)은 업데이트가 느림

  •  arr[1]를  update 한다면 ? sum[1]부터 sum[9]까지 모든 값을 update 해야함 ➔ 느림
  • 데이터의 업데이트가 빈번하게 일어나게 되면 합배열 성능 측면에서 안좋음 ➔ 속도유지를 위해 세그먼트 트리 사용

2. 원리

1) 트리 초기화 하기

⓪ 샘플데이터 {5, 8, 4, 3, 7, 2, 1, 6}

① 리스트 길이

  • 데이터의 개수(N) 이상이 되도록 트리 리스트를 만듬
  • 2ᵏ≥ N을 만족하는 𝑘의 최솟값을 구한 후 2ᵏ * 2
  • N=8이므로 2³ ≥ 8 ➔ 2³ * 2 = 16

② 시작 노드 : 2ᵏ ➔ 2³ = 8

③ 리프 노드에 원본 데이터 채우기

0
1
2
3
4
5
6
7
8
9
10
11
12 13 14 15
                5 8 4
3
7
2
1
6

④ 리프 노드를 제외한 나머지 노드의 값 채우기: 2ᵏ 부터 1번쪽으로

  • 구간합 A[N] = A[2N] + A[2N+1]

0
1
2
3
4
5
6
7
8
9
10
11
12 13 14 15
  36 20 16 13 7 9 7 5 8 4
3
7
2
1
6
  • 최대  A[N] = max( A[2N], A[2N+1])
0
1
2
3
4
5
6
7
8
9
10
11
12 13 14 15
  8 8 7 8 4 7 6 5 8 4
3
7
2
1
6
  • 최소 A[N] = min ( A[2N], A[2N+1])
0
1
2
3
4
5
6
7
8
9
10
11
12 13 14 15
  1 3 1 5 3 2 1 5 8 4
3
7
2
1
6

 

2) 질의값 구하기

질의값 구하는 과정

  1. start_index % 2 == 1 일 때 해당 노드를 선택한다.
  2. end_index % 2 == 0 일 때 해당 노드를 선택한다.
  3. start_index depth 변경 : ( start_index + 1 )/2
  4. end_index depth 변경 : ( end_index + -1 )/2
  5. 1~4을 반복하다가 end_indx < start_index가 되면 종료
1~2에서 노드를 선택했다는 것

해당 노드의 부모가 나타내는 범위가 질의 범위를 넘어가기 떄문에 해당 노드를 질의값에 영향을 미치는 독립 노드로 선택하고,
해당 노드의 부모 노드는 대상 범위에서 제외한다는 뜻

예시

 

 

728x90
저작자표시 (새창열림)
'Coding Test/Tree' 카테고리의 다른 글
  • [2042번] 구간합 구하기 (세그먼트 트리, 리프노드, 값 변경)
  • [11438번] 최소 공통 조상 구하기 (트리, 제곱수 LCA, LCA 시간초과)
  • 최소 공통 조상 빠르게 구하기 (트리, 제곱수 LCA, LCA 시간초과)
  • 트리 (구성 요소, 이진 트리, 세그먼트 트리, 인덱스 트리, 최소공통 조상 LCA)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (460)
      • AI (0)
      • Infra (13)
        • Architecture (2)
        • Kubernetes (5)
        • Docker (3)
        • Cloud (1)
        • DevOps (1)
        • Monitoring (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Spring (19)
      • JPA (4)
      • Language (9)
        • Kotlin (1)
        • Java (8)
      • Git (4)
      • DB (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)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

티스토리툴바