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


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.