ฉันกำลังใช้ควอดทรี สำหรับผู้ที่ไม่ทราบโครงสร้างข้อมูลนี้ฉันรวมถึงคำอธิบายเล็ก ๆ ต่อไปนี้:
ควอดทรีที่มีโครงสร้างข้อมูลและอยู่ในระนาบแบบยุคลิดสิ่งที่ octree อยู่ในพื้นที่ 3 มิติ การใช้ควอดทรีทั่วไปคือการจัดทำดัชนีเชิงพื้นที่
เพื่อสรุปการทำงานของมัน quadtree คือชุดของรูปสี่เหลี่ยมที่นี่ด้วยความจุสูงสุดและกล่องขอบเขตเริ่มต้น เมื่อพยายามที่จะแทรกองค์ประกอบลงในควอดทรีซึ่งมีความจุมากที่สุดควอดทรีจะถูกแบ่งออกเป็น 4 ควอดทรี (การแสดงทางเรขาคณิตซึ่งจะมีพื้นที่เล็กกว่าต้นไม้สี่เท่าก่อนแทรก); แต่ละองค์ประกอบมีการกระจายใน subtrees ตามตำแหน่งของมันคือ มุมบนซ้ายถูกผูกไว้เมื่อทำงานกับสี่เหลี่ยม
ดังนั้นควอดทรีเป็นทั้งใบและมีองค์ประกอบน้อยกว่าความสามารถของมันหรือต้นไม้ที่มี 4 ควอดทรีเป็นเด็ก ๆ
ความกังวลของฉันคือถ้าคุณพยายามเพิ่มรายการที่ซ้ำกันอาจเป็นองค์ประกอบเดียวกันหลายครั้งหรือหลายองค์ประกอบที่มีตำแหน่งเดียวกัน quadtrees มีปัญหาพื้นฐานในการจัดการกับขอบ
ตัวอย่างเช่นถ้าคุณทำงานกับควอดทรีที่มีความจุ 1 และหน่วยสี่เหลี่ยมผืนผ้าเป็นกล่องขอบเขต:
[(0,0),(0,1),(1,1),(1,0)]
และคุณลองแทรกสี่เหลี่ยมสองอันบนขอบเขตซ้ายบนซึ่งเป็นจุดกำเนิด: (หรือในทำนองเดียวกันถ้าคุณลองแทรก N + 1 ครั้งในควอดทรีที่มีความจุ N> 1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
ส่วนแทรกครั้งแรกจะไม่มีปัญหา:
แต่เมื่อแทรกครั้งแรกจะก่อให้เกิดการแบ่ง (เพราะความจุเป็น 1):
สี่เหลี่ยมทั้งสองจึงใส่ในทรีย่อยเดียวกัน
จากนั้นอีกครั้งทั้งสององค์ประกอบจะมาถึงในควอดทรีเดียวกันและก่อให้เกิดการแบ่งย่อย ...
และอื่น ๆ เป็นต้นวิธีการจัดสรรจะทำงานอย่างไม่มีกำหนดเพราะ (0, 0) จะอยู่ในทรีย่อยเดียวกันจากสี่ที่สร้างขึ้นซึ่งหมายถึงปัญหาการวนซ้ำแบบไม่สิ้นสุด
เป็นไปได้หรือไม่ที่จะมีควอดทรีที่ซ้ำซ้อน? (หากไม่ใช่อาจใช้เป็นกSet
)
เราจะแก้ปัญหานี้โดยไม่ทำลายสถาปัตยกรรมของควอดทรีได้อย่างไร