Bagaimana cara menghitung titik yang paling terisolasi secara efisien?

8

Diberi set yang terbatas S poin dalam Rd, bagaimana kita dapat menghitung "titik paling terisolasi" secara efisien xS?

Kami mendefinisikan "titik paling terisolasi" x oleh

x=argmaxpSminqS{p}d(p,q)

(Saya menggunakan x=argminnotasi meskipun belum tentu unik. Sinid menunjukkan jarak euclidean.) Jadi dengan kata lain kita mencari titik dengan jarak terbesar ke tetangga terdekat.

Algoritma naif akan menghitung semua jarak berpasangan, menemukan tetangga dengan jarak terkecil untuk setiap titik dan kemudian menemukan maksimumnya. Ini dibutuhkanO(n2) operasi, tetapi bisakah kita melakukan lebih baik dari itu?

cacat
sumber
Saya sarankan melihat struktur data untuk pencarian tetangga terdekat . Saya menduga mereka dapat diadaptasi untuk membantu memecahkan masalah ini lebih efisien daripada metode naif.
DW
@ DW Terima kasih atas rekomendasinya. Saya mencoba melihat ke pohon kd, tetapi saya tidak menemukan cara yang lebih efisien untuk menyelesaikan masalah ini.
flawr

Jawaban:

1

Gunakan algoritma apa pun untuk semua tetangga terdekat ; maka Anda dapat dengan mudah menyelesaikan masalah Anda. Algoritma seperti itu menemukan, untuk setiap titik data, tetangga terdekatnya. Titik paling terisolasi adalah yang tetangga terdekatnya paling jauh, jadi setelah Anda menyelesaikan semua tetangga terdekat, Anda dapat menemukan titik paling terisolasi dengan pemindaian linier sederhana.

Rupanya semua tetangga terdekat dapat ditemukan di O(nlogn)waktu; lihat referensi di Wikipedia. Atau, jika Anda menginginkan sesuatu untuk diterapkan, ambil struktur data apa pun untuk tetangga terdekat, dan untuk setiap titikp, cari tetangga terdekatnya.

DW
sumber
0

Seperti yang disarankan dalam komentar saya akan melihat ke pertanyaan tetangga terdekat.

Melakukan satu NN-Kueri per poin harus dalam urutan O(nlog(n)) jadi itu sudah lebih baik daripada solusi naif.

Anda dapat lebih meningkatkannya dengan menambahkan parameter ke NN-Query yang berisi jarak tetangga terdekat dmaxdari titik paling terisolasi yang Anda temukan sejauh ini. Anda kemudian dapat membatalkan NN-kueri segera setelah menemukan titik yang lebih dekat daripadadmax. Ini akan mempercepat pencarian Anda.

Btw, orang sering menyarankan KD-Trees untuk NN-Search. KD-Trees sangat mudah diimplementasikan tetapi dalam pengalaman saya secara konsisten skala kurang baik dengan dimensi lebih tinggi daripada pohon lain. Untukd>10 atau jadi saya akan merekomendasikan menggunakan R-Tree, seperti R * Tree (R-Star-Tree), X-Tree atau STR-loaded R-Tree, atau PH-Tree (yang lebih mirip quadtree bitwise).

TilmannZ
sumber