fineman999 / Algorithm

알고리즘 공부
0 stars 0 forks source link

이론: 세그먼트 트리 #215

Closed fineman999 closed 1 year ago

fineman999 commented 1 year ago

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

fineman999 commented 1 year ago

세그먼트 트리의 핵심 이론

fineman999 commented 1 year ago

1. 트리 초기화 하기

fineman999 commented 1 year ago

트리 높이 구하는 방법

2의 k승 >= N을 만족하는 k의 최솟값을 구한 후 (2의 k승) 2를 트리 배열의 크기로 정하면 됨 예로 N이 8이면 k는 3이 되고 배열의 크기는 (2의 3승) 2 = 16이 된다.

fineman999 commented 1 year ago

리프 노드에 샘플 데이터 넣기

samples = [5, 8, 4, 3, 7, 2, 1, 6]

은 어디에 넣을까 처음에 구한 값 2의 k승이 start index값이다. ex 2의 3 = 8 8부터 시작

    start_index = int(math.pow(2, k))
    cnt = 0
    while cnt < len(samples):
        graph[start_index + cnt] = samples[cnt]
        cnt += 1
fineman999 commented 1 year ago

나머지 노드 데이터 넣기

fineman999 commented 1 year ago

2. 질의값 구하기

fineman999 commented 1 year ago

질의값 구하는 과정

  1. start_index % 2 == 1일 때 해당 노드를 선택한다.
  2. end_index % 2 == 0 일 때 해당 노드를 선택한다.
  3. start_index depth 변경: start_index = (start_index + 1) / 2 연산을 실행한다.
  4. end_index depth 변경: end_index = (end_index -1) / 2 연산을 실행한다.
  5. 1 ~ 4를 반복하다가 end_index < start_index가 되면 종료한다.
fineman999 commented 1 year ago

설명