Bir insan KD ağacı üzerinde neden bir Octree kullanıyor?


32

Bilimsel hesaplama konusunda biraz tecrübem var ve BSP (ikili alan bölümleme) uygulamaları için yaygın olarak kd-ağaçları kullandım. Son zamanlarda, 3 Boyutlu Öklid uzaylarını bölmek için kullanılan benzer bir veri yapısı olan oktre'lere daha fazla aşina oldum, fakat toplananlardan düzenli aralıklarla çalışan bir tanesi.

Bir parça bağımsızlık araştırması, kd-ağaçlarının çoğu veri setinde performansta üstün olduğunu gösteriyor - inşa etmek ve sorgulamak daha hızlı. Benim sorum şu ki, oktre'lerin mekansal / zamansal performans veya diğer durumlarda avantajları nelerdir ve en çok hangi durumlarda uygulanabilir? (3D grafik programlama duydum)? Her iki tipteki avantajların ve sorunların bir özeti en çok takdir edeceğim.

Ek olarak, eğer birisi R-tree veri yapısının kullanımı ve avantajları hakkında ayrıntılı bilgi verebilirse, bunun için minnettar olurum. R-ağaçları (octrees'den daha fazla), k-en yakın komşu veya aralık aramaları için kd-ağaçlarına benzer şekilde uygulanıyor gibi görünmektedir.


Hem kd ağaçlarının hem de R ağaçlarının (ancak octrees değil) k-en yakın komşu aramalarını kolaylaştırmak için özel olarak tasarlandıklarını not etmeliyim - bu anlamda nasıl karşılaştırırlar?
Noldorin

Bir not kd-ağaçlarının küçük derinliği garanti ettiğidir. Sıkıştırılmış dörtlü ağaçlar sizi oraya götürebilir, ancak daha az kullanışlıdır.
Suresh Venkat

@Suresh Venkat: Bunun için teşekkürler. Sıkıştırılmış quadtrees aşina değilim, ama onlar gerçekten üç boyutlu mekansal temsilcileri için uygun olur mu? Belki de "sıkıştırılmış sekizli" bir analog var.
Noldorin

Biri Z-düzeninde (boşluk doldurma) bilinen bir eğri olduğunda oktre'lerin daha uygun olduğunu da duydum, ancak buradaki mantıktan tam olarak emin değilim.
Noldorin

Yanıtlar:


23

Bir hücreler octree hücreleri kübik olmasını garanti oysa-ağacı, yüksek en-boy oranına sahip olabilir. Bu bir teori kurulu olduğundan, yüksek en boy oranının bir sorun olmasının teorik nedenini vereceğim: yaklaşık en yakın komşu sorguları çözerken incelemeniz gereken hücre sayısını kontrol etmek için hacim sınırlarının kullanılmasını imkansız kılıyor.kD

Daha ayrıntılı olarak: Bir sorarsanız sorgu noktası için -approximate yakın komşumuz q ve gerçek en yakın komşu mesafesi olan d , genellikle bir arama ile bitirmek olduğunu inceler her veri yapısı hücre olduğu için içeriden ulaşır iç yarıçapı d ve dış yarıçapı ( 1 + ϵ ) d olan bir halka veya halka şeklindeki kabuğun dışında d . Hücreler sınırlı boy oranına sahiptir, bunlar bir Dörtlüağaç olduğu gibi, o zaman en fazla olabilir 1 / ε d - 1 tür hücreler ve sorgu için zaman iyi bir sınır kanıtlayabilir. En-boy oranı da olduğu gibi sınırlı değilse kϵqdd(1+ϵ)d1/ϵd1 ağaç, bu sınırlar geçerli değil.kD

ağaçların dörtlü ağaçlara göre farklı avantajları vardır, çünkü en yakın komşu sorgusu için zamana katkıda bulunan en fazla logaritmik derinliğe sahip olmaları garanti edilir. Ancak, bir dörtlünün derinliği en çok genellikle büyük olmayan girişin hassasiyetinin bit sayısıdır ve esas olarak logaritmik olmak için derinliği kontrol etmek için teorik yöntemler vardır (atlama dörtlü veri yapısına bakınız).kD


4
Sıkıştırılmış dörtlüklerin modern bir özeti için Sariel Har-Peled'in son kitabına bakınız.
Jeffε

İyi bir nicel özet için teşekkürler, David. Sadece onaylamak için: "en boy oranı" kullanımınız "dallanma oranı" ile eşanlamlı mıdır? Kesinlikle quadrees / octrees ve belki de sıkıştırılmış quadtrees / octrees atlamak kontrol etmek zorunda kalacağım.
Noldorin

1
Dikdörtgen bir kutunun en boy oranı, en uzun kenar uzunluğunun en kısa kenar uzunluğuna oranı olarak tanımlanabilir. Bu bağlamda hangi dallanma oranının ne anlama geldiğini bilmiyorum ama en boy oranı ağaçların dallanma faktörü ile ilişkili değil (her iki veri yapısı için de sabit).
David Eppstein

"Hücreleri" özledim. Şimdi mantıklı.
Noldorin,

15

Bir grup arkadaşım ve ben bir uzay-RTS oyunu için eğlenceli bir yan proje olarak çalışıyoruz. Computer Science'ta öğrendiğimiz birçok şeyi yüksek verimli kılmak için kullanıyoruz, bu da daha sonra büyük ordular yapmamızı sağlıyor.

Bunun için kd-ağaçları kullanmayı düşündük, ancak onları hemen reddettik: programlarımızda yerleştirmeler ve silmeler oldukça yaygındır (uzayda uçan bir gemi düşünün) ve bu kd-ağaçları ile yapılan kutsal bir karmaşadır. Bu yüzden oyunumuz için rakamları seçtik.


Ah evet, bunu daha önce de duydum. Kd-ağaçları ile ekleme / silme pahalı bir işlemdir (yeniden dengeleme nedeniyle). Ancak en iyi durum karmaşıklığının hala aynı olduğuna inanıyorum ...
Noldorin

2
Kd-ağacını nasıl tamir edeceğinize bağlı. İyi bir en iyi durum zaman karmaşıklığı, genellikle hedeflediğim bir şey değildir: örneğin bogosort, bir O (1) en iyi durum karmaşıklığına sahiptir, ancak umarım hiç kimse onu kullanmaz.
Alex ten Brink

Ne yazık ki, bu veri yapıları üzerindeki ortak işlemler için zaman karmaşıklığının iyi bir özetini bulamıyorum, fakat aklımda değil. Ortalama durum zaman karmaşıklığı çoğu zaman anlayışlı ...
Noldorin

1
Sadece eksenleri çevreleyen ve alanı ortadan ikiye bölen bir KD ağacı kullandıysanız, hala daha iyisini yapacağınızı düşünüyorum. Büyük SAH ve diğer pahalı medyan kesimlerini atlayın; yalnızca bir octree'den daha hızlı arama yapan değil, aynı zamanda daha hızlı yapılan bir şeyle karşılaşırsınız. Alanı, bir octree ile olduğu gibi eşit bir şekilde bölümlendirdiğiniz için, ancak 8-ary ağacı yerine bir ikili ağaçla yaptığınız için, kaldırma için daha önce ne yaptıysanız, KD-ağacı ile daha karmaşık olmamalıdır. Benzer şekilde eşit aralıklarla yerleştirilecektir. Örn: sadece N derinliğinin ötesindeki boş düğümleri kaldırabilirsiniz
Dragon Energy

8

Oktre'lerin mekansal / zamansal performans veya diğer avantajları nelerdir ve en çok hangi durumlarda uygulanabilirler (3D grafik programlama duydum)?

kD ağaçları dengeli ikili ağaçlar ve octrees are çalışır avantajlar ve dezavantajlar Muhtemelen bu daha genel veri yapıları miras böylece. özellikle:

  • Yeniden dengeleme pahalı olabilir (rakamların yeniden dengelenmesi gerekmez).
  • Dengeleme, heterojenliği daha iyi idare eder, çünkü adaptifdir.
  • Oktalarda daha yüksek dallanma faktörü, homojen dağılımlar için daha sığ ağaçlar (daha az indirme ve tahsis) anlamına gelir.

Ayrıca, bisection (octrees'te olduğu gibi) bit-twiddling anlamında önemsiz uygulamaya yol açar. Benzer şekilde, octrees'ın aralık aramaları yaparken önceden hesaplanan mesafelerden büyük ölçüde faydalanabileceğini hayal ediyorum.

DÜZENLE

Görünüşe göre denemeler ve homojenliğe olan referanslarım açıklığa kavuşturulmalı.

Denemeler , sözlük ağaçları ile temsil edilen bir veri yapıları ailesidir ve diziler olan anahtarlar için sözlükler olarak kullanılır (en önemlisi dizeler değil, aynı zamanda DNA dizileri ve karma denemeler için karma değerindeki bitler). Eğer her bir sözlük, x, y ve z koordinatlarının her birini bir bitle eşleştirirse (trie'nin birinci seviyesindeki en önemli bit, ikinci seviyedeki sonraki önemli bit vb.), O zaman, trie, 3B alanı tekdüze olarak alt ayıran bir octree'dir. Bu nedenle, octrees, genel olarak şu denemelerin özelliklerini miras alır:

  • Yüksek dallanma faktörü, birkaç aktarma gerektiren sığ ağaçlar anlamına gelebilir, bu nedenle arama hızlıdır, örneğin, 20 dalda ikili seviye ağacı, dallanma faktörü 256 olan bir ağacın 4 katında depolanabilir.
  • Denemeler, yerleştirme ve silme işlemlerinde yeniden dengelenmez, bu sayede dengeli ikili ağaçlar için gereken pahalı bir işlem sağlanır.

Dezavantajı, heterojenliğin dengesiz denemeler / oktre'ler ile sonuçlanabilmesidir, bu yüzden aramalar birçok aktarma gerektirebilir. Denemelerdeki eşdeğer problem, çoklu indirme seviyesini tek bir seviyeye daraltmak için kenar sıkıştırma kullanılarak çözülür. Octrees bunu yapmaz, ancak sizi bir oktree sıkıştırmaktan alıkoyacak hiçbir şey yoktur (ama sonucu octree olarak adlandırabileceğinizi sanmıyorum!)

Karşılaştırma için, trie olarak temsil edilen dize tuşlarına ilişkin özel bir sözlüğü düşünün. Trie'nin birinci seviyesi, anahtardaki ilk karakter üzerinde gösterilir. İkinci karakterdeki ikinci seviye vb. Herhangi bir dize, anahtardaki ikinci karakteri aramak için kullanılan ikinci bir sözlüğü elde etmek için kullanılan anahtardaki ilk karakter aranarak aranabilir. Bir dizi rasgele anahtar dizesi homojen bir dağılım olacaktır. Bazı önekleri paylaşan bir anahtar dizeler kümesi (örneğin, "anti" ile başlayan tüm kelimeler) heterojendirdağılımı. İkinci durumda, ilk sözlük "a" için yalnızca bir bağlayıcı, ikincisi "n" için yalnızca bir bağlayıcı içerir. Her eşlemede eşleme aramak her zaman aynı dört sözlüğü kullanarak aynı dört sözlükte arama yaparak. Bu verimsizdir ve örneğin, partiküllerin büyük çoğunluğunun vektör alanı içinde küçük bir hacimde yer aldığı heterojen parçacık dağılımlarını depolamak için kullanılırsa octrees'in yaptığı şeydir.


"octrees deniyor"? Ayrıca, "heterojenliği daha iyi ele almak" ile ne demek istiyorsunuz? Homojen ağaçlarla ilgili karşılaştığım bir kelime değil.
Noldorin

2
"Octtrees yeniden dengeleme gerekmez"? Bu, heterojen nokta dağılımlarını depolayan ocre'ler için kesinlikle doğru değildir. Alternatif olarak, "octtree" i genel olarak nasıl tanımladığınıza bağlı olarak: Bir octtree yeniden dengelemek ne kadar arzu edilebilir olursa olsun, kesinlikle imkansızdır .
Jeffε

@Noldorin "octrees deniyor". Evet. Ne olduğunu biliyor musun? en.wikipedia.org/wiki/Trie
Jon Harrop

@Noldorin "Homojen ağaçlara göre karşılaştığım bir kelime değil". Bölünmekte olan dağıtımın homojenliğine değiniyorum. Örneğin, parçacıkları bir 3B alanda bölümlerken, bir katıdaki atomlar homojen olarak dağılırken, evrendeki yıldızlar heterojen şekilde dağılır. kD ağaçlarının heterojen dağılımlar için tercih edilmeleri daha muhtemeldir, çünkü alanların alt bölümleri uyarlanabilirdir.
Jon Harrop

@ Jɛ ff E "Bir octtree yeniden dengelemek sadece imkansız". Ben de onu kastediyordum. İfadelerim kafa karıştırıcıysa özür dilerim.
Jon Harrop

2

Octrees, süreklilik modelleri için temel veri türü olarak kullanışlıdır, bakınız örneğin Gerris akış çözücü. Akışkanlar dinamiğinde yaşam yeterince zor, bu yüzden tüm alt tüplerinizin boyutlarının sadece derinliğine bağlı olduğunu bilmek basitleştirici bir faktöre sahip olmalıdır.

Uyarı: Ben bir akışkan dinamiği değilim!


İlginç. Süreklilik modellerinde octrees ile çalışmak daha kolay olduğunu kesinlikle söyleyebilirim ... Grafik programlama için neden ne olduğunu merak ediyorum?
Noldorin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.