web-dev-qa-db-ja.com

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

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

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

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

177
Aditya

これらのデータ構造はすべて、さまざまな問題を解決するために使用されます。

  • セグメントツリーは間隔を保存し、「これらの間隔に特定のポイント」が含まれるクエリに最適化されます。
  • 間隔ツリーも間隔を保存しますが、これらの間隔が指定された間隔と重複する(最適化 」クエリ。セグメントツリーと同様に、ポイントクエリにも使用できます。
  • Range treeはポイントを保存し、「どのポイントが指定されたinterval」クエリ内に収まるように最適化されます。
  • バイナリインデックスツリーはインデックスごとにアイテム数を保存し、「インデックス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) space
  • Binary Indexed tree-O(n logn)前処理時間、O(logn)クエリ時間、O(n)スペース

(kは報告された結果の数です)。

使用シナリオにデータの変更とクエリの両方が含まれるという意味で、すべてのデータ構造は動的にすることができます。

  • セグメントツリー-O(logn)時間で間隔を追加/削除できます( here を参照)
  • 間隔ツリー-O(logn) timeで間隔を追加/削除できます
  • 範囲ツリー-O(logn) timeで新しいポイントを追加/削除できます( here を参照) )
  • Binary Indexed tree-インデックスあたりのアイテム数はO(logn) timeで増加できます

高次元(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)))スペース
  • Binary Indexed tree-O(n(logn)^ d)前処理時間、O((logn)^ d)クエリ時間、O(n(logn )^ d)スペース
285
Lior Kogan

Lior's answer に何かを追加できるわけではありませんが、良いテーブルでできるようです。

一次元

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 を参照してください。

21
icc97