間隔の更新とゼロの数のクエリのデータ構造


13

私は、サイズnの整数テーブルを維持し、時間O (log n )で以下の操作を許可するデータ構造を探しています。tnO(log⁡n)

  • 、 t [ a ] 、t [ a + 1 ] 、… 、t [ b ]を増加させます。increase(a,b)t[a],t[a+1],…,t[b]
  • 、 t [ a ] 、t [ a + 1 ] 、… 、t [ b ]を減少させます。decrease(a,b)t[a],t[a+1],…,t[b]
  • 。これは、 t [ i ] ≠ 0となるようなインデックス iの数を返します。support()it[i]≠0

同じパラメーター使用して、減少するすべての呼び出しを以前の呼び出しと一致させることができるという約束があります。私が念頭に置いているアプリケーションは、時間O (n log n )でn個の与えられた直線長方形の和集合の面積を計算するスイープラインアルゴリズムです。a,bO(nlog⁡n)

四分木のサイズはになるため、解決策ではありません。フェンウィックまたはインターバルツリーには適切なフレーバーがありますが、上記の操作をサポートするためにそれらを拡張する方法はわかりません。Θ(n2)


フェンウィックツリーは、「同じパラメータa、bを使用して増加するすべての呼び出しを以前の呼び出しと一致させることができる」という約束を使用しないため、その約束を使用するより簡単な解決策があるかもしれません(ただし、今のところは回避します)。
— ジェレミー

使用できる入力の数は最大(繰り返しを検出でき、データ構造に挿入できない)なので、一般的なメジャーツリーデータ構造を使用してO (log n )パフォーマンスが得られます。cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/…スライド47-52を参照してください。n2O(log⁡n)
— チャオシュー

ジェレミーとチャオ・シュー。ご意見ありがとうございます。インターバルツリーを使用して、変化する一連のインターバルの結合の全長を維持する方法を理解できました。これは実際、非常にかわいいデータ構造です。
— クリストフデューア

一般的なデータ構造の問題のために検索時間は、スペースを必要とO (P )⊂ O (N 2)ここで、pは座標のアクティブペアのリストのサイズです。しかし、実際にsweeplineアルゴリズムのためのp ∈ O (N )線形空間滞在はそう。問題が引き続きより良いスペースを持つデータ構造のために開いているO (P )と、Plog⁡(n2)∈O(log⁡(n))O(p)⊂O(n2)pp∈O(n)O(p)。p∈ω(n)
— ジェレミー

2
ここでは、同じ問題に他のソリューションに対するあなたの実装をテストすることができます素敵なリンクは次のとおりです。spoj.com/OI/problems/NKMARS
— Erelシーガル-Halevi

回答:


2

セグメントツリーを使用します—範囲より小さい範囲への再帰的なパーティション。更新操作の各間隔[ a 、b ]は、この再帰的パーティションの範囲のO (log n )に分割できます。各範囲[ x 、y ]に保存する場合:[1,n][a,b]O(log⁡n)[x,y]

  • [ x 、y ]が[ a 、b ]が分割される範囲の1つであるように、増加および減少していない間隔[ a 、b ]の数c(x,y)[a,b][x,y][a,b]
  • 再帰の[ x 、y ]以下にある区間の区分サブセットによってカバーされないセルの数u(x,y)[x,y]

次に、が[ x 、z ]と[ z + 1 、w ]に 再帰的に分割される場合、u (x 、y )= { 0 if  c (x 、y )> 0 u (x 、z )+ u (z + 1 、y )それ以外の場合[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
範囲のその他のデータが変更された場合、一定の時間で 各値を更新できます。u (1 、n )を見ると、各サポートクエリに回答できます。u(x,y)u(1,n)

(a,b)[a,b]O(log⁡n)c(x,y)u(x,y)


[x,y][x,y][x,y]u(x,y)=0

[x,y][x,y][x,y]

例を挙げていただけますか?
— jbapple

間隔が数字[1,8]であるとします。再帰的に[1,4]、[4,8]、次に[1,2]、[3,4]、[5,6]、[7,8]、さらにすべて1要素の範囲に分割されます。最初は、すべてがカバーされており、すべてc [x、y] = 0であり、各範囲にはu =その長さがあります。しかし、その後、increase [2,6]操作を実行するとします。[2,6]を分解できるO(log n)最大範囲は[2,2]、[3,4]、および[5,6]であるため、これら3つの値に対してc [x、y]を設定します。私の答えの式によると、これにより、これら3つの範囲のu [x、y]も0になります。u[1,2]は1になり、u [1,4]は1、u [ 5,8] = 2、u [1,8] = 1 + 2 = 3
— デビッドエップシュタイン

0

increasedecreaseO(nlog⁡n)supportO(1)Θ(n)increasedecreaseO(n)abω(log⁡n)


なぜこのアプローチを限界まで取り入れないのでしょうか。バケットに入れる代わりにO(n) 代わりに、次のようなツリーを作成できます。1 / \ 2 3 / \ / \ 4 5 6 7そのうち、更新により、 O(ログ⁡n)すべての操作に対して。
— S. PEK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.