Saya menerapkan quadtree. Bagi mereka yang tidak mengetahui struktur data ini, saya menyertakan deskripsi kecil berikut:
Sebuah Quadtree adalah struktur data dan pada bidang Euclidean apa octree berada dalam ruang 3-dimensi. Penggunaan quadtrees yang umum adalah pengindeksan spasial.
Untuk meringkas cara kerjanya, quadtree adalah koleksi - katakanlah persegi panjang di sini - dengan kapasitas maksimum dan kotak pembatas awal. Ketika mencoba memasukkan elemen ke dalam quadtree yang telah mencapai kapasitas maksimalnya, quadtree dibagi menjadi 4 quadtree (representasi geometris yang akan memiliki area empat kali lebih kecil dari pohon sebelum penyisipan); setiap elemen didistribusikan kembali di sub-sub pohon sesuai dengan posisinya, yaitu. terikat kiri atas saat bekerja dengan persegi panjang.
Jadi quadtree adalah daun dan memiliki elemen kurang dari kapasitasnya, atau pohon dengan 4 quadtree sebagai anak-anak (biasanya barat laut, timur laut, barat daya, tenggara).
Kekhawatiran saya adalah bahwa jika Anda mencoba untuk menambahkan duplikat, mungkin itu elemen yang sama beberapa kali atau beberapa elemen berbeda dengan posisi yang sama, quadtrees memiliki masalah mendasar dengan penanganan ujung-ujungnya.
Misalnya, jika Anda bekerja dengan quadtree dengan kapasitas 1 dan persegi panjang unit sebagai kotak pembatas:
[(0,0),(0,1),(1,1),(1,0)]
Dan Anda mencoba memasukkan dua kali persegi panjang batas kiri atas yang merupakan asal: (atau serupa jika Anda mencoba memasukkannya N + 1 kali dalam quadtree dengan kapasitas N> 1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
Sisipan pertama tidak akan menjadi masalah:
Tetapi kemudian insert pertama akan memicu subdivisi (karena kapasitasnya 1):
Kedua persegi panjang dengan demikian diletakkan di subtree yang sama.
Kemudian lagi, dua elemen akan tiba di quadtree yang sama dan memicu subdivison ...
Dan seterusnya, dan seterusnya, metode pembagian akan berjalan tanpa batas karena (0, 0) akan selalu berada di subtree yang sama dari empat yang dibuat, yang berarti masalah rekursi tak terbatas terjadi.
Apakah mungkin untuk memiliki quadtree dengan duplikat? (Jika tidak, seseorang dapat menerapkannya sebagai a Set
)
Bagaimana kita bisa menyelesaikan masalah ini tanpa menghancurkan sepenuhnya arsitektur quadtree?