Struktur data untuk pembaruan pada interval dan jumlah kueri nol

13

Saya mencari struktur data yang akan mempertahankan tabel integer ukuran n , dan memungkinkan operasi berikut dalam waktu O ( log n ) .tnO(logn)

  • , yang meningkatkan t [ a ] , t [ a + 1 ] , , t [ b ]increase(a,b)t[a],t[a+1],,t[b] .
  • , yang berkurang t [ a ] , t [ a + 1 ] , , t [ b ]decrease(a,b)t[a],t[a+1],,t[b] .
  • , yang mengembalikan jumlah indeks i sedemikian rupa sehingga t [ i ] 0support()it[i]0 .

Anda memiliki janji bahwa setiap panggilan untuk mengurangi dapat dicocokkan dengan panggilan sebelumnya untuk meningkat dengan parameter yang sama . Aplikasi yang ada dalam pikiran saya adalah algoritma sweepline untuk menghitung waktu O ( n log n )a,bO(nlogn) area persatuan n yang diberikan persegi bujursangkar.

Quad-tree akan memiliki ukuran , jadi itu bukan solusi. Pohon Fenwick atau Interval memiliki cita rasa yang tepat, tetapi saya tidak melihat cara memperpanjangnya untuk mendukung operasi di atas.Θ(n2)

Christoph Dürr
sumber
Pohon Fenwick tidak akan menggunakan janji bahwa "setiap panggilan untuk dikurangi dapat dicocokkan dengan panggilan sebelumnya untuk meningkatkan dengan parameter yang sama a, b", jadi mungkin ada solusi yang lebih sederhana menggunakan janji itu (tapi itu lolos saya untuk saat ini).
Jeremy
Karena jumlah input yang Anda miliki paling banyak (Anda dapat mendeteksi pengulangan dan tidak memasukkan ke dalam struktur data), kami masih mendapatkan kinerja O ( log n ) menggunakan struktur data tree ukuran umum. Lihat cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… slide 47-52. n2O(logn)
Chao Xu
Jérémie dan Chao Xu. Terima kasih atas komentar Anda. Saya mengerti sekarang bagaimana Pohon Interval dapat digunakan untuk mempertahankan panjang total penyatuan satu set interval yang berubah. Ini sebenarnya struktur data yang sangat lucu.
Christoph Dürr
Untuk masalah struktur data umum, pencarian dalam waktu membutuhkan ruang O ( p ) O ( n 2 ) di mana p adalah ukuran daftar pasangan aktif pasangan koordinat. Tetapi memang untuk algoritma sweepline p O ( n ) sehingga ruang tetap linier. Masalahnya masih terbuka untuk struktur data dengan ruang yang lebih baik daripada O ω ( n ) .log(n2)O(log(n))O(p)O(n2)ppO(n) , ketika halO(p)pω(n)
Jeremy
2
Berikut adalah tautan yang bagus di mana Anda dapat menguji implementasi Anda terhadap solusi lain untuk masalah yang sama: spoj.com/OI/problems/NKMARS
Erel Segal-Halevi

Jawaban:

2

Gunakan pohon segmen - partisi rekursif rentang ke dalam rentang yang lebih kecil. Setiap interval [ a , b ] dari operasi pembaruan Anda dapat dipartisi ke dalam O ( log n ) dari rentang dalam partisi rekursif ini. Untuk setiap rentang [ x , y ] toko:[1,n][a,b]O(logn)[x,y]

  • Jumlah interval [ a , b ] yang telah meningkat dan tidak menurun sedemikian rupa sehingga [ x , y ] adalah salah satu rentang ke mana [ a , b ]c(x,y)[a,b][x,y][a,b] dipartisi
  • Jumlah sel yang tidak tercakup oleh subset interval interval yang berada pada [ x , y ] atau lebih rendah dalam rekursiu(x,y)[x,y]

Maka jika secara rekursif dibagi menjadi [ x , z ] dan [ z + 1 , w ] kita memiliki u ( x , y ) = { 0 jika  c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) jika tidak[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
sehingga kami dapat memperbarui setiap dalam waktu konstan ketika data lainnya untuk suatu rentang berubah. Setiap permintaan dukungan dapat dijawab dengan melihat u ( 1 , n ) .u(x,y)u(1,n)

(a,b)[a,b]O(logn)c(x,y)u(x,y)

David Eppstein
sumber
[x,y][x,y][x,y]u(x,y)=0
[x,y][x,y][x,y] di dalam partisinya) itu berkurang.
David Eppstein
Bisakah Anda memberi contoh?
jbapple
Misalkan interval Anda adalah angka [1,8]. Secara rekursif dibagi menjadi [1,4], [4,8], kemudian [1,2], [3,4], [5,6], dan [7,8], kemudian semua rentang satu elemen. Awalnya, semuanya terbuka, semua c [x, y] = 0, dan setiap rentang memiliki u = panjangnya. Namun, misalkan Anda melakukan operasi peningkatan [2,6]. Rentang maksimal O (log n) di mana [2,6] dapat diuraikan adalah [2,2], [3,4], dan [5,6], jadi kami menetapkan c [x, y] untuk ketiga berkisar ke 1. Menurut rumus dalam jawaban saya, ini menyebabkan u [x, y] untuk ketiga rentang ini juga menjadi 0. u [1,2] menjadi 1, u [1,4] juga menjadi 1, u [ 5,8] = 2, dan u [1,8] = 1 + 2 = 3
David Eppstein
0

Anda dapat mendukung meningkat dan mengurangi di HAI(ncatatann) dan dukung di O(1) time. The key idea is to break up the table into groups of size Θ(n). Then each modifying operation (increase or decrease) operates on at most O(n) groups, and only the ones near the end of its range (a and b, in your formulation) take ω(logn) time.

jbapple
sumber
Why not take this approach to the limit. Instead of bucketing into O(n) buckets, we can instead form a tree similar to this: 1 / \ 2 3 / \ / \ 4 5 6 7 Of which, by updating, you take O(logn) for all operations.
S. Pek