可変2D配列のプレフィックス合計


8

M[n][n]整数の2D配列があるとしましょう(実際、バイナリは問題ありませんが、問題ではないかと思います)。次の形式のクエリの繰り返しに興味があります。座標ペア与えられた場合、は何 もちろん、これらの値はすべて合計時間で計算でき、その後、クエリはます。ただし、私の配列は変更可能であり、値を変更するたびに、明らかな解決策として更新が必要です。k,l

i=0k1j=0l1M[i][j]?
O(n2)O(1)O(n2)

上に四分木を作成できますM。前処理にかかる、これは私たちが行うことができ、クエリで、およびアップデートで。O(n2log(n))O(nlog(n))O(log(n))

私の質問は:

更新をあまり犠牲にすることなく、クエリを大幅に改善できますか?

特に、更新操作とクエリ操作の両方を準線形にしたり、特に両方をしたりすることに興味があります。O(nϵ)

編集:詳細については、この制限なしでも問題は興味深いと思いますが、大まかにクエリを実行し、更新することを期待しています。理想的な目標は、実行時間全体を約です。したがって、クエリがをするのに、更新がをする状況も興味深いでしょう。O(n3)O(n2)O(n3+ϵ)O(nlog(n))O(log(n))


1
2Dフェンウィックツリー(別名BITツリー)を使用すると、更新とクエリの両方を O(logn)時間。それを説明するページがあります:geeksforgeeks.org/…。免責事項:私はこれがどのように機能するかを完全に理解していません。
j_random_hacker 2018年

回答:


3

各クエリと各更新を次の場所で実行できる比較的簡単なソリューションがあります O(log2n)時間。データ構造はO(n2) スペース。

私たちは lgn データ構造の「粒度」、2の累乗ごとに1つ 2m そのような 12mn。細分性のためのデータ構造2m 合計を保存する

i=k02m(k0+1)2m1j=0l1M[i,j]

それぞれに k0,l。細分性のためのこのデータ構造2m 順番に表すことができます n/2m バランスの取れたツリー(可能な値ごとに1つ) k0)プレフィックスの合計を保存します。

次に、プレフィックスの合計を調べます k,l、間隔を分割します [0,k1]2のべき乗の長さの間隔の和集合に。せいぜいlgn間隔が必要です。そのような長さの間隔ごとに2m、粒度のデータ構造を検索します 2m。したがって、クエリは次のようにして答えることができますO(logn) バランスの取れたツリーへのルックアップ。 O(logn) 時間、合計時間 O(log2n) クエリごと。

更新はまたで行うことができます O(log2n)時間。更新するにはM[i,j]、粒度ごと 2m、粒度のデータ構造で適切なバランスツリーを更新します。 2m。これはO(logn) oinを更新する O(logn)バランスの取れた木; そのようなそれぞれのO(logn) 時間なので、合計時間は O(log2n) 時間。

最後に、粒度のデータ構造 2m 含む n/2m 樹木、それぞれ O(n) スペースなので、合計スペース使用量は O(n2(1+1/2+1/4+))=O(n2)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.