【セグメントツリー】

セグメントツリー とは?

💡 「この範囲の合計は?」に一瞬で答える区間クエリの達人
📌 このページのポイント
セグメントツリー(区間合計の例) 36 [0-7] 10 [0-3] 26 [4-7] 3 7 11 15 1 2 3 4 5 6 7 8 クエリ [2-5] → 3+7+11 ではなく 7+11 = 18 …O(log n)! 配列 [1, 2, 3, 4, 5, 6, 7, 8] → 親ノードに区間の合計を保持
セグメントツリーと配列の対応イメージ
ひよこ ひよこ

セグメントツリーって普通の配列と何が違うの?

ペンギン先生 ペンギン先生

普通の配列で「3番目から7番目までの合計は?」と聞かれたら、1個ずつ足していくからO(n)かかる。セグメントツリーなら事前にツリーで区間の情報をまとめておくから、O(log n)で答えられるんだよ

ひよこ ひよこ

どうやってツリーにまとめるの?

ペンギン先生 ペンギン先生

配列の各要素を葉ノードにして、親ノードに「子2つの合計」や「子2つの最小値」を持たせるんだ。根に近いほど広い区間をカバーしていて、必要な区間だけをたどれば答えが出るよ

ひよこ ひよこ

値が変わったらツリー全体を作り直すの?

ペンギン先生 ペンギン先生

いや、変わった要素から根までのパスだけ更新すればいい。木の高さはlog nだから、更新もO(log n)で済むんだ。これが配列を毎回再計算するより圧倒的に速いポイントだよ

ひよこ ひよこ

遅延伝播っていうのも聞いたことあるけど…

ペンギン先生 ペンギン先生

「3番目から100番目まで全部+5して」みたいな区間一括更新のとき、全ノードを即座に更新せず「あとで反映するメモ」を残しておくテクニックだよ。必要なときだけメモを解消するから、区間更新もO(log n)で処理できるんだ

ひよこ ひよこ

実際どんな場面で使われるの?

ペンギン先生 ペンギン先生

競技プログラミングでは超頻出だし、実務ではデータベースの範囲検索インデックスや、ゲームのダメージ計算、地理情報の区間クエリなどに応用されるよ。知っておくとアルゴリズムの引き出しが一気に広がるデータ構造だね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「セグメントツリー」って出てきたら「配列の任意区間の問い合わせを高速処理するツリー」と思えればだいたいOK!
📖 おまけ:英語の意味
「Segment Tree」 = 区間木
💬 Segment(区間・部分)とTree(木)で、区間ごとの情報を木構造にまとめたものだよ
← 用語集にもどる