Jarak terpendek antara titik di A dan titik di B


9

Diberikan dua set dan masing-masing berisi titik terpisah dalam pesawat, hitung jarak terpendek antara titik di dan titik di , yaitu, .ABnABmin { dist(p,q) | pAqB }

Saya tidak yakin apakah saya benar, tetapi masalah ini sangat mirip dengan masalah yang dapat diselesaikan dengan pemrograman linear dalam geometri komputasi. Namun, pengurangan LP tidak langsung. Masalah saya juga terlihat berkaitan dengan menemukan pengaturan tertipis antara dua set titik yang jelas dapat diselesaikan oleh LP dalam O(n) dalam ruang 2 dimensi.


4
Apa pertanyaannya di sini?
Raphael


Saya bukan ahli tetapi biasanya dalam pembelajaran mesin, di mana poin ini adalah data, set berperilaku sebagian besar waktu dan dikelompokkan bersama, jadi algoritma seperti yang disarankan oleh @Pedro bekerja dengan baik.
chazisop

3
"yang jelas dapat diselesaikan oleh LP dalam O (n) dalam ruang 2 dimensi" - Saya ingin tahu apa yang mendorong pernyataan ini. "Pemrograman linear" secara umum tidak dapat dipecahkan dalam waktu linier; "linear" mengacu pada sesuatu yang lain. Jadi, apakah LP memiliki bentuk khusus?
Raphael

Jawaban:


5

Saya punya solusi yang mungkin tampak sedikit berbelit-belit, tetapi harus lebih efisien daripada pencarian brute-force naif :O(n2)

  1. biarkan menjadi sumbu antara pusat-pusat massa dan .A BvAB
  2. 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.vdbkajvbkaj

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


2
@Pedro: Maaf saya tidak berkomentar sebelumnya (tidak ada waktu pada saat itu). Alasan saya menurunkan jawaban Anda adalah karena itu adalah jawaban yang buruk dan seharusnya tidak berada di atas. Ini sebenarnya masalah yang terkenal dalam geometri komputasi dengan kasus terburuk O (n log n). Sebuah jawaban yang baik akan menunjukkan masalah yang diketahui (mungkin dengan referensi) dan solusi umum, yang meliputi: menggunakan pohon kd dan menguji elemen, algoritma sweep, dll. Gagasan umum harus preproses dalam struktur yang dipesan dan menggunakannya . Lihatlah kasus 1D - lebih jelas O (n log n) di sana.
ex0du5

2
@ ex0du5: Kedengarannya seolah-olah Anda harus memposting jawaban Anda sendiri! Perhatikan bahwa "ada jawaban yang lebih baik" biasanya bukan alasan yang baik untuk downvoting; ukuran ini harus disediakan untuk jawaban yang salah, spam dan diformat dengan sangat buruk. Pedro juga tidak. Lihat juga di sini untuk kesan seberapa banyak orang berpikir harus diberikan sebelum downvote.
Raphael

1
@ Raphael: Saya tidak menjawab karena ada satu jawaban yang adil dan saya tidak punya waktu untuk mencari referensi. Adapun referensi Anda tentang cara downvote, itu adalah algoritma yang mengerikan untuk situs-situs ini! Siswa CS khususnya harus memahami pentingnya tidak kehilangan tujuan untuk formalisme. Tujuan pemungutan suara adalah untuk memindahkan jawaban ke peringkat yang akan memandu siswa kemudian dari masalah yang sama ke jawaban yang paling berguna. Algoritme saya untuk memilih melakukan itu. Algo itu: jelas tidak. Ini bisa didiskusikan dengan meta jika Anda suka, tetapi sebagai orang dewasa, kita harus menggunakan kekuatan kita untuk kebaikan, saya pikir.
ex0du5

1
@ ex0du5: Sepertinya Anda punya waktu sekarang. Bisakah Anda benar-benar menunjukkan bahwa instance ini sebenarnya merupakan "masalah terkenal dengan kasus terburuk "? O(nlogn)
Pedro

1
@ ex0du5: Sebenarnya, pencarian tetangga terdekat, misalnya menggunakan pohon kd , hanya memiliki kompleksitas rata-rata O (logn) . Jadi kita kembali ke titik awal.
Pedro

4

Anda dapat mengadaptasi algoritma linesweep "pasangan terdekat" yaitu .O(nlogn)

Satu-satunya perubahan yang harus Anda lakukan adalah mengabaikan pasangan yang termasuk dalam set yang sama.

Sunting: Ini sebenarnya tidak sederhana (atau bahkan mungkin) seperti yang saya jelaskan. Lihat komentar untuk diskusi.


2
Hanya sebuah komentar, seseorang juga dapat mengadaptasi algoritma divide and conquer klasik untuk pasangan terdekat yang juga berjalan di ; lihat juga Wikipedia . O(nlogn)
rizwanhudda

1
Untuk algoritma waktu linear acak, lihat misalnya Rabin Membalik Koin di blog Lipton.
Juho

3
Bisakah Anda menjadi sedikit lebih spesifik tentang bagaimana Anda akan menerapkan ini untuk set terpisah, terutama yang berkaitan dengan mempertahankan terikat ? O(nlogn)
Pedro

-1 untuk kesalahan. Algoritma pair linesweep terdekat yang Anda tautkan bergantung pada set yang diurutkan yang mengandung elemen , tetapi dalam kasus set terputus-putus, set ini mulai berisi elemen, sehingga tidak lagi dalam , di Paling tidak dalam kasus terburuk. n O ( n log n )O(1)nO(nlogn)
Pedro

1
@Pedro: Mengapa lebih besar? Jika ada, himpunan poin kandidat saat ini harus menyusut.
Raphael

4

Gagasan dalam masalah seperti ini adalah untuk membuat struktur yang dipesan dari salah satu set yang memungkinkan permintaan efisien Tetangga Tetangga. Makalah klasik yang menyajikan struktur kueri O (log n) untuk dimensi arbitrer adalah:

Shamo dan Hoey pada solusi Voronoi

Sejumlah partisi ruang lain berdasarkan ide-ide dari tesselations Delauney telah dibuat sejak itu, dan ini menerjemahkan ke berbagai deskripsi sapuan ruang bagian juga. Perhatikan bahwa metode Voronoi juga akan jatuh di bawah deskripsi divide-and-menaklukkan umum karena partisi pesawat itu yang membuat langkah konstruksi O (n log n).

Jadi, solusi dasar untuk masalah ini adalah:

  1. Ambil set A dan bangun struktur permintaan Tetangga Tetangga terdekat yang efisien pilihan Anda. Langkah konstruksi ini adalah O (n log n) [lihat teorema 4].
  2. Untuk setiap elemen di B, struktur kueri A untuk tetangga terdekat. Setiap kueri adalah O (log n) [lihat teorema 15, dimensi tetap], sehingga total waktu kueri untuk semua titik dalam B adalah O (n log n).
  3. Ketika hasil untuk titik terdekat di A ke setiap B diambil, masukkan ke dalam struktur yang diperintahkan pada jarak. Ini adalah O (log n) masukkan setiap hasil, atau O (n log n) untuk semua.
  4. Ketika semua B telah dilihat, Anda dapat dengan cepat (O (1)) mendapatkan titik B dalam struktur terurut dengan jarak tetangga terkecil ke titik di A.

Seperti yang dapat dilihat pada kerumitan setiap langkah, kompleksitas totalnya adalah O (n log n). Untuk pembaca modern yang tidak melihat makalah klasik, ini tercakup dalam banyak buku algoritma, misalnya "Manual Desain Algoritma" oleh Skiena.


1
"Solusi Artium, misalnya, dapat ditulis dalam bentuk ini dan benar-benar valid." - yah, yang Anda usulkan di sini bukan lagi algoritma garis (murni), jadi saya tidak tahu tentang itu.
Raphael

@ Raphael: Tentu saja. Algoritma Sweepline mengolah poin menjadi struktur yang dipesan seperti dijelaskan di sini. Saya bahkan menautkan ke Algoritma Fortune di bawah jawabannya, yang menunjukkan algoritma sweepline hanyalah sebuah contoh dari algoritma Voronoi. Alasan saya menyimpan solusi generik untuk struktur permintaan adalah karena ada sejumlah besar mekanisme geometris yang telah dikembangkan untuk ini.
ex0du5

Anda tidak perlu urutan tertentu saat iterasi lebih dari , sedangkan urutan itu penting untuk algoritma sweepline (banyak / semua?) (Karena itu namanya, saya kira). B
Raphael

1

Saya tidak yakin apakah saya benar, tetapi masalah ini sangat mirip dengan masalah yang dapat diselesaikan dengan pemrograman linear dalam geometri komputasi. Namun, pengurangan LP tidak langsung. Masalah saya juga terkait dengan menemukan pengaturan tertipis antara dua set titik yang jelas dapat diselesaikan oleh LP dalam ruang 2 dimensi.

Batas bawah untuk masalah ini adalah bawah model pohon keputusan aljabar. Saya akan memberikan sketsa kasar buktinya di sini.O(nlogn)

Kami akan mengurangi contoh masalah perbedaan Elemen E ke C.

  • Input ke E: S={a1,a2,a3,...,an}
  • Biarkan > 0 menjadi fraksi kecilϵ
  • A = ,B = { ( a i + ϵ ) : 1 i n }{(ai,0):1in}B={(ai+ϵ):1in}
  • Sekarang Jika kita dapat menemukan jarak terpendek (d) antara himpunan A dan B. Kita dapat memutuskan masalah perbedaan elemen dalam waktu sebagai berikut O(n)
    • Himpunan memiliki duplikat jika dan hanya jika d =ϵSϵ

Kita tahu bahwa batas bawah pada runtime untuk menentukan masalah Perbedaan elemen adalah . Oleh karena itu, dengan mengurangi batas bawah juga berlaku untuk masalah kita.O(nlogn)

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.