세그먼트 트리에 관하여

2025. 3. 12. 21:08·algorithm

세그먼트 트리는 구간 쿼리를 효율적으로 처리하기 위한 트리 형태의 자료구조로, 배열 내 특정 범위의 합, 최소값, 최대값 등의 연산을 빠르게 수행할 수 있습니다.


 

1. 세그먼트 트리의 구조

세그먼트 트리는 배열을 구간 단위로 나누어 트리 형태로 표현합니다. 트리의 각 노드는 배열의 특정 구간을 나타내며, 노드의 값은 해당 구간의 연산(합, 최소값 등) 결과를 저장합니다.

  • 장점: 구간 연산을 효율적으로 수행 가능
  • 단점: 메모리 사용량이 높음

2. 세그먼트 트리의 동작 원리

세그먼트 트리는 크게 다음 두 가지 연산을 지원합니다.

구간 질의(Query)

  • 특정 구간에 대한 합, 최소값, 최대값 등의 값을 빠르게 얻을 수 있습니다.

값 갱신(Update)

  • 특정 위치의 값을 변경하면 연관된 모든 노드의 값을 갱신합니다.

3. 시간 복잡도

  • 구간 질의(Query): O(logN)
  • 값 갱신(Update): O(logN)

4. 세그먼트 트리 구현 (Java)

public class SegmentTree {
    private int[] tree;
    private int size;

    public SegmentTree(int[] arr) {
        size = arr.length;
        tree = new int[size * 4];
        buildTree(arr, 0, size - 1, 1);
    }

    private void buildTree(int[] arr, int left, int right, int node) {
        if (left == right) {
            tree[node] = arr[left];
            return;
        }
        int mid = (left + right) / 2;
        buildTree(arr, left, mid, node * 2);
        buildTree(arr, mid + 1, right, node * 2 + 1);
        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }

    public int query(int left, int right) {
        return query(0, size - 1, 1, left, right);
    }

    private int query(int start, int end, int node, int left, int right) {
        if (left > end || right < start) return 0;
        if (left <= start && end <= right) return tree[node];
        int mid = (start + end) / 2;
        return query(start, mid, node * 2, left, right)
                + query(mid + 1, end, node * 2 + 1, left, right);
    }

    public void update(int index, int value) {
        update(0, size - 1, 1, index, value);
    }

    private void update(int start, int end, int node, int index, int value) {
        if (index < start || index > end) return;
        if (start == end) {
            tree[node] = value;
            return;
        }
        int mid = (start + end) / 2;
        update(start, mid, node * 2, index, value);
        update(mid + 1, end, node * 2 + 1, index, value);
        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }
}
public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9, 11};
        SegmentTree segmentTree = new SegmentTree(arr);

        System.out.println(segmentTree.query(1, 3)); // 15

        segmentTree.update(1, 10);

        System.out.println(segmentTree.query(1, 3)); // 22
    }
}

5. 마무리

세그먼트 트리는 효율적인 구간 연산을 제공하며 다양한 알고리즘 문제 해결과 시스템 최적화에 널리 사용됩니다.

  • 범위 합, 최소값, 최대값 쿼리
  • 데이터의 잦은 업데이트 및 질의가 필요한 시스템
  • 경쟁 프로그래밍에서의 효율적인 데이터 처리

 

'algorithm' 카테고리의 다른 글

MST 에 관하여  (0) 2025.03.18
LCA 에 관하여  (0) 2025.03.17
트라이(Trie) 알고리즘에 관하여  (0) 2025.03.08
이분 탐색 + 휴리스틱 기법에 관하여  (0) 2025.02.26
랜덤 액세스 링크드 리스트에 관하여  (0) 2025.02.25
'algorithm' 카테고리의 다른 글
  • MST 에 관하여
  • LCA 에 관하여
  • 트라이(Trie) 알고리즘에 관하여
  • 이분 탐색 + 휴리스틱 기법에 관하여
heejunp
heejunp
희준개발
  • heejunp
    희준개발
    heejunp
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • java (16)
      • spring (1)
        • test (0)
      • web (1)
      • cloud (1)
      • database (2)
      • algorithm (7)
      • OS (2)
      • sonarqube (0)
      • ai (1)
      • 기타 (2)
      • 사고 (1)
      • go (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    heejunp
    세그먼트 트리에 관하여
    상단으로

    티스토리툴바