Anda diberi array biner berukuran- .
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 .
2) Jawab pertanyaan dalam waktu konstan, di mana permintaan meminta jumlah bit yang diatur antara indeks dan indeks dalam array.x y
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?
Jelas, jika kita memiliki ruang kita dapat menyimpan semua jumlah parsial dan menjawab pertanyaan dalam , tetapi bagaimana jika lebih kecil?O ( 1 ) f
Anda dapat mengasumsikan bahwa ukuran kata memori adalah dan kita dapat membaca indeks dalam waktu konstan.x , y
Jawaban:
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.
sumber
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 )catatann catatan2n catatan( k )n log ... logk kalin catatan∗n HAI~( t ( n ) ) .O ( t ( n ) polylog( t ( n ) ) )
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>0 n=b0>b1>⋯>bk>0 n b0 b1 b2 k bi 2
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,…,k i (i−1)
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.k k x y
(Jika parameter tidak mudah dihitung, kami mungkin juga menyimpannya.)bi
Ini ruang menggunakan pengaturan dan kueri waktu 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 .k bi=log(i)n 0<i<k bk=1
sumber
sumber