Loading [MathJax]/jax/output/CommonHTML/jax.js

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:data_structure:segment_tree [2019/11/13] – [セグメント木] ikatakosprogramming_algorithm:data_structure:segment_tree [2019/11/13] – [セグメント木] ikatakos
行 4: 行 4:
   * [[http://beet-aizu.hatenablog.com/entry/2017/09/10/132258|セグメント木について - beet's soil]]   * [[http://beet-aizu.hatenablog.com/entry/2017/09/10/132258|セグメント木について - beet's soil]]
  
-区間に対する処理をするときによく使われる。a1,a2,...,anの配列に対し、以下の2つを処理する。(一点更新区間取得)+区間に対する処理をするときによく使われる。a1,a2,...,anの配列に対し、以下を処理する。(一点更新区間取得)
  
   * 区間和のセグメント木(例)   * 区間和のセグメント木(例)
行 24: 行 24:
 例えば区間和なら a+b=cca=b なので、(区間[l,r)の和)=(区間[1,r)の和)(区間[1,l)の和) で求められる。 例えば区間和なら a+b=cca=b なので、(区間[l,r)の和)=(区間[1,r)の和)(区間[1,l)の和) で求められる。
 最小値や最大値はこうはいかない。 最小値や最大値はこうはいかない。
 +
 +数学的には、[[wpjp>モノイド]] であればセグメント木で管理することができるとしている。
 +モノイドとは、例えば「整数全体」と「足し算」のように、ある要素の集合 S とその上での二項演算 の組合せの内、以下の条件を満たすものである。
 +
 +  * 結合律が成り立つ=計算の順序を入れ替えてもいい
 +    * (ab)c=a(bc)
 +  * 単位元が存在する
 +    * S のどんな要素 a に対しても影響を及ぼさない要素 e が存在する
 +    * ae=ea=a
 +
 +結合律が成り立たない例としては、実数と冪乗が挙げられる。(43)2=4096,4(32)=262144
 +
 +単位元が存在しない例としては、自然数と足し算があげられる。
 +
 +ただし、モノイド→セグメント木が利用可能は真だが、逆は必ずしも真でない。
 +例えば単位元が無い自然数上の足し算は、(初期値などに制約はあるが)セグメント木で実装できる。
  
 =====一点更新・区間取得===== =====一点更新・区間取得=====
programming_algorithm/data_structure/segment_tree.txt · 最終更新: by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0