累積和のための Fenwick Tree
一点更新と累積クエリを log n で行います
「累積和のための Fenwick Tree」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
累積和配列が破綻する理由
通常の累積和配列なら区間の合計をすぐに求められますが、1か所更新するだけで再構築が必要です。更新が多いと、処理が遅くなります。⏱️
Fenwick tree の登場
Fenwick tree(BIT)は、点更新と累積クエリの両方を O(log n) で処理できます。動的な累積値を扱うときの定番です。
1始まりの設計
Fenwick tree は 1 始まりの配列で動作します。インデックス 0 を使わない番兵にすることで、実際のデータはすべて位置 1から始まります。
tree = [0] * (n + 1)最下位のセットビットの力
各インデックスは値のブロックを担当します。ブロックのサイズはi & -i、つまり i の最下位のセットビットに等しくなります。この1つの仕組みが木全体を支えています。
lowbit = i & -i1か所を更新する
位置 i に値を加えるには、各ステップでlowbitの分だけ前へ進み、i を含むすべてのブロックを更新します。
while i <= n:
tree[i] += delta
i += i & -i累積和をクエリする
最初の i 個の値を合計するには、各ステップでlowbitを引きながら後ろへ進み、0 に到達するまで繰り返します。
s = 0
while i > 0:
s += tree[i]
i -= i & -iどちらのループも対数時間
各ループは反復するたびに1ビットをオフにするため、実行回数は最大でもlog n回です。これが、更新とクエリの両方を高速に保てる理由です。
2つの累積和から区間和を求める
l から r までの合計が必要ですか?静的な累積和配列と同じように、prefix(r) minus prefix(l-1)を計算します。今回は更新も低コストです。
range_sum = query(r) - query(l - 1)木を構築する
最も簡単な構築方法は、初期値ごとにupdateを呼び出すことです。計算量は O(n log n) で、ほとんどの競技プログラミングに十分な速さです。
for i, v in enumerate(a, 1):
update(i, v)小さなメモリ使用量
Fenwick tree に必要なのは、サイズ n+1 の配列1つだけです。このコンパクトなメモリ使用量も、競技プログラミングで広く使われる理由の1つです。💾
BIT を使う場面
点更新と累積和または区間和のクエリを交互に処理するなら、Fenwick tree を選びます。短く実装でき、これに勝る方法はなかなかありません。
確認問題
ループがどのように移動するかを確認しましょう。
振り返り:BIT の基本
Fenwick treeを学びました。1 始まりで、i & -i を利用し、点更新と累積クエリをどちらも O(log n) で処理します。次はこれを使って転倒数を数えます。🎯
よくある質問
「累積和のための Fenwick Tree」レッスンは無料ですか?
はい。「累積和のための Fenwick Tree」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「累積和のための Fenwick Tree」で何を学びますか?
一点更新と累積クエリを log n で行います ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「累積和のための Fenwick Tree」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 累積和のための Fenwick Tree
- BIT による転倒数
- セグメント木: 構築とクエリ
- 範囲更新の遅延伝播