プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

セグメントツリー(Segment Tree)とは?データ構造の基本と仕組みをわかりやすく解説

セグメントツリーとは

セグメントツリー(Segment Tree)は、配列に対する「区間に関する問い合わせ」と「要素の更新」を高速に処理するためのデータ構造です。本記事では、セグメントツリーが必要とされる背景と、その基本的な構成方法について解説します。

解決したい問題

まず、次のような問題を考えてみましょう。長さ n の配列 arr[0 … n-1] が与えられたとき、以下の2つの操作を効率よく行いたいとします。

  • 区間和の取得:インデックス l から r までの要素の合計を求める(0 ≤ l ≤ r ≤ n-1)
  • 要素の更新:指定したインデックス i の値を新しい値 x に変更する(arr[i] = x、i は 0 ~ n-1 の範囲)

素朴なアプローチの課題

単純な実装では、区間和を求めるたびに l から r までを順番に足し算するため、1回のクエリに O(n) の時間がかかります。一方、あらかじめ累積和を計算しておけば区間和は O(1) で求められますが、要素を更新するたびに累積和を作り直す必要があり、今度は更新操作に O(n) かかってしまいます。

このように、どちらか一方だけを高速化すると、もう一方が遅くなるというトレードオフが生じます。両方の操作をバランスよく高速にこなせるのがセグメントツリーです。

セグメントツリーの構造

セグメントツリーを利用すると、区間和の取得も要素の更新も、どちらも O(log n) の時間で処理できます。ツリーは次のように表現されます。

  • 葉ノード:元の配列の各要素に対応します
  • 内部ノード:子ノード(部分区間)の情報を統合した結果を保持します。統合方法(マージ処理)は扱う問題によって異なりますが、今回は「そのノードの下にあるすべての葉の合計」を表します

具体例:配列 [1, 3, 5, 7, 9, 11]

例として、配列 [1, 3, 5, 7, 9, 11] からセグメントツリーを構築してみましょう。

根ノードには配列全体の合計である 36 が格納されます。その下には、前半区間 [1, 3, 5] の合計 9 と、後半区間 [7, 9, 11] の合計 27 を持つ2つの子ノードがぶら下がります。さらに各区間を半分ずつに分割していくと、最終的に葉ノードには元の配列の要素 1, 3, 5, 7, 9, 11 が並びます。

セグメントツリー(Segment Tree)とは?データ構造の基本と仕組みをわかりやすく解説

計算量のまとめ

  • ツリーの構築:O(n)
  • 区間和クエリ:O(log n)
  • 要素の更新:O(log n)

この特性により、セグメントツリーは競技プログラミングや大規模データに対する範囲集計処理など、更新と参照が頻繁に行われる場面で広く活用されています。また、マージ処理を「合計」から「最小値」「最大値」「GCD」などに置き換えることで、さまざまな種類の区間クエリにも対応可能です。

  1. データ構造の範囲ツリー(レンジツリー)とは?仕組み・kd-treeとの違い・構築方法を解説

    範囲ツリー(range tree)は、点の集合を格納するための順序付き木構造として定義されるデータ構造です。最大の特徴は、指定された範囲内に存在するすべての点を効率的に取得できる点にあり、実務では主に2次元以上の空間で実装されます。範囲ツリーはkd-tree(kd木)とよく似た構造を持っていますが、両者には明確なトレードオフがあります。範囲ツリーはクエリ時間が O(logd n + k) とkd-treeより高速である一方、必要な記憶領域は O(n logd-1 n) と大きくなります。ここで、d は空間の次元数、n は木に格納されている点の総数、k は1回のクエリで取得される点の数を表します

  2. データ構造における高さ制限付きハフマンツリーの基礎と実装上の課題

    高さ・深さ制限付きハフマンツリーとは 高さ(深さ)に制限を設けたハフマンツリーの構成図は、下図のとおりです。 木の深さの制限は一見単純な問題に思われますが、実際のハフマン符号化の実装においては、多くの場合に対処すべき重要な課題となります。 標準的なハフマン構築には深さの制限がない 標準的なハフマン木の構築アルゴリズムは、木の高さや深さを一切制限しません。仮に深さを制限すると、「最適(オプティマル)」な符号 rather ではなくなるためです。ただし、ハフマン木の最大深度はフィボナッチ数列によって理論的な上限が定められており、際限なく深くなることはありません。それでも、実用上望まれる深さを大