세그먼트 트리, 인터벌 트리, 이진 인덱스 트리 및 범위 트리의 차이점은 무엇입니까?


200

세그먼트 트리, 간격 트리, 이진 색인 트리 및 범위 트리의 차이점은 다음과 같습니다.

  • 핵심 아이디어 / 정의
  • 응용
  • 더 높은 차원 / 공간 소비에서의 성능 / 순서

단지 정의를 제공하지 마십시오.


12
그것은 문제가 아닙니다. 그 질문은 펜윅 나무가 구간 트레스를 일반화하고 내 질문이 더 구체적이고 다르다는 것입니다.
Aditya

7
stackoverflow.com/questions/2795989/… 에서 대답하지 않았습니다. 대답 은 정의를 제공합니다.
Aditya

12
너무 광범위합니까? "x와 y의 차이점은 무엇입니까?" 최대한 명확하고 집중적입니다. 이것은 매우 좋은 질문입니다.
IVlad

16
그리고 어디서나 사용할 수있는 좋은 대답이 없습니다. 좋은 답변은 지역 사회에 좋을 것입니다
Aditya

22
이러한 데이터 구조 (Fenwick 트리 제외)의 대부분은이 PDF에서 "간격, 세그먼트, 범위 및 우선 순위 검색 트리" (DT Lee)로 검토됩니다. 또는이 책에서 "데이터 구조 및 응용 프로그램 핸드북" 장으로 읽을 수 있습니다 .
Evgeny Kluev

답변:


319

이러한 모든 데이터 구조는 다른 문제를 해결하는 데 사용됩니다.

  • 세그먼트 트리는 간격을 저장하고 " 이 간격 중 주어진 지점을 포함하는 간격 "쿼리에 대해 최적화됩니다 .
  • 간격 트리도 간격을 저장하지만 " 이 간격 중 주어진 간격과 어떤 간격이 겹치는 지 "쿼리에 최적화되어 있습니다. 세그먼트 트리와 유사한 포인트 쿼리에도 사용할 수 있습니다.
  • 범위 트리는 점을 저장하고 " 주어진 간격 내에있는 점 "쿼리에 최적화되어 있습니다.
  • 이진 인덱싱 된 트리는 인덱스 당 항목 수를 저장하고 " 인덱스 m과 n 사이에 몇 개의 항목이 있는지 "최적화 합니다.

1 차원의 성능 / 공간 소비 :

  • 세그먼트 트리 -O (n logn) 전처리 시간, O (k + logn) 쿼리 시간, O (n logn) 공간
  • 간격 트리 -O (n logn) 전처리 시간, O (k + logn) 쿼리 시간, O (n) 공간
  • 범위 트리 -O (n logn) 전처리 시간, O (k + logn) 쿼리 시간, O (n) 공간
  • 이진 색인 트리 -O (n logn) 전처리 시간, O (logn) 쿼리 시간, O (n) 공간

(k는보고 된 결과의 수입니다).

사용 시나리오에 데이터 변경 및 쿼리가 모두 포함된다는 점에서 모든 데이터 구조는 동적 일 수 있습니다.

  • 세그먼트 트리 -간격은 O (로그온) 시간에 추가 / 삭제 가능 ( 여기 참조 )
  • 간격 트리 -O (로그온) 시간에 간격을 추가 / 삭제할 수 있습니다
  • 범위 트리 -O (로그온) 시간에 새 포인트를 추가 / 삭제할 수 있습니다 ( 여기 참조 ).
  • 이진 색인 트리 - 색인 당 항목 수를 O (로그온) 시간으로 늘릴 수 있습니다

더 큰 치수 (d> 1) :

  • 세그먼트 트리 -O (n (logn) ^ d) 전처리 시간, O (k + (logn) ^ d) 쿼리 시간, O (n (logn) ^ (d-1)) 공간
  • 간격 트리 -O (n logn) 전처리 시간, O (k + (logn) ^ d) 쿼리 시간, O (n logn) 공간
  • 범위 트리 -O (n (logn) ^ d) 전처리 시간, O (k + (logn) ^ d) 쿼리 시간, O (n (logn) ^ (d-1))) 공간
  • 이진 색인 트리 -O (n (logn) ^ d) 전처리 시간, O ((logn) ^ d) 쿼리 시간, O (n (logn) ^ d) 공간

12
나는 이것으로부터 세그먼트 트리 <간격 트리라는 인상을 실제로 얻습니다. 세그먼트 트리를 선호 할 이유가 있습니까? 예를 들어 구현의 단순성?
j_random_hacker

7
@j_random_hacker : 세그먼트 트리 기반 알고리즘은 간격 쿼리의보다 복잡한 고차원 변형에서 이점이 있습니다. 예를 들어, 축이 아닌 평행선 세그먼트가 2D 창과 교차하는 것을 찾으십시오.
Lior Kogan

5
고마워, 나는 당신이 그것에 대해 줄 수있는 모든 정교함에 관심이 있습니다.
j_random_hacker

3
@j_random_hacker, 세그먼트 트리에는 또 다른 흥미로운 용도가 있습니다. N (전체 N) 시간의 RMQ (범위 최소 쿼리) 여기서 N은 전체 간격 크기입니다.
ars-longa-vita-brevis

1
세그먼트 트리가 O (n log n) 공간 인 이유는 무엇입니까? 그들은 N 잎 + N / 2 + N / 4 + ... + N / 2 ^ (log N)을 저장하며, 내가 잘못하지 않으면이 합계는 O (N)입니다. 또한 @ icc97 answer는 O (N) 공간도보고합니다.
앤트

24

Lior의 답변 에 아무것도 추가 할 수는 없지만 좋은 테이블로 할 수있는 것처럼 보입니다.

한 차원

k 보고 된 결과의 수

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |        n logn |     n logn |         n logn |    n logn |
|Query         |        k+logn |     k+logn |         k+logn |      logn |
|Space         |        n logn |          n |              n |         n |
|              |               |            |                |           |
|Insert/Delete |          logn |       logn |           logn |      logn |

더 높은 차원

d > 1

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |     n(logn)^d |     n logn |      n(logn)^d | n(logn)^d |
|Query         |    k+(logn)^d | k+(logn)^d |     k+(logn)^d |  (logn)^d |
|Space         | n(logn)^(d-1) |     n logn | n(logn)^(d-1)) | n(logn)^d |

이 테이블은 Github Formatted Markdown으로 생성됩니다 . 테이블을 멋지게 포맷하려면 이 요점을 참조하십시오 .


2
보고 된 결과는 무엇을 의미합니까?
Pratik Singhal

@ ps06756 검색 알고리즘은 종종 log (n)의 런타임을 갖습니다. 여기서 n은 입력 크기이지만 로그 시간으로는 수행 할 수없는 n에서 선형 인 결과를 생성 할 수 있습니다 (log (n) 시간에 n 개의 숫자를 출력 할 수 없음) .
oerpli

1
O(n logn) space첫 번째 테이블에 세그먼트 트리가 없어야 합니까?
Danny_ds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.