HJW's IT Blog

Algorithm: Segment Tree 본문

알고리즘

Algorithm: Segment Tree

kiki1875 2023. 4. 14. 16:51

Segment Tree는 배열과 같은 자료구조에서 주어진 구간의 질의를 빠르게 처리하기 위해 사용되는 자료구조 이다.

Segment Tree는 트리구조를 사용하여 구간을 나누어 저장하며 각 노드는 자식노드들의 정보를 이용하여 자신의 정보를 계산한다.

다음은 segment tree 의 예제인데, 노드 내부의 숫자는 어디서부터 어디까지의 합을 나타내는지를 보여준다

Segment Tree

Segment Tree 에서 

    - 리프노드: 배열의 수 그 자체

    - 다른 노드: 왼쪽, 오른쪽 자식의 합

 

Segment Tree로 특정구간 [a,b] 의 합을 구하려면 다음을 점검한다.

  • [a,b] 와 [left, right] 이 겹치지 않는다
    • do nothing
  • [a,b] 가 [left, right] 을 포함
    • 미리 구해둔 [left, right]의 합을 사용
  • [a,b] 를 [left, right]가 포함된다
    • 두 자식 노드에 대해 정확히 어느 노드가 [left,right]을 포함하는지 찾는다
  • [a,b]가 [left, right]와 포함관계는 없지만 겹친다.
    • 두 자식 노드에 대해 정확히 어느 노드가 [left,right]을 포함하는지 찾는다

점 위의 선분 세기

  • 이 알고리즘은 2차원 평면에서 주어진 선분들 중에서 특정 점 위에 몇 개의 선분이 있는지를 세는 문제이다
  • 다음과 같은 선분들의 예가 있다
  •  

  • 이때, 시작과 끝 지점을 기준으로 2차원 평면을 나눈다. 
  •  

  • 이를 세그먼트 트리로 나타내면 다음과 같다
  •  

  • 각 노드는 해당 구간에 몇개의 선분이 있는가를 저장하고 있다.

'알고리즘' 카테고리의 다른 글

Algorithm: Kruskal Algorithm & Binary Search  (0) 2023.04.17
Algorithm: Binary Search  (0) 2023.04.15
Algorithm: 욕심쟁이 기법  (0) 2023.04.14
Algorithm: 과반수 찾기  (0) 2023.04.14
Algorithm: 트리 지름  (0) 2023.04.14