Saya mencari struktur data yang akan mempertahankan tabel integer ukuran n , dan memungkinkan operasi berikut dalam waktu O ( log n ) .
- , yang meningkatkan t [ a ] , t [ a + 1 ] , … , t [ b ] .
- , yang berkurang t [ a ] , t [ a + 1 ] , … , t [ b ] .
- , yang mengembalikan jumlah indeks i sedemikian rupa sehingga t [ 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 ) 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.
ds.data-structures
cg.comp-geom
Christoph Dürr
sumber
sumber
Jawaban:
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]
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]
sumber
Anda dapat mendukungmeningkat dan mengurangi di O ( n--√catatann ) 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.
sumber