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 )
(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 )
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.
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 )
3) Urutkan semua pasangan offline, lalu lakukan pencarian biner. Tidak bagus, karena pra-pemrosesan.O ( n 2 )
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 k
Jawaban:
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) n P(n)+n⋅Q(n) ak ai+aj −ak −ak
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.
sumber
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.{ asaya+aj: 1 ≤ i ≤ j ≤ n } O ( n2) O ( 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, aj Sebuahsaya+ aj hal O ( lgn )
Jika solusi ini tidak dapat diterima, Anda perlu memikirkan persyaratan Anda lebih hati-hati dan mengedit pertanyaan yang sesuai.
sumber