Kompleksitas bit O (1) kueri rentang waktu dalam a

8

Pertimbangkan masalah berikut:

Membiarkan kmenjadi konstan. Kita diberi akarray -ary SEBUAHd1×...×dk dari 0 dan 1ini MembiarkanN=saya=1kdsaya.

Kami ingin membuat struktur data dengan preprocessing SEBUAH untuk melakukan jenis operasi permintaan berikut:

  1. Diberikan koordinat a kkotak -ary D, Apakah ada 1 dalam kotak?
  2. Diberikan koordinat a kkotak -ary D, kembalikan posisi a 1 di dalam kotak (jika ada).

Operasi harus dilakukan dalam waktu yang konstan HAI(1). Kompleksitas waktu diukur pada mesin RAM. Waktu dan ruang preprocessing untuk struktur data tidak penting bagi kami.

Pertanyaannya adalah berapa banyak ruang (dalam kompleksitas bit) yang kita perlukan untuk menyimpan struktur data yang memungkinkan operasi di atas?

Batas bawah sepele adalah N bit karena array dapat direkonstruksi untuk permintaan ini (jadi struktur data harus memiliki setidaknya jumlah informasi yang sama di dalamnya).

Batas atas sepele adalah untuk menyimpan jawaban untuk semua pertanyaan. Itu akan membutuhkan bit. Namun kami menduga ini bisa dilakukan dengan lebih efisien.saya=1k(dsaya2)=Θ(N2)

Sebagai contoh, perhatikan kasus khusus di mana . Dalam hal ini kita dapat menggunakan struktur data RMQ yang ringkas untuk menyelesaikan masalah pertama, dan struktur data membutuhkan bit untuk disimpan.k=12N+Hai(N)

Apa struktur data yang efisien untuk tugas ini?
Seberapa rendah kompleksitas ruang (jumlah bit) untuk mendukung operasi ini (atau hanya operasi pertama)?

Pembaruan (1/15): Dalam kasus khusus , menggunakan bit sudah cukup (sebenarnya lebih baik, , di mana adalah angka ada di ) dengan mengurangi masalah menjadi masalah pendahulu dan menggunakan pengurangan dari masalah pendahulunya ke kamus yang sepenuhnya dapat diindeks (FID). Lihat " Lebih Tergesa-gesa, Lebih Sedikit Buang: Menurunkan Redundansi dalam Kamus yang Diindeks Sepenuhnya " oleh Grossi, Orlandi, Raman dan Rao (2009).k=1N+Hai(N)catatan(Nt)+HAI(t)t1SEBUAH

Pembaruan (6/27): Sekali lagi dengan mengurangi masalah menjadi RMQ. Kami menggunakan dimensi RMQ oleh Yuan dan Atallah untuk mendapatkan batas atas pada jumlah ruang yang dibutuhkan ketika diperbaiki.kHAI(ncatatann)k

Chao Xu
sumber
1
Pertanyaannya tidak jelas: apakah ini pertanyaan struktur data? Jika demikian, apa operasi lain pada array kD ini? Jika tidak ada operasi lain maka tidak ada 1 di atasnya. Jika pertanyaannya adalah kita diberi array kD dan apa yang harus dilakukan preprocessing di atasnya dan kemudian menyimpannya sehingga kita menggunakan sedikit memori tetapi dapat melakukan operasi pengecekan ini dalam kasus terburuk kemudian mengklarifikasi itu. Juga jelaskan apa model komputasi jika Anda ingin batas bawah. HAI(1)
Kaveh
IIUC, makalah itu mengatakan jawaban untuk 1D benar-benar bit dan idenya adalah untuk menyimpan semua kotak kecil plus semua kotak dengan panjang daya 2 dan kotak lainnya dapat diperoleh dari len pow-2 kotak dalam konstanta waktu ( ) dan bagi saya tampaknya hal yang sama akan bekerja di sini dan bit akan cukup. HAI(nlgn)HAI(2k)HAI(nklgkn)
Kaveh
Terima kasih, saya telah menambahkan beberapa klarifikasi. Bukankah koran itu mengatakan kontribusi utama mereka adalah penggunaan2n+o(n)bit dalam preprocessing dan penyimpanan?
Chao Xu
Maaf, yang saya jelaskan adalah dari pekerjaan sebelumnya. Namun hasil mereka tampaknya mirip secara konseptual, yaitu mereka membagi array ke blok, precompute jawabannya, dan menggunakan jumlah konstan dari mereka untuk menghitung jawaban untuk setiap yang diberikan. Jika dalam kD jumlah blok dasar yang diperlukan untuk menghitung jawaban untuk blok arbitrer adalah konstan maka algoritma yang sama akan bekerja di sini dan akan memberikan sesuatu sepertiO(nk)=O(N)(Saya belum memeriksa apakah ini masalahnya).
Kaveh

Jawaban:

1

Anda dapat menyimpan lebih banyak pada memori jika Anda mengizinkan kompleksitas waktu logaritmik. Anda bisa mengimplementasikan pohon segmen kD yang membutuhkan memori N * 2 ^ k bit, dan berjalan dalam kompleksitas waktu logaritmik untuk kedua subtugas, dan kompleksitas waktu linier untuk membangun pohon.

Jika Anda benar-benar ingin O (1), lakukan precompute semuanya.

Bojan Serafimov
sumber
2
Bisakah Anda menjelaskan bagaimana pohon itu dibangun dalam waktu logaritmik?
Raphael
maaf, ini dibangun dalam waktu linier
Bojan Serafimov
2
@BojanSerafimov Anda harus memperbarui jawabannya :) :) Komentar mungkin dihapus.
Juho
1
Saya pikir ini bisa menjadi jawaban yang baik, jika Anda baru saja mengeditnya agar benar dan mungkin sedikit lebih rumit tentang seperti apa pohon-pohon ini dan bagaimana Anda membangunnya.
Raphael