
Fenwickツリー(Binary Indexed Tree)は、1994年にPeter M. Fenwickによって考案されたデータ構造。主に累積和の計算や動的配列における頻繁な部分和を効率的に処理するのに用いられる。この記事ではその背景から実装まで詳しく解説します。
この記事の目次
- Fenwickツリーの定義と目的
- Fenwickツリーの内部仕組み
- Fenwickツリーの比較対象
- Fenwickツリーの実践的活用
- まとめ
Fenwickツリーの定義と目的

Fenwickツリーは、配列上の要素の累積和を高速に取得し、任意の位置での値を更新するために利用される。これは特に大量のデータに対する部分和の計算において有用である。
具体的には、あるインデックスiにおける区間[i]の総和を計算する場合、Fenwickツリーはi以下の各ビットとその直前のビットを含む範囲での部分和を効率的に計算します。また、任意の配列位置での値の変更も高速に処理できます。
Fenwickツリーの内部仕組み

Fenwickツリーは、各要素に対してその直近の2の累乗位置までの範囲を管理します。そのため、部分和の計算では最も最近でかつ最大の2の累乗サイズのブロックにアクセスします。
例えば配列Aが与えられたとき、i番目の部分和S[i]は各A[j] (i & j == j のjについて)の和となります。この操作は、それぞれの数値を加算するための特定のビット位置に基づいて行われます。
Fenwickツリーの比較対象

配列と比較すると、Fenwickツリーは部分和の計算において著しい高速化を達成します。一方で、配列では任意位置での変更が即時ですが、全体の再計算が必要となるため効率が低下します。
Fenwickツリーは逆に頻繁な部分和の取得や区間加算を行う際に優れたパフォーマンスを発揮する。ただし、頻度の低い個別更新であれば、配列の方が適している場合もあります。
Fenwickツリーの実践的活用

Fenwickツリーは、ゲーム開発や財務分析などの場面でその性能が活かされます。たとえば、特定の時間間隔での累積売上の合計を高速に取得したい場合があります。
しかし、個別更新が多い場合は、他のデータ構造を検討するべきです。Fenwickツリーは全体の状況を見据えた最適化において有用であり、その適用範囲は多岐にわたります。
まとめ
総じて、Fenwickツリーは特定の条件下で卓越したパフォーマンスを発揮するが、状況によっては他のデータ構造の方が適している可能性があることを理解しておくことが重要だ。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント