Uzamsal indeksleme sorunları ile uğraşırken, aslında bir uzamsal karma veya kişisel favorim olan sade eski ızgara ile başlamanızı öneririm.
... ve seyrek temsillere izin veren ağaç yapılarına geçmeden önce zayıflıklarını anlamak
Bariz zayıflıklardan biri, çok sayıda boş hücrede bellek harcayabiliyor olmanızdır (ancak iyi uygulanmış bir ızgara, aslında milyarlarca düğüm eklemek zorunda kalmadıkça hücre başına 32 bitten fazla gerektirmemelidir). Bir diğeri, bir hücrenin boyutundan daha büyük olan ve genellikle düzinelerce hücreye yayılan orta boyutlu öğeleriniz varsa, bu orta boyutlu öğeleri idealden çok daha fazla hücreye yerleştirerek çok fazla bellek harcayabilirsiniz. Benzer şekilde, uzamsal sorgular yaptığınızda, idealden daha fazla hücre, bazen çok daha fazla kontrol etmeniz gerekebilir.
Ancak, belirli bir girdiye karşı olabildiğince optimum hale getirmek için bir ızgara ile incelik yapmak için tek şey cell size
, sizi düşünmek ve kemanlamak için çok fazla şey bırakmayan şeydir ve bu yüzden benim veri yapım kullanmama nedenleri bulana kadar uzamsal indeksleme sorunları için. Uygulaması basittir ve tek bir çalışma zamanı girdisinden başka bir şeyle uğraşmanızı gerektirmez.
Sade eski bir ızgaradan çok şey alabilirsiniz ve aslında ticari yazılımda kullanılan çok sayıda dört ağaç ve kd ağacı uygulamasını düz bir eski ızgarayla değiştirerek yendim (ancak bunlar en iyi uygulananlar değildi) , ancak yazarlar bir tabloyu kırmak için harcadığım 20 dakikadan çok daha fazla zaman harcadı). Çarpışma tespiti için bir ızgara kullanarak başka bir yerde bir soruyu cevaplamak için çırptığım kısa bir şey (gerçekten optimize edilmemiş, sadece birkaç saatlik bir çalışma ve çoğu zaman yol bulmanın soruyu cevaplamak için nasıl çalıştığını öğrenmek zorunda kaldım ve aynı zamanda bu tür çarpışma tespitini ilk kez uyguluyordum):
Izgaraların bir başka zayıflığı (ancak birçok uzamsal indeksleme yapısı için genel zayıflıklardır), aynı konuma sahip birçok nokta gibi çok sayıda çakışan veya çakışan eleman eklerseniz, aynı hücrelere ( ) ve o hücreden geçerken performansı düşürür. Benzer şekilde , hücre boyutundan çok daha büyük, çok daha büyük çok sayıda öğe eklerseniz , bir bot yük hücresine yerleştirilmek ve çok ve çok bellek kullanmak ve karttaki uzamsal sorgular için gereken süreyi kısaltmak isteyeceklerdir. .
Bununla birlikte, yukarıda rastlanan ve büyük elementlerle ilgili bu iki acil sorun aslında tüm mekansal indeksleme yapıları için problemlidir . Sade eski ızgara aslında bu patolojik vakaları diğerlerinden biraz daha iyi ele alır, çünkü en azından hücreleri tekrar tekrar alt bölümlere ayırmak istemez.
Izgara ile başladığınızda ve dört ağaç veya KD ağacı gibi bir şeye doğru ilerlediğinizde, çözmek istediğiniz ana sorun, çok fazla hücreye yerleştirilen, çok fazla hücreye sahip olan ve / veya bu tip yoğun gösterimle çok fazla hücreyi kontrol etmek zorunda kalmak.
Ancak dört ağacı bir ızgara üzerinde bir optimizasyon olarak düşünüyorsanızspesifik kullanım durumlarında, dört ağaç düğümlerinin özyinelemeli alt bölümünün derinliğini sınırlamak için hala bir "minimum hücre boyutu" fikrini düşünmeye yardımcı olur. Bunu yaptığınızda, dört ağacın en kötü senaryosu, yapraklardaki yoğun ızgaraya bozulmaya devam edecek, ızgaradan sadece daha az verimli olacaktır, çünkü kök yerine ızgara hücresine gitmek için logaritmik zaman gerektirecektir. sabit zamanlı. Ancak bu minimum hücre boyutunu düşünmek sonsuz döngü / özyineleme senaryosundan kaçınacaktır. Büyük elementler için, gevşek dörtlü ağaçlar gibi, eşit olarak bölünmeyen ve üst üste binen çocuk düğümleri için AABB'lere sahip olabilecek bazı alternatif varyantlar da vardır. BVH'ler, düğümlerini eşit şekilde bölmeyen mekansal indeksleme yapıları olarak da ilginçtir. Ağaç yapılarına karşı tesadüf unsurlar için, asıl mesele sadece alt bölümlere bir sınır koymak (veya diğerlerinin önerdiği gibi, sadece reddetmek veya yaprak ne zaman belirlendiğinde bir yapraktaki benzersiz sayıda öğeye katkıda bulunmuyormuş gibi davranmanın bir yolunu bulmaktır) alt bölümlere ayırmalıdır). Bir Kd ağacı, çok sayıda çakışan öğeye sahip girdileri öngörürseniz de yararlı olabilir, çünkü bir düğümün medyan bölünmesi gerekip gerekmediğini belirlerken yalnızca bir boyutu göz önünde bulundurmanız gerekir.