Biaya melakukan sekitar. pencarian tetangga terdekat di quadtree lewati

10

CATATAN : Pertanyaan telah dinyatakan kembali dalam jawaban saya: Dengan asumsi sekarang kita dapat menemukan leluhur saudara kandung terendah dalam waktu O(1) , dapatkah JST benar-benar dilakukan dalam O(logn) ?


Quadtrees adalah indeks spasial yang efisien. Saya punya teka-teki dengan implementasi pencarian tetangga terdekat dalam struktur quadtree terkompresi seperti yang dijelaskan dalam [2]. (Tanpa masuk ke dalam perincian, pencarian dilakukan secara top-down di sepanjang apa yang disebut kuadrat sama-sama, berakhir pada simpul ekor dari jalur yang sama. Pada gambar terlampir ini mungkin salah satu dari simpul di tenggara diisi dengan titik-titik.)

Agar algoritme mereka berfungsi, kita harus memelihara untuk setiap simpul - bujur sangkar dengan setidaknya dua kuadran tidak kosong - pointer untuk setiap simpul leluhur terendah (terdekat dalam hierarki) di masing-masing dari empat arah (utara, barat, selatan). , timur). Ini ditunjukkan oleh panah hijau untuk leluhur node 'barat (panah menunjuk pada pusat alun-alun leluhur).

Makalah mengklaim pointer ini dapat diperbarui dalam O (1) selama penyisipan dan penghapusan titik. Namun ketika melihat penyisipan titik hijau, sepertinya saya perlu memperbarui sembarang jumlah pointer, dalam hal ini enam dari mereka.

Saya berharap ada trik untuk melakukan pembaruan pointer ini dalam waktu yang konstan. Mungkin ada bentuk tipuan yang bisa dieksploitasi?

quadtree sebelum (kiri) dan setelah (kanan) penyisipan titik

EDIT:

Bagian yang relevan dari makalah ini adalah 6.3, di mana tertulis: "jika jalan memiliki tikungan, maka selain leluhur terendah , kita juga harus mempertimbangkan untuk masing-masing dari arah yang terendah leluhur yang mengarah ke arah itu [...] Menemukan kuadrat ini dari dapat dilakukan dalam waktu per kotak jika kita mengaitkan pointer tambahan ke setiap kotak di menunjuk ke leluhur terdekatnya untuk setiap arah Pointer ini juga dapat diperbarui dalam waktu selama penyisipan atau penghapusan suatu titik. "q 2 d q q O ( 1 ) 2 d Q 0 O ( 1 )log(c/ε)q2dqqO(1)2dQ0O(1)

[2]: Eppstein, D. dan Goodrich, MT dan Sun, JZ, “The Skip Quadtree: Struktur Data Dinamis Sederhana untuk Data Multidimensi,” dalam Prosiding simposium tahunan ke dua puluh satu tentang geometri komputasi, hal. 296—305 2005

0__
sumber
2
Sudah lama, jadi saya tidak ingat persis, tetapi pada membaca ulang koran pagi ini (baik versi arxiv dan jurnal) saya tidak dapat menemukan di mana dikatakan kami menyimpan petunjuk yang Anda butuhkan. Saya pikir kami hanya menyimpan pointer orangtua-anak dan pointer sampel silang. Jadi mungkin Anda bisa menunjuk lebih tepat ke teks di koran yang mengatakan apa yang Anda katakan itu.
David Eppstein
2
Hai David, terima kasih sudah melihatnya. Pencarian JST adalah bagian terakhir (6). Masalahnya ditunjukkan dalam gambar. 7 (b) yang kira-kira seperti yang saya gambarkan dalam ilustrasi di atas, jika q ada di sebelah kiri bawah. Saya telah mengedit pertanyaan untuk memasukkan bagian tertentu dari teks dari bagian 6.3. Saya punya beberapa ide tentang bagaimana saya bisa santai dengan definisi equistabbing mungkin, tapi saya tidak yakin saya bisa membuktikan bahwa penghitungan alternatif tidak melanggar kinerja yang ditargetkan ...
0__
2
Ok, itu memang terlihat seperti masalah. Saya sedang mendiskusikannya dengan Goodrich (kami kehilangan kontak dengan Sun, yang melakukan sebagian besar detail di sini). Perasaan kami saat ini adalah bahwa kami seharusnya tidak benar-benar membutuhkan pointer tambahan ini (kami tidak membutuhkannya untuk kisaran perkiraan, mengapa kira-kira tetangga berbeda, dan harus mungkin bagi algoritma kueri untuk mengingat leluhur yang dilihatnya di turun daripada menggunakan pointer untuk mencari mereka) tetapi kami akan menghubungi Anda ketika kami sedikit lebih yakin tentang detail di sini.
David Eppstein
2
Bagus, terima kasih banyak. Untuk alasan jumlah karakter dan tata letak, saya akan menambahkan jawaban yang membuat sketsa 'ide intuitif' saya, mungkin itu adalah titik awal.
0__

Jawaban:

11

Seperti David, saya tidak tahu mengapa Jonathan berkomentar tentang petunjuk kedua. Mereka tidak dibutuhkan. Seperti yang disebutkan David di atas, properti penting adalah bahwa ketika kita melakukan lokasi titik ke daun v di Q_0, cukup untuk mengingat simpul saudara (dan kotak mereka) di lompatan quadtree. Saat kami memproses kotak dari P, kami melakukan lokasi titik untuk kotak daun terdekat dengan titik kueri kami, memasukkan kotak saudara saat kami turun. Kedengarannya seperti ini akan kurang lebih sama dengan jawaban Anda. Selain itu, prosedur ini sangat mirip, misalnya, dengan bagaimana perkiraan titik lokasi dilakukan dalam makalah berikut: Arya, Sunil dan Mount, David M. dan Netanyahu, Nathan S. dan Silverman, Ruth dan Wu, Angela Y., "Algoritma optimal untuk perkiraan dimensi tetangga terdekat yang mencari", JACM, 1998. Memang,

Michael Goodrich
sumber
Itu kabar baik! Saya hanya tidak yakin apakah menambahkan saudara kandung selama langkah turun akan mengubah batas biaya kasus terburuk secara keseluruhan atau tidak, tapi saya kira tidak. Saya telah melihat ke kertas oleh Arya et al., Tapi saya merasa jauh lebih mudah diakses daripada kertas Quadtree Anda :)
0__
5
Wow! Selamat datang di cstheory.SE!
Hsien-Chih Chang 張顯 之
5

Orang dapat berpikir tentang melewatkan quadtree sebagai implementasi daftar-lewati dari struktur data yang menyimpan poin sesuai dengan z-order mereka. Ini (bisa dibilang) setidaknya secara konsepsi lebih sederhana ...

Lihat bab 2 di sini: http://goo.gl/pLiEO .

Dan ya, dengan asumsi Anda dapat melakukan beberapa operasi z-order dasar dalam waktu konstan, Anda pasti dapat melakukan JST dalam waktu logaritmik. Bab yang disebutkan di atas juga menunjukkan bahwa tidak ada cara untuk menghindari operasi yang aneh jika seseorang ingin quadtrees terkompresi. Perhatikan, bahwa operasi LCA tidak diperlukan ...

Sariel Har-Peled
sumber
3
Ya, dan varian deterministiknya sangat mirip 2-3 pohon untuk z-order yang sama.
David Eppstein
Terima kasih atas tautannya, saya sudah melihat makalah Anda sebelumnya. Bagaimanapun, saya tidak bisa memverifikasi secara empiris ikatan dengan algoritma yang diberikan. Saya merasa bahwa referensi ke Lemma 7, yang digunakan untuk mengikat jumlah putaran dalam teorema 13, mungkin tidak valid, karena mengasumsikan jari-jari konstan , sedangkan jari-jari pencarian di JST berubah secara bertahap, dan begitu juga dengan set kotak kritis. ? r
0__
Jari-jari pasti menyusut selama proses pencarian. Saya cukup optimis argumennya benar.
Sariel Har-Peled
1

Saya juga secara intuitif merasa bahwa seseorang dapat hidup tanpa pointer itu, dan karena saya harus bertahan semua node ke harddisk di beberapa titik, setiap pengurangan pointer itu bagus.

Ide saya kira-kira sebagai berikut: Terlepas dari titik kandidat terbaik (daun) , kami juga melacak jarak terburuk di setiap putaran, . Jarak terburuk adalah maksimum jarak semua sudut dari simpul ke titik kueri , tidak peduli apakah berada di dalam kuadrat atau di luar. r m a x d i s t ' ( v , q ) q v vlbestrmaxdist(v,q)qvv

Putaran seperti ini: Jika kosong, kembalikan , jika ada. Jika tidak delete-min memberikan saat ini di . Inisialisasi ke (atau atur ke jika belum ada kandidat terbaik yang diamati). Pertama, uji setiap anak non-kosong di . Jika anak ini adalah , perbarui dan jika perlu. Jika adalah simpul, hitung dan , yang terakhir adalah jarak terbaik: Entah nol, jikal b e s t p 0 Q 0 r m a x l b e s tp 0 Q 0 q lPlbestp0Q0rmaxlbestp0Q0qlbestrmaxqdist(q,v)dist(q,v)v terletak di dalam , atau jarak terpendek dari semua sudut ke .qqv

Jika , lupakan , jika tidak simpanlah. Jika jumlah node terus adalah , mendorong orang-node ke . Akhir babak. q 2 Pdist(q,v)>rmaxq2P

Jika tidak, lanjutkan mirip dengan pencarian asli: Cari , node yang sesuai dengan di tertinggi , dan mulai dari sana: Sekali lagi, bukannya meminta anak berjarak sama untuk turun ke, uji semua anak sesuai dengan prosedur sebelumnya , yaitu, lewati mereka yang jarak terbaiknya melebihi . Jika setelah tes ini seorang anak tetap, turun ke sana dan ulangi. Jika tidak ada anak yang tersisa, buka dan ulangi. Jika tes dilakukan di , putaran selesai.p 0 Q j r m a x Q j - 1 Q 0qp0QjrmaxQj1Q0

Pada saat ini, saya tidak tahu apakah ini menjamin untuk menemukan tetangga terdekat dalam setiap kasus yang mungkin, atau bahwa itu berkinerja sebaik algoritma asli. Juga jika inisialisasi cukup atau tidak. Dan apa yang harus menjadi prioritas dalam - masih jarak terbaik? PrmaxP


EDIT (April 2013)

Saya sekarang telah melakukan lebih banyak eksperimen dengan klarifikasi algoritma di atas yang menggunakan definisi node 'ekuipoten' alih-alih simpul equistabbing, berdasarkan properti yang turun ke simpul seperti itu tidak mengubah area yang dicakup oleh bentuk kueri sejauh ini. .rmax

Sayangnya, kita dapat membuat kasus patologis (lihat gambar di bawah; titik kueri adalah bagian bawah tengah) di mana kinerja menurun ke putaran .O(n)

masukkan deskripsi gambar di sini

0__
sumber
0

O(ϵ1d(logn+logϵ1))

ϵ=1v

Q0

O(n)d=2ϵ=1O(logn)

Jadi, kecuali saya kehilangan sesuatu yang penting, algoritma tidak dapat mencapai kecepatan yang dinyatakan. Ada komentar atau ide?

traversal

0__
sumber