フェンウィックツリーと単純な拡張

フェンウィックツリーと単純な拡張

フェンウィックツリーは唯一のアプリケーションタイプの要約を行うために、詳細に説明しませんでした。

ツリーの一次元アレイ

修正のシングルポイント、クエリーインターバル

フェンウィックツリーメンテナンスはプレフィクス情報、減算することができるプレフィックスクエリ間隔プロパティを直接使用することであるからである。
アラカルトは、後方更新する開始位置からのみ修飾しました。

間隔、問い合わせの単一の点を変更します。

?フェンウィックツリーは修正の一点のみをサポートし、間隔をどのように扱うか、それを修正する
一般的なシングルポイントの修正ルーチンへの変更の範囲を検討:ディファレンシャル
とフロントデフアレイ(N \)\をキーとも起こることは本当です\(V_I \)
すべての私たちは、直接の違いを行うことができます。

間隔を変更し、間隔のクエリ

同様に、第1の差分、間隔変更後の違いは違いはありません。
そして、ここで我々は一点のみが値に対応しますが、直接の間隔に対応しておりません得ることができることを見つける。
我々は間隔のデータを合計する方法を設定するつもりです?構造はよく答えがノーである
:、我々は実際にこれである必要であることが見出さ
\ [\ sum_ {i = L} ^ R {\ sum_ {J = 1} ^ I} {D_J} \]
\(D_J \) 内側の合計のための差分配列が明らかに配列を取得するために、ツリーに直接問い合わせることができますされて
再び外層に対処しますので、どのように?\(\用)再び明らかに不可能である。
我々は再考する必要がありますので:
順序を\( sum_i \)接頭辞と。表す
\ [\開始{アレイ} {C} {\ OperatorName {SUM} [I] = \ sum_ {J = 1} ^ {I} V [J] + \ sum_ {J = 1}を^ {I} \ operatorname {D } [J] *(I-J + 1)} \\ {\ operatorname {和} [I] = \ sum_ {J = 1} ^ {I} V [J] +( I + 1)* \ sum_ {
J = 1} ^ {I} D [J] - \のsum_ {J = 1} ^ {I} D [j] * J} \端{アレイ} \] これだけ行きます同一アレイ、およびその他のメンテナンスの前に接頭辞と元の配列、およびツリーを維持する\(d_jの\倍jは\)フェンウィックツリーのをすることができます。

木の二次元配列

変形の一点、マトリックス問い合わせ

直接シングルポイント、2次元の形とプレフィックスクエリを変更します。

行列の変更、問い合わせのシングルポイント

2次元差分後、各行列は、4箇所に変更する必要が変更することができます。

シングルポイントは、2次元と2次元の接頭フェンウィック木を求めて直接照会します。

修正行列、行列のお問い合わせ

同じ差または第1の2次元マトリクスは、4つの場所で単一の点を変更直接変更することができます。

そして、行列問い合わせ?私たちは、上記と同様の問題が発生しました。

我々はこの方程式を求めていたこの時間は次のようになります。

\ [\ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} \ sum_ {i = K} ^ {N} \ sum_ {J = L} ^ {M} {D_ {K 、L}} \]

列挙は、私のためのGETを変更します。

\ [\ sum_ {k = 1} ^ {N} \ sum_ {L = 1} ^ {M} \ sum_ {i = K} ^ {N} \ sum_ {J = L} ^ {M} D_ {K、 L} \]

この場合には、\(D_ {K、L} \)\(I、Jの\)の独立した、それはのように書き換えることができます。

\ [\ sum_ {k = 1} ^ {N} \ sum_ {L = 1} ^ {M} {D_ {K、L} \倍(N-k + 1)\回(M-L + 1)} \]

習慣のうち、書き込みそれを置きます:

\ [\ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} {D_ {I、J} \倍(N-I + 1)\回(M-J + 1)} \]

解体期間利回りを考えてみます。

\ [\(\ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} D_ {I、J} \右)を左\回(N + 1)\回(M + 1) - \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} iは時間D_ {I、J} \回(M + 1)\ - \ sum_ {i = 1} ^ {N } \ sum_ {J = 1} ^ {M} Jの\回D_ {I、J} \回(N + 1)+、\ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M } i]は\}回Jの\回D_ {I、Jを\します

したがって、上記の1と1次元の場合と同様に、四つの異なるフェンウィックツリーのメンテナンスをすることができます。

概要

ことわざがありますが:すべての操作、達成することができます達成することができ、セグメントツリーフェンウィックの木が
。しかし、非常に多くの場合、まだフェンウィックツリーで、より簡単で、効率的な
フェンウィックツリーはコードの高効率、低難易度と一致しないことができ、ツリーラインを持ち、唯一の欠点は、いくつかの操作フェンウィックツリーアレイツリーを維持するかが難しいということです。
あなたは木を実装するために、配列を使用して主張するので、より多くのことになる場合はケース1次元と2次元の間隔で例えば最も値の問題は、\(ログ\)状況の複雑さは、より二次元になります\(\ログ)複雑に。

そのため、ケースには、ツリーラインを使用しないように、フェンウィックツリーを使用することができます賢明な選択である、結局、フェンウィックツリーの時間と空間の複雑さは、ツリーラインよりも優れています。(最も値の範囲外の場合を除き、この種の問題

おすすめ

転載: www.cnblogs.com/Equinox-Flower/p/11668498.html
おすすめ