Menunjukkan bahwa interval-jumlah kueri pada array biner tidak dapat dilakukan dengan menggunakan ruang linear dan waktu konstan


8

Anda diberi array biner berukuran- .n

Saya ingin menunjukkan bahwa tidak ada algoritma yang dapat melakukan hal berikut (atau terkejut dan mengetahui bahwa algoritma tersebut ada):

1) Pra-proses array input menggunakan waktu tidak terbatas, tetapi hanya menggunakan bit .O(n)

2) Jawab pertanyaan dalam waktu konstan, di mana permintaan meminta jumlah bit yang diatur antara indeks dan indeks dalam array.x y(x,y)xy

Tampaknya waktu konstan per kueri seharusnya tidak memungkinkan algoritma membaca informasi yang cukup untuk menghitung jumlah bit yang ditetapkan.

Bagaimana kita dapat membuktikan bahwa tidak ada algoritma seperti itu?

Pertanyaan yang lebih umum adalah,

mengingat bahwa algoritma diizinkan untuk menggunakan ruang , apa batas bawah pada waktu kueri yang dapat kita peroleh?f(n)

Jelas, jika kita memiliki ruang kita dapat menyimpan semua jumlah parsial dan menjawab pertanyaan dalam , tetapi bagaimana jika lebih kecil?O ( 1 ) ff=Ω(nlogn)O(1)f


Anda dapat mengasumsikan bahwa ukuran kata memori adalah dan kita dapat membaca indeks dalam waktu konstan.x , yΘ(logn)x,y


@ EmilJeřábek - Saya ingin algoritma menggunakan bit (linear dalam ukuran input), bukan O ( n ) kata memori. Apakah ini masuk akal? O(n)O(n)
RB

2
Begitu ya, terima kasih atas klarifikasi. Sekarang, pertanyaan lain: operasi apa yang dapat Anda lakukan dalam waktu yang konstan pada kata-kata memori? Berikut ini adalah kandidat algoritma: pisahkan array dalam -ukuran blok, dan untuk setiap blok b , simpan konten b sebagai satu kata, dan hitung bit yang diset sebelum b sebagai kata lain. Ini menghasilkan O ( n ) bit. Setiap kueri dapat dijawab dengan memeriksa empat kata, dan dapat dihitung menggunakan operasi O ( 1 ) pada kata-kata ini seperti shift, pengurangan, dan (yang paling penting) jumlah populasi. Apakah model Anda mengizinkan ini? (logn)bbbO(n)O(1)
Emil Jeřábek

@ EmilJeřábek - Saya hanya memiliki operasi aritmatika, pengindeksan dan pencarian bit (yaitu, mencari bit tertentu dari kata) dalam pikiran. Operasi bit standar seperti shift juga dapat dipertimbangkan. Saya setuju bahwa jika kita bisa menghitung jumlah bit yang ditetapkan dalam maka algoritma Anda memang memecahkan masalah. O(1)
RB

Masalahnya berasal dari algoritme yang kami bangun untuk permintaan interval-jumlah atas jendela geser. Artinya, kami memiliki aliran bilangan bulat, masing-masing dalam dan kami ingin memperkirakan jumlah interval yang diberikan. Masalah kita kemudian berkurang menjadi jumlah interval yang tepat pada array biner (jauh lebih kecil) (yang juga `` slide ''). Untuk jendela geser biner berukuran n , kami menggunakan bit O ( n ) , menambahkan bit dalam waktu konstan diamortisasi dan melakukan kueri dalam O ( log n ) . Saya bertanya-tanya apakah permintaan waktu konstan layak, bahkan jika array tidak diperbarui. 0,1,,RnO(n)O(logn)
RB

@ EmilJeřábek - terima kasih atas saran dan analisis Anda! Ini bisa menjadi jawaban untuk pertanyaan itu, meskipun itu tidak sepenuhnya menjawab kebutuhan kita. Ruang bit merupakan kendala sulit bagi kami, dan kami ingin menunjukkan bahwa tidak ada algoritma yang dapat menjawab pertanyaan dalam waktu konstan. O(n)
RB

Jawaban:


6

Saya percaya bahwa yang Anda cari adalah struktur data yang ringkas yang mendukung operasi peringkat. Lihat...

https://en.m.wikipedia.org/wiki/Succinct_data_structure

Khususnya, Anda dapat memodifikasi solusi Emils (pertama) untuk menghapus operasi penghitungan pop dan menggantinya dengan tabel pencarian (untuk detailnya lihat artikel wiki). Dengan mengurangi ukuran blok menjadi (log n) / 2 bit, tabel pencarian menggunakan o (n) bit.


(* facepalm *) Tabel pencarian, jelas. Kenapa aku tidak memikirkan itu.
Emil Jeřábek

Mengingat komentar OP di atas, perlu dicatat bahwa struktur dapat dengan mudah diimplementasikan sebagai jendela geser sehingga memindahkan jendela dengan satu bit (atau bahkan blok) juga membutuhkan waktu yang konstan.
Emil Jeřábek

@ EmilJeřábek - menerjemahkan solusi Anda ke pengaturan jendela geser tidak lurus ke depan. Alih-alih menghitung jumlah bit set di seluruh array-bagian yang mendahului blok saat ini, kita perlu menghitung jumlah bit set dalam jendela geser yang mendahului blok ini, yang tampaknya tidak bisa dilakukan dalam waktu konstan. Apakah saya kehilangan sesuatu?
RB

Tidak, kamu tidak perlu melakukan itu. Karena Anda pada akhirnya akan mengurangi jumlah untuk dari jumlah untuk y , tidak masalah jika semua jumlah yang disimpan dimatikan dengan jumlah yang tetap; dengan kata lain, tepi kiri jendela geser dapat diberi jumlah yang sewenang-wenang. Dengan demikian, saat memindahkan jendela, Anda hanya perlu memperbarui hitungan untuk blok tempat elemen baru berada. Dari waktu ke waktu, Anda perlu mengurangi semua penghitungan agar tidak menempati terlalu banyak ruang, tetapi pekerjaan kecil ini dapat dengan mudah didistribusikan sehingga hanya membutuhkan O (1) waktu untuk setiap kueri yang diberikan. xy
Emil Jeřábek

Sebenarnya, gangguan pada kalimat terakhir dapat dihindari secara elegan dengan menghitung semua jumlah modulo angka tetap lebih besar dari . n
Emil Jeřábek

6

Saya tidak akan begitu yakin algoritma seperti itu tidak ada; pasti ada algoritma yang sangat dekat. Di bawah ini, adalah log 2 n , log ( k ) n adalah log ... log k  kali n , log n adalah logaritma iterated , dan ˜ O ( t ( n ) ) adalah O ( t ( n ) polylog ( t ( n )lognlog2nlog(k)nloglogk timesnlognO~(t(n)) .O(t(n)polylog(t(n)))

Proposisi: Ada algoritma yang mencapai

  1. ruang dan permintaan waktu O ( 1 ) untuk konstanta k ;O(nlog(k)n)O(1)k

  2. spasi dan waktu kueri ˜ O ( log n ) .O(n)O~(logn)

Algoritma bekerja sebagai berikut. Ada parameter dan n = b 0 > b 1 > > b k > 0 tergantung pada n . Kami membagi ukuran input- b 0 array menjadi ukuran- b 1 blok (level 1); kami membagi setiap blok level-1 menjadi ukuran b 2 blok (level 2); dan seterusnya hingga level k . (Mari kita berpura-pura semua b i adalah kekuatan dari 2 , masalah menghindari dengan keterbagian.) Lalu:k>0n=b0>b1>>bk>0nb0b1b2kbi2

  • Untuk setiap dan setiap blok level- i , kami menyimpan jumlah bit yang ditetapkan dalam interval dari awal blok ke batas level blok- ( i - 1 ) terdekat .i=1,,ki(i1)

  • Untuk menyelesaikan query, kita menjumlahkan nomor disimpan sesuai dengan indeks, dan menghitung set bit sebelum indeks di tingkat-nya k blok. Kami melakukan semua ini untuk x dan y secara terpisah, dan kurangi hasilnya.kkxy

(Jika parameter tidak mudah dihitung, kami mungkin juga menyimpannya.)bi

Ini ruang menggunakan pengaturan dan kueri waktu O(k+bk).

ni=1klogbi1bi,
O(k+bk).

Dalam proposisi, untuk 1., kita membiarkan menjadi konstan, dan menempatkan b i = log ( i ) n untuk 0 < i < k , b k = 1 .kbi=log(i)n0<i<kbk=1

k=logn

bi=i(logi)3log(i)n.
ni=1klog(i)n+2logii(logi)3log(i)nni=13i(logi)2=cn
c

2

O(n)n(1+o(1))

n{1,2,,n}ithi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.