セグメントツリー、インターバルツリー、バイナリインデックス付きツリー、レンジツリーの違いは何ですか?


200

セグメントツリー、インターバルツリー、バイナリインデックスツリー、レンジツリーの違いは次のとおりです。

  • 重要なアイデア/定義
  • 用途
  • より高い次元でのパフォーマンス/順序/スペース消費

単に定義を与えないでください。


12
それは重複ではありません。その質問は、フェンウィックツリーが間隔トレスの一般化であるかどうかであり、私の質問はより具体的で異なります。
Aditya 2013

7
それはstackoverflow.com/questions/2795989/…で回答されていません。そこでの回答は定義を与えるだけです。
Aditya 2013

12
広すぎますか?「xとyの違いは何ですか?」できるだけ明確で焦点が合っています。これは非常に良い質問です。
IVlad 2013

16
そして、これをどこででも利用できる良い答えはありません。良い答えはコミュニティにとって素晴らしいでしょう
Aditya 2013

22
(フェンウィックの木を除く)これらのデータ構造のほとんどは、このPDFで検討されている:「間隔、セグメント、レンジ、および優先検索ツリー」(DT・リー)。または、この本の「データ構造とアプリケーションのハンドブック」の章として読むこともできます。
Evgeny Kluev 2013

回答:


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(logn)時間で間隔を追加/削除できます(ここを参照)
  • 間隔ツリー -間隔はO(logn)時間で追加/削除できます
  • 範囲ツリー -O(logn)時間で新しいポイントを追加/削除できます(ここを参照)
  • バイナリインデックス付きツリー - インデックスあたりのアイテム数はO(logn)時間で増やすことができます

高次元(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 2013

7
@j_random_hacker:セグメントツリーベースのアルゴリズムは、間隔クエリの特定のより複雑な高次元のバリアントに利点があります。たとえば、どの非軸平行線分が2Dウィンドウと交差するかを見つけます。
Lior Kogan 2013

5
おかげで、私はあなたがそれについて与えることができるどんな詳細にも興味があります。
j_random_hacker 2013

3
@j_random_hacker、セグメントツリーには別の興味深い用途があります。O(log N)時間でのRMQ(範囲最小クエリ)で、Nは全体の間隔サイズです。
ars-longa-vita-brevis 2014

1
なぜセグメントツリーはO(n log n)スペースなのですか?彼らはN個の葉+ N / 2 + N / 4 + ... + N / 2 ^(log N)を保存し、私が間違っていない場合、この合計はO(N)です。また、@ icc97回答はO(N)スペースも報告します。
Antの

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で作成されます-テーブルを適切にフォーマットする場合は、このGistを参照してください。


2
報告された結果とはどういう意味ですか?
Pratik Singhal、2016

@ ps06756検索アルゴリズムは、多くの場合、log(n)のランタイムを持ちます。ここで、nはinputsizeですが、nに線形の結果を生成できますが、対数時間では実行できません(log(n)時間でn個の数値を出力することはできません)。 。
oerpli

1
セグメントツリーはO(n logn) space最初のテーブルにあるべきではありませんか?
Danny_ds 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.