Pertimbangkan masalah berikut:
Membiarkan menjadi konstan. Kita diberi aarray -ary dari dan ini Membiarkan.
Kami ingin membuat struktur data dengan preprocessing untuk melakukan jenis operasi permintaan berikut:
- Diberikan koordinat a kotak -ary , Apakah ada dalam kotak?
- Diberikan koordinat a kotak -ary , kembalikan posisi a di dalam kotak (jika ada).
Operasi harus dilakukan dalam waktu yang konstan . 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 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.
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.
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).
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.
Jawaban:
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.
sumber