Pilih dua angka yang dijumlahkan ke , menggunakan waktu permintaan sub-linear


9

Ini masalah tetangga terdekat.

Diberikan real (sangat besar !), Plus target real , cari dan yang paling dekat dengan . Kami mengizinkan pra-pemrosesan / pengindeksan yang dari (hingga ), tetapi pada waktu kueri (diberikan ), hasilnya harus dikembalikan dengan sangat cepat (misalnya, waktu). n p a i a j p a 1 , , a n O ( n log n ) p O ( log n )Sebuah1,...,SebuahnnhalSebuahsayaSebuahjhalSebuah1,...,SebuahnHAI(ncatatann)halHAI(catatann)

(Contoh sederhana: jika kita hanya menginginkan SINGLE yang paling dekat dengan , kita akan mengurutkan offline, , lalu melakukan pencarian biner pada waktu kueri, ). p a 1 , , a n O ( n log n ) O ( log n )SebuahsayahalSebuah1,...,SebuahnHAI(ncatatann)HAI(catatann)

Solusi yang tidak berfungsi:

1) Urutkan offline, lalu pada waktu kueri, mulai dari kedua ujung & pindahkan dua pointer ke dalam ( http://bit.ly/1eKHHDy ). Tidak bagus, karena waktu permintaan.Sebuah1,...,SebuahnHAI(n)

2) Urutkan offline, lalu pada waktu kueri, ambil setiap dan lakukan pencarian biner untuk "teman" yang membantunya menjumlahkan sesuatu yang dekat dengan . Tidak bagus, karena waktu kueri .a i p O ( n log n )Sebuah1,...,SebuahnSebuahsayahalHAI(ncatatann)

3) Urutkan semua pasangan offline, lalu lakukan pencarian biner. Tidak bagus, karena pra-pemrosesan.O ( n 2 )(Sebuah1,...,Sebuahn)HAI(n2)

Terima kasih!

ps. Diperlukan generalisasi lebih lanjut untuk latihan: (1) dan menjadi vektor 50-dimensi, (2) "tutup" menjadi jarak vektor kosinus, dan (3) -pasangan terdekat terdekat-jumlah itu, bukan hanya 1-terbaik. p kSebuah1,...,Sebuahnhalk


Apakah ada batasan waktu pra-pemrosesan atau jumlah ruang yang dapat kita gunakan setelah pra-pemrosesan? Jika kami terbatas pada ruang , apakah Anda memiliki alasan untuk meyakini bahwa itu dapat diselesaikan dalam, katakanlah, waktu? Bagi saya itu sangat tidak mungkin. O ( lg n )O(n)O(lgn)
DW

Pra-pemrosesan terbatas pada O ( log ). Saya memperbarui pernyataan masalah. nnn
Kevin

Saya tidak punya alasan untuk percaya bahwa query bisa cepat, tetapi banyak hasil yang berguna untuk tetangga terdekat (kd-tree, hashing yang sensitif terhadap lokalitas, dll.) Nampaknya kontra-intuitif baik untuk saya. Solusi perkiraan menggunakan hashing sensitif-lokal akan baik-baik saja untuk penggunaan praktis.
Kevin

Jawaban:


17

Ini hampir pasti mustahil.

Misalkan Anda dapat memecahkan masalah Anda dengan waktu preprocessing dan waktu permintaan . Lalu ada algoritma sederhana untuk menyelesaikan masalah 3SUM — Berikan satu set bilangan real, apakah ada tiga elemen yang berjumlah nol? —Dalam waktu. Kami pra-proses semua angka, lalu untuk setiap angka , kami menemukan nilai yang paling dekat dengan ; jika cocok dengan , kami telah menemukan solusi untuk masalah 3SUM.P(n)Q(n)nP(n)+nQ(n)akai+ajakak

Namun, algoritma tercepat yang dikenal untuk 3SUM berjalan dalam waktu , dan algoritma ini secara luas diduga menjadi optimal. Selain itu, ada kecocokan batas bawah dalam model perhitungan pohon keputusan yang terbatas tetapi alami. Untuk set bilangan bulat , ada sedikit subquadratic-waktu algoritma yang "bermain game dengan bit", tetapi bahkan dalam model RAM integer, 3SUM ini menduga membutuhkan waktu .O(n2)Ω(n2)Ω(n2/polylogn)

Jadi dengan asumsi dugaan itu benar, masalah Anda membutuhkan (dekat) waktu preprocessing kuadrat atau (dekat-) waktu permintaan linier.


2

Jika Anda dapat menggunakan ruang tak terbatas dan waktu tak terbatas selama pra-pemrosesan, maka solusi berikut ini memenuhi persyaratan Anda:

  • Selama pra-pemrosesan, hitung himpunan , dan simpan set ini dalam urutan yang diurutkan. Set ini dapat dibuat dan disortir dalam waktu O ( n 2 ) , dan dibutuhkan O ( n 2 ) ruang untuk menyimpannya.{Sebuahsaya+Sebuahj:1sayajn}HAI(n2)HAI(n2)

  • Sekarang untuk menjawab pertanyaan (untuk menemukan di mana sebuah i + a j adalah sebagai dekat dengan p mungkin), hanya melakukan pencarian biner dalam daftar diurutkan ini. Itu akan memakan waktu O ( lg n ) .Sebuahsaya,SebuahjSebuahsaya+SebuahjhalHAI(lgn)

Jika solusi ini tidak dapat diterima, Anda perlu memikirkan persyaratan Anda lebih hati-hati dan mengedit pertanyaan yang sesuai.


Hai, dan terima kasih! Tetapi solusi Anda sama dengan solusi saya # 3, yang bermasalah karena waktu pra-pemrosesan O (n ^ 2). Dalam kasus saya, n sangat besar (misalnya, 1m) dan saya harus menghindari operasi O (n ^ 2).
Kevin
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.