Lingkaran Penutupan Maksimum dari Radius Yang Diberikan

19

Saya mencoba mencari pendekatan untuk masalah berikut:

Diberikan himpunan titik dan jari-jari r , temukan titik pusat lingkaran, sedemikian sehingga lingkaran itu mengandung jumlah maksimum titik dari himpunan. Waktu yang berjalan harus O ( n 2 ) .SrO(n2)

Pada awalnya itu tampaknya menjadi sesuatu yang mirip dengan masalah lingkaran tertutup terkecil, yang dengan mudah dapat diselesaikan di . Idenya adalah untuk mengatur pusat sewenang-wenang dan mengelilingi semua titik S . Selanjutnya, langkah demi langkah, ganti lingkaran untuk menyentuh titik kiri / kanan dan mengecilkan lingkaran ke radius yang diberikan, jelas, ini tidak akan berhasil.O(n2)S

com
sumber

Jawaban:

7

Saya tidak tahu bagaimana menyelesaikan masalah ini dalam waktu , tetapi algoritma O ( n 2 log n ) memang ada.O(n2)O(n2logn)

Misalkan menjadi lingkaran yang pusatnya adalah s i , titik ke- i , dengan jari-jari r . Tidak sulit untuk menemukan bahwa set titik P = { p 0 , p 1 , ... , p m } dapat dikelilingi oleh lingkaran dengan jari-jari r jika persimpangan I ( P ) dari C ( p 0 ) , C ( p 1 ) , ...C(si)siirP={p0,p1,,pm}rI(P) tidak kosong. Selain itu, jika I ( P ) tidak kosong, harus ada beberapa titik di I ( P ) berbaring di beberapa bd C ( p i ) (batas C ( p i ) ). Jadi untuk setiap C ( s i ) dan setiap titik p pada ikatannya, kami mencoba menemukan berapa banyak lingkaran yang mengandung p . Jumlah maksimal di antara semua p akan menjadi jawaban untuk masalah ini.C(p0),C(p1),,C(pm)I(P)I(P)bdC(pi)C(pi)C(si)ppp

Mari kita periksa poin dalam . Ada pemetaan satu-ke-satu antara titik-titik pada bd C ( s i ) dan bilangan real dalam [ 0 , 2 π ) . Untuk setiap lingkaran C ( s j ) , persimpangan antara C ( s j ) dan bd C ( s i ) dapat direpresentasikan dengan interval [ b e g i n jbdC(si)bdC(si)[0,2π)C(sj)C(sj)bdC(si) . Jadi untuk semua lingkaran selain C ( s i ) , terdapat paling banyakinterval n - 1 (beberapa lingkaran mungkin tidak berpotongan dengan C ( s i ) ). Hitungan maks dapat ditemukan dengan mudah dengan menyortir semua 2 ( n - 1 ) titik akhir dari interval, memindai mereka secara berurutan dan menghitung jumlah yang tumpang tindih saat ini. Untuk setiap C ( s i ) , langkah ini dapat dilakukan dalam O ( n log n[beginj,endj]C(si)n1C(si)2(n1)C(si) waktu, dan ada n lingkaran seperti itu, sehingga kompleksitas waktu dari algoritma ini adalah O ( n 2 log n ) .O(nlogn)nO(n2logn)

Wu Yin
sumber
2
Susunan lingkaran dapat dibangun dalam waktu (dengan probabilitas tinggi) menggunakan algoritma inkremental acak standar. Bahkan, waktu berjalan adalah O ( n log n + k ) , di mana k adalah jumlah pasangan lingkaran yang berpotongan. Lihat buku teks geometri komputasi favorit Anda. O(n2)O(nlogn+k)k
JeffE
2

Saya pikir pertanyaan yang sulit adalah mengetahui apakah lingkaran yang Anda pilih sebenarnya "maksimal" dalam set. Satu-satunya cara saya dapat berpikir untuk menentukan ini adalah dengan mencoba semua kombinasi poin yang mungkin, dan menguji ukuran lingkaran yang melingkupinya.

Anda dapat mengurangi ruang pencarian meskipun dengan terlebih dahulu membagi ruang titik menjadi kotak sel persegi dengan lebar 2r. Kemudian cari sel dengan kepadatan terbesar. Karena Anda sudah menemukan satu lingkaran titik X, Anda dapat menyimpulkan bahwa jika lingkaran ada dengan lebih banyak titik, maka ia harus memiliki setidaknya X titik di dalamnya. Dan gunakan ini sebagai titik awal untuk menguji berbagai kombinasi titik.

Jika Anda hanya mencari satu set titik yang cenderung maksimal, maka Anda mungkin dapat mengurangi jumlah kombinasi yang perlu Anda uji dengan memilih titik-titik yang termasuk dalam lingkungan sel di mana kepadatan lingkungan tersebut lebih besar dari X.

Karena itu, kedua "pengurangan" dapat gagal, dan pada kasus terburuk Anda akan menghitung lingkaran untuk semua kemungkinan kombinasi poin.

putnampp
sumber
1

O(n2)

O(n2)

2n2O(n2log(n))

O(n2)O(n2)

V+EF=2O(n2)

stack99
sumber
Jika ini harus dibaca sebagai pelengkap jawaban yang diterima, dan harus tidak dibaca sendiri (yang saya tidak tahu, karena saya tidak tahu tentang topik ini), Anda harus eksplisit tentang hal itu.
babou