Saya punya solusi yang mungkin tampak sedikit berbelit-belit, tetapi harus lebih efisien daripada pencarian brute-force naif :O(n2)
- biarkan menjadi sumbu antara pusat-pusat massa dan .A BvAB
- Urutkan titik-titik dalam dan sepanjang sumbu ini masing-masing dalam urutan menurun dan naik, menghasilkan urutan , , ..., dan , , ..., .B a 0ABa0a n b 0 b 1 b na1anb0b1bn
Sisanya dalam pseudo-code untuk membuatnya lebih jelas:
d = infinity.
for j from 1 to n
if (b_1 - a_j) along v > d then break endif
for k from 1 to n
if (b_k - a_j) along v > d then
break
else
d = min( d , ||b_k - a_j|| )
endif
enddo
enddo
Artinya, dengan pra-menyortir titik sepanjang , Anda dapat menyaring pasangan yang tidak akan pernah berada dalam satu sama lain sejak bersama akan selalu.vdbk−ajv≤∥bk−aj∥
Dalam kasus yang lebih buruk, ini masih , tetapi jika dan dipisahkan dengan baik, itu harus jauh lebih cepat dari itu, tetapi tidak lebih baik dari , yang diperlukan untuk penyortiran.O(n2)ABO(nlogn)
Memperbarui
Solusi ini sama sekali tidak ditarik keluar dari topi. Ini adalah kasus khusus dari apa yang saya gunakan dalam simulasi partikel untuk menemukan semua pasangan partikel yang berinteraksi dengan penandaan spasial. Pekerjaan saya sendiri menjelaskan masalah yang lebih umum ada di sini .
Adapun saran untuk menggunakan algoritma line-sweep yang dimodifikasi, meskipun secara intuitif sederhana, saya tidak yakin bahwa ini ada di ketika set-set yang terpisah dipertimbangkan. Hal yang sama berlaku untuk algoritma acak Rabin.O(nlogn)
Tampaknya tidak ada banyak literatur yang berurusan dengan masalah pasangan terdekat dalam set terpisah, tetapi saya telah menemukan ini , yang tidak membuat klaim berada di bawah , dan ini , yang tampaknya tidak untuk membuat klaim tentang apa pun.O(n2)
Algoritme di atas dapat dilihat sebagai varian dari sapuan bidang yang disarankan di makalah pertama (Shan, Zhang dan Salzberg), namun alih-alih menggunakan sumbu dan tanpa penyortiran, sumbu antara set digunakan dan set dilintasi dalam urutan menurun / naik.x