ข้อดีของ octrees ในการแสดงผลเชิงพื้นที่ / เวลาหรืออย่างอื่นและในสถานการณ์ใดที่พวกเขาสามารถใช้งานได้มากที่สุด (ฉันเคยได้ยินการเขียนโปรแกรมกราฟิก 3D)
ต้นไม้ kD เป็นต้นไม้ไบนารีที่มีความสมดุลและมีการลองเลขฐานสิบแปดดังนั้นข้อดีและข้อเสียอาจได้รับมาจากโครงสร้างข้อมูลทั่วไปที่มากขึ้น โดยเฉพาะ:
- การปรับสมดุลอาจมีราคาแพง (แปดไม่จำเป็นต้องปรับสมดุล)
- การปรับสมดุลนั้นช่วยจัดการความแตกต่างได้ดีกว่าเพราะมันปรับตัวได้
- ปัจจัยการแตกแขนงที่สูงขึ้นในเดือนตุลาคมหมายถึงต้นไม้ที่ตื้นกว่า (มีทางอ้อมและการจัดสรรน้อยลง) สำหรับการกระจายแบบเอกพันธ์
นอกจากนี้การแบ่งออกเป็นสองส่วน (เช่นเดียวกับในแปด) ให้การใช้งานเล็กน้อยในแง่ของการทวิบิต ในทำนองเดียวกันฉันคิดว่า octrees สามารถได้รับประโยชน์อย่างมากจากระยะทางที่คำนวณล่วงหน้าเมื่อทำการค้นหาระยะ
แก้ไข
เห็นได้ชัดว่าการอ้างอิงของฉันเพื่อพยายามและความสม่ำเสมอต้องต้องการความกระจ่าง
พยายามเป็นครอบครัวของโครงสร้างข้อมูลที่แสดงโดยต้นไม้ของพจนานุกรมและใช้เป็นพจนานุกรมสำหรับคีย์ที่มีลำดับ (ส่วนใหญ่ที่โดดเด่นสตริง แต่ยังลำดับดีเอ็นเอและบิตในค่าแฮสำหรับพยายามแฮ) หากพจนานุกรมแต่ละอันแมปหนึ่งบิตของพิกัด x, y และ z (บิตที่สำคัญที่สุดในระดับแรกของ trie, บิตที่มีนัยสำคัญต่อไปในระดับที่สองเป็นต้น) จากนั้น trie นั้นจะมีลักษณะเป็นทรีที่แบ่งย่อยพื้นที่ 3D อย่างสม่ำเสมอ ดังนั้น octrees จะสืบทอดลักษณะของความพยายามซึ่งโดยทั่วไปแล้ว:
- ปัจจัยที่มีการแตกแขนงสูงอาจหมายถึงต้นไม้ที่ตื้นซึ่งมีทิศทางไม่กี่ทางดังนั้นการค้นหาจึงรวดเร็วเช่น 20 ระดับของต้นไม้ไบนารีสามารถจัดเก็บใน 4 ระดับของต้นไม้ที่มีปัจจัยการแตกแขนง 256
- ความพยายามไม่ได้รับความสมดุลระหว่างการแทรกและการลบบันทึกการดำเนินการที่มีราคาแพงที่จำเป็นสำหรับต้นไบนารีแบบสมดุล
ข้อเสียคือความแตกต่างสามารถส่งผลให้ลอง / octrees ไม่สมดุลดังนั้นการค้นหาอาจต้องใช้หลายทิศทาง ปัญหาที่เท่าเทียมกันในการพยายามแก้ไขโดยใช้การบีบอัดของขอบเพื่อยุบหลายระดับของการอ้อมไปสู่ระดับเดียว Octrees ไม่ได้ทำสิ่งนี้ แต่ไม่มีอะไรที่จะห้ามไม่ให้คุณบีบอัด octree (แต่ฉันไม่คิดว่าคุณจะเรียกผลลัพธ์นี้ว่า octree ได้!)
สำหรับการเปรียบเทียบให้พิจารณาพจนานุกรมพิเศษสำหรับคีย์สตริงที่แสดงเป็น Trie ระดับแรกของ Trie จะแตกกิ่งกับอักขระตัวแรกในคีย์ ระดับที่สองของตัวละครตัวที่สองเป็นต้น สตริงใด ๆ สามารถค้นหาได้โดยค้นหาอักขระตัวแรกจากคีย์ในพจนานุกรมเพื่อรับพจนานุกรมตัวที่สองที่ใช้ในการค้นหาอักขระตัวที่สองจากคีย์เป็นต้น ชุดของสตริงกุญแจแบบสุ่มจะเป็นการกระจายตัวที่เป็นเนื้อเดียวกัน ชุดของสตริงคีย์ที่ทุกคนใช้คำนำหน้าร่วมกัน (เช่นทุกคำที่ขึ้นต้นด้วย "anti") นั้นต่างกันการกระจาย ในกรณีหลังพจนานุกรมแรกมีเพียงหนึ่งผูกพันสำหรับ "a" พจนานุกรมที่สองเพียงหนึ่งสำหรับ "n" และอื่น ๆ การค้นหาการแมปใด ๆ ในทั้งสามจะเป็นไปได้เสมอโดยการค้นหาพจนานุกรมสี่เล่มเดียวกันด้วยปุ่มสี่ปุ่มเดียวกัน นี่คือสิ่งที่ไม่มีประสิทธิภาพและนี่คือสิ่งที่ octrees ทำถ้าพวกมันถูกใช้เพื่อเก็บการกระจายตัวของอนุภาคที่ต่างกันซึ่งอนุภาคส่วนใหญ่อยู่ในปริมาตรเล็ก ๆ ภายในปริภูมิเวกเตอร์