Mengapa orang menggunakan Octree di atas pohon-KD?


32

Saya memiliki beberapa pengalaman dalam komputasi ilmiah, dan telah banyak menggunakan pohon kd untuk aplikasi BSP (partisi ruang biner). Saya baru-baru ini menjadi lebih akrab dengan oktri, struktur data yang mirip untuk mempartisi ruang Euclidean 3-D, tetapi yang bekerja pada interval tetap yang tetap, dari apa yang saya kumpulkan.

Sedikit riset independen tampaknya mengindikasikan bahwa kd-tree biasanya unggul dalam kinerja untuk sebagian besar dataset - lebih cepat untuk dibangun dan di-query. Pertanyaan saya adalah, apa kelebihan oktri dalam kinerja spasial / temporal atau sebaliknya, dan dalam situasi apa yang paling bisa diterapkan (saya pernah mendengar pemrograman grafis 3D)? Ringkasan kelebihan dan masalah dari kedua jenis ini akan sangat saya hargai.

Sebagai tambahan, jika ada yang bisa menguraikan penggunaan struktur data R-tree dan keuntungannya, saya akan berterima kasih untuk itu juga. R-tree (lebih dari octrees) tampaknya diterapkan sangat mirip dengan kd-tree untuk k-terdekat-tetangga atau rentang pencarian.


Saya harus mencatat bahwa kedua kd-tree dan R-tree (tetapi tidak octrees) tampaknya dirancang khusus untuk memfasilitasi pencarian tetangga k-terdekat - bagaimana mereka membandingkan dalam hal ini?
Noldorin

Satu catatan adalah bahwa pohon kd telah menjamin kedalaman kecil. Pohon quad terkompresi dapat membawa Anda ke sana, tetapi kurang nyaman.
Suresh Venkat

@ Suresh Venkat: Terima kasih untuk itu. Saya tidak terbiasa dengan quadtrees terkompresi, tetapi apakah mereka benar-benar cocok untuk repetisi spasial 3-D? Mungkin ada analog "octree terkompresi".
Noldorin

Saya juga pernah mendengar bahwa octrees lebih tepat ketika seseorang memiliki kurva Z-order (space-filling) yang diketahui, tetapi saya tidak yakin dengan alasannya di sini.
Noldorin

Jawaban:


23

Sel-sel dalam pohon -tree dapat memiliki aspek rasio tinggi, sedangkan sel-sel octree dijamin kubik. Karena ini adalah papan teori, saya akan memberi Anda alasan teoritis mengapa rasio aspek tinggi adalah masalah: itu membuat tidak mungkin untuk menggunakan batas volume untuk mengontrol jumlah sel yang harus Anda periksa ketika menyelesaikan perkiraan perkiraan tetangga terdekat.kD

Secara lebih terperinci: jika Anda meminta -approximate tetangga terdekat ke titik permintaan , dan tetangga terdekat sebenarnya berada pada jarak , Anda biasanya berakhir dengan pencarian yang memeriksa setiap sel struktur data yang mencapai dari dalam hingga bagian luar anulus atau annular shell dengan jari-jari dalam dan jari-jari luar . Jika sel-sel memiliki rasio aspek terikat, karena mereka berada dalam kuadratree, maka mungkin ada paling banyak sel-sel tersebut, dan Anda dapat membuktikan batas yang baik pada waktu untuk kueri. Jika rasio aspek tidak dibatasi, seperti dalam -tree, batas ini tidak berlaku.q d d ( 1 + ϵ ) d 1 / ϵ d - 1 k Dϵqdd(1+ϵ)d1/ϵd1kD

kD -trees memiliki keunggulan berbeda dari quadtrees, karena mereka dijamin memiliki paling banyak kedalaman logaritmik, yang juga berkontribusi pada waktu untuk permintaan tetangga terdekat. Tetapi kedalaman quadtree paling banyak adalah jumlah bit presisi dari input yang umumnya tidak besar, dan ada metode teoritis untuk mengendalikan kedalaman menjadi dasarnya logaritmik (lihat struktur data quad quadree).


4
Lihat buku teks terbaru Sariel Har-Peled untuk ringkasan modern dari quadtrees terkompresi.
Jeffε

Terima kasih untuk ringkasan kuantitatif yang bagus, David. Hanya untuk mengonfirmasi: apakah penggunaan "rasio aspek" sama dengan "rasio percabangan"? Saya pasti harus memeriksa ke dalam melewati quadree / octrees dan juga quadtrees / octrees terkompresi mungkin.
Noldorin

1
Rasio aspek kotak persegi panjang dapat didefinisikan sebagai rasio panjang tepi terpanjang dengan panjang tepi terpendek. Saya tidak tahu apa yang seharusnya berarti rasio percabangan dalam konteks ini tetapi rasio aspek tidak terkait dengan faktor percabangan pohon (yang konstan untuk kedua struktur data).
David Eppstein

Saya melewatkan "sel-sel". Masuk akal sekarang.
Noldorin

15

Sekelompok teman dan saya sedang mengerjakan game luar angkasa-RTS sebagai proyek sampingan yang menyenangkan. Kami menggunakan banyak hal yang telah kami pelajari di Ilmu Komputer untuk membuatnya sangat efisien, memungkinkan kami untuk membuat pasukan besar nantinya.

Untuk tujuan ini kami telah mempertimbangkan untuk menggunakan pohon kd, tetapi kami dengan cepat mengabaikannya: penyisipan dan penghapusan sangat umum dalam program kami (pertimbangkan sebuah kapal terbang di luar angkasa), dan ini adalah kekacauan yang tidak suci dengan pohon kd. Karena itu kami memilih oktri untuk permainan kami.


Ah ya, saya pernah mendengar ini sebelumnya. Penyisipan / penghapusan dengan pohon kd adalah operasi yang mahal (karena penyeimbangan kembali). Saya percaya kompleksitas waktu terbaik masih sama ...
Noldorin

2
Tergantung bagaimana Anda memperbaiki kd-tree. Kompleksitas waktu kasus terbaik yang baik bukanlah sesuatu yang secara umum saya tuju: misalnya bogosort memiliki kompleksitas kasus terbaik (O), tetapi saya harap tidak ada yang menggunakannya.
Alex ten Brink

Sayangnya saya tidak bisa menemukan ringkasan yang baik dari kompleksitas waktu untuk operasi umum pada struktur data ini, tetapi tidak keberatan. Kompleksitas waktu kasus rata-rata seringkali berwawasan luas ...
Noldorin

1
Saya benar-benar berpikir Anda masih akan melakukan yang lebih baik jika Anda hanya menggunakan KD-tree yang mengayuh sumbu dan hanya membagi ruang di tengah. Lewati SAH yang besar dan potongan median mahal lainnya dan Anda akan berakhir dengan sesuatu yang tidak hanya mencari lebih cepat dari satu Oktober tetapi juga membangun lebih cepat. Karena Anda mempartisi ruang secara merata seperti pada Oktober, tetapi dengan pohon biner daripada pohon 8-ary, apa pun yang Anda lakukan sebelumnya untuk pemindahan tidak boleh lebih rumit dengan pohon-KD, karena Akan ditempatkan secara merata dengan cara yang sama. Mis: Anda cukup menghapus node kosong di atas kedalaman N.
Dragon Energy

8

apa keuntungan dari oktri dalam kinerja spasial / temporal atau sebaliknya, dan dalam situasi apa yang paling berlaku (saya pernah mendengar pemrograman grafis 3D)?

pohon kD adalah pohon biner seimbang dan oktri dicoba sehingga keuntungan dan kerugiannya mungkin diwarisi dari struktur data yang lebih umum. Secara khusus:

  • Penyeimbangan ulang bisa mahal (oktri tidak perlu penyeimbangan kembali).
  • Penyeimbangan menangani heterogenitas dengan lebih baik karena bersifat adaptif.
  • Faktor percabangan yang lebih tinggi dalam oktri berarti pohon yang lebih dangkal (lebih sedikit tipuan dan alokasi) untuk distribusi yang homogen.

Juga, pembelahan dua (seperti dalam octrees) cocok untuk implementasi sepele dalam hal bit-twiddling. Demikian pula, saya membayangkan octrees bisa mendapat manfaat besar dari jarak yang telah ditentukan saat melakukan pencarian rentang.

EDIT

Rupanya referensi saya untuk mencoba dan homogenitas perlu klarifikasi.

Tries adalah keluarga struktur data yang diwakili oleh pohon-pohon kamus dan digunakan sebagai kamus untuk kunci yang berurutan (terutama string tetapi juga urutan DNA dan bit dalam nilai hash untuk percobaan hash). Jika masing-masing kamus memetakan satu bit dari masing-masing koordinat x, y dan z (bit paling signifikan di tingkat pertama dari trie, bit signifikan berikutnya di tingkat kedua dll.) Maka trie adalah sebuah octree yang secara seragam membagi ruang 3D. Karenanya, oktri mewarisi karakteristik percobaan, yaitu:

  • Faktor percabangan tinggi dapat berarti pohon dangkal yang menimbulkan sedikit tipuan sehingga pencarian cepat, misalnya 20 tingkat pohon biner dapat disimpan dalam 4 tingkat pohon dengan faktor percabangan 256.
  • Percobaan tidak diseimbangkan kembali selama penyisipan dan penghapusan, menghemat operasi yang mahal yang diperlukan untuk pohon biner seimbang.

Kerugiannya adalah bahwa heterogenitas dapat menyebabkan upaya / oktri yang tidak seimbang sehingga pencarian dapat memerlukan banyak tipuan. Masalah yang setara dalam percobaan diselesaikan dengan menggunakan kompresi tepi untuk menutup beberapa level tipuan menjadi satu level. Oktri tidak melakukan ini, tetapi tidak ada yang menghentikan Anda dari mengompres sebuah octree (tapi saya pikir Anda tidak bisa menyebut hasilnya sebagai octree!).

Untuk perbandingan, pertimbangkan kamus khusus untuk kunci string yang direpresentasikan sebagai trie. Level pertama dari trie bercabang pada karakter pertama dalam kunci. Level kedua pada karakter kedua dan seterusnya. Setiap string dapat dicari dengan mencari karakter pertama dari kunci di kamus untuk mendapatkan kamus kedua yang digunakan untuk mencari karakter kedua dari kunci dan seterusnya. Satu set string kunci acak akan menjadi distribusi yang homogen . Satu set string kunci yang semuanya memiliki beberapa awalan (mis. Semua kata yang dimulai dengan "anti") adalah heterogendistribusi. Dalam kasus terakhir, kamus pertama hanya berisi satu penjilidan, untuk "a", yang kedua hanya untuk "n" dan seterusnya. Mencari pemetaan di trie selalu dengan mencari empat kamus yang sama dengan empat kunci yang sama. Ini tidak efisien dan inilah yang dilakukan oleh oktri jika, misalnya, mereka digunakan untuk menyimpan distribusi partikel yang heterogen di mana sebagian besar partikel berada dalam volume kecil di dalam ruang vektor.


"octrees are mencoba"? Juga, apa yang Anda maksud dengan "menangani heterogenitas dengan lebih baik"? Homogen bukan kata yang saya temui sehubungan dengan pohon.
Noldorin

2
"Octtrees tidak perlu penyeimbangan kembali"? Itu sama sekali tidak benar untuk octtrees yang menyimpan distribusi titik heterogen. Bergantian, tergantung pada seberapa umum Anda mendefinisikan "octtree": Menyeimbangkan ulang octtree tidak mungkin , tidak peduli seberapa diinginkannya.
Jeffε

@Noldorin "octrees are tries". Iya nih. Apakah Anda tahu apa itu trie? en.wikipedia.org/wiki/Trie
Jon Harrop

@Noldorin "Homogen bukan kata yang saya temui sehubungan dengan pohon". Saya mengacu pada homogenitas dari distribusi yang sedang dipartisi. Sebagai contoh, ketika mempartisi partikel dalam ruang 3D maka atom dalam padatan terdistribusi secara homogen sedangkan bintang di alam semesta terdistribusi secara heterogen. pohon kD lebih disukai untuk distribusi heterogen karena pembagian ruang mereka adaptif.
Jon Harrop

@ Jɛ ff E "Menyeimbangkan ulang octtree tidak mungkin". Itulah tepatnya yang saya maksud. Mohon maaf jika kata-kata saya membingungkan.
Jon Harrop

2

Oktaf berguna sebagai datatype dasar untuk model kontinum, lihat misalnya pemecah aliran Gerris . Hidup cukup sulit dalam dinamika fluida, jadi mengetahui bahwa ukuran semua subkub Anda hanya bergantung pada kedalamannya harus menjadi faktor penyederhanaan.

Peringatan: Saya bukan orang yang dinamis!


Menarik. Saya pasti dapat menghargai bahwa octrees lebih mudah untuk digunakan dalam model kontinum ... Saya bertanya-tanya apa alasan pemrograman grafis?
Noldorin
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.