ทำไมคนเราถึงใช้ Octree บนต้นไม้ KD?


32

ฉันมีประสบการณ์ในการคำนวณทางวิทยาศาสตร์และใช้ kd-trees อย่างกว้างขวางสำหรับแอปพลิเคชัน BSP (การแบ่งพื้นที่แบบไบนารี) เมื่อเร็ว ๆ นี้ฉันคุ้นเคยกับ octrees ซึ่งเป็นโครงสร้างข้อมูลที่คล้ายกันสำหรับการแบ่งช่องว่างแบบ Euclidean แบบ 3 มิติ แต่สิ่งหนึ่งที่ทำงานในช่วงเวลาปกติคงที่จากสิ่งที่ฉันรวบรวม

การวิจัยอิสระดูเหมือนว่าบ่งชี้ว่า kd-trees นั้นมีประสิทธิภาพที่เหนือกว่าสำหรับชุดข้อมูลส่วนใหญ่ - เร็วกว่าในการสร้างและสืบค้น คำถามของฉันคืออะไรข้อได้เปรียบของ octrees ในด้านประสิทธิภาพเชิงพื้นที่ / เวลาหรืออย่างอื่นและในสถานการณ์ใดที่พวกเขาใช้งานได้มากที่สุด (ฉันเคยได้ยินการเขียนโปรแกรมกราฟิก 3D) บทสรุปของข้อดีและปัญหาของทั้งสองประเภทจะขอชื่นชมมากที่สุด

พิเศษถ้าใครสามารถอธิบายเกี่ยวกับการใช้โครงสร้างข้อมูล R-tree และข้อดีของมันฉันก็จะขอบคุณเช่นกัน ดูเหมือนว่าจะใช้ต้นไม้ R (มากกว่าแปดสิบต้น) ในทำนองเดียวกันกับ kd-trees สำหรับการค้นหาเพื่อนบ้าน k หรือใกล้เคียงที่สุด


ฉันควรทราบว่าทั้ง kd-trees และ R-trees (แต่ไม่ใช่ octrees) ดูเหมือนได้รับการออกแบบมาโดยเฉพาะเพื่ออำนวยความสะดวกในการค้นหาเพื่อนบ้านที่ใกล้ที่สุด k- พวกเขาเปรียบเทียบในแง่นี้ได้อย่างไร?
Noldorin

สิ่งที่ควรทราบอย่างหนึ่งคือ kd-trees รับประกันความลึกเล็กน้อย ต้นไม้สี่ต้นที่ถูกบีบอัดสามารถไปถึงที่นั่นได้ แต่จะสะดวกกว่า
Suresh Venkat

@Suresh Venkat: ขอบคุณสำหรับสิ่งนั้น ฉันไม่คุ้นเคยกับ quadtrees ที่ถูกบีบอัด แต่พวกเขาจะเหมาะสำหรับพนักงานอวกาศแบบสามมิติหรือไม่? บางทีอาจมี "อนาล็อคที่ถูกบีบอัด"
Noldorin

ฉันเคยได้ยินด้วยว่า octrees มีความเหมาะสมมากกว่าเมื่อมีเส้นโค้ง Z-order (การเติมช่องว่าง) ที่รู้จักกันดี แต่ฉันไม่แน่ใจเกี่ยวกับเหตุผลที่นี่
Noldorin

คำตอบ:


23

เซลล์ใน tree สามารถมีอัตราส่วนภาพสูงในขณะที่เซลล์แปดชั้นรับประกันว่าเป็นแบบสามมิติ เนื่องจากนี่คือบอร์ดทฤษฎีฉันจะให้เหตุผลเชิงทฤษฎีว่าทำไมอัตราส่วนภาพที่สูงจึงเป็นปัญหา: มันเป็นไปไม่ได้ที่จะใช้ขอบเขตปริมาณเพื่อควบคุมจำนวนของเซลล์ที่คุณต้องตรวจสอบเมื่อแก้แบบสอบถามเพื่อนบ้านที่ใกล้เคียงที่สุดโดยประมาณkD

ในรายละเอียดเพิ่มเติมได้ที่: ถ้าคุณขอ -approximate เพื่อนบ้านที่ใกล้ที่สุดไปยังจุดแบบสอบถามQและเพื่อนบ้านที่ใกล้ที่สุดที่เกิดขึ้นจริงเป็นระยะทางdคุณมักจะจบลงด้วยการค้นหาที่จะตรวจสอบทุกเซลล์โครงสร้างข้อมูลที่ต้นน้ำจากภายในไป ด้านนอกของห่วงหรือเปลือกเป็นรูปวงแหวนที่มีภายในรัศมีdและรัศมีนอก( 1 + ε ) d หากเซลล์มีอัตราส่วนล้อมรอบเช่นที่พวกเขาอยู่ในควอดทรีนั้นมีได้มากที่สุด1 / ε d - 1เซลล์ดังกล่าวและคุณสามารถพิสูจน์ขอบเขตที่ดีในเวลาสำหรับแบบสอบถาม หากอัตราส่วนภาพไม่ได้ถูก จำกัด ขอบเขตเช่นเดียวกับในkϵqdd(1+ϵ)d1/ϵd1รีขอบเขตเหล่านี้ใช้ไม่ได้kD

-trees มีข้อได้เปรียบที่แตกต่างไปจากควอดทรีซึ่งพวกมันรับประกันว่าจะมีความลึกลอการิทึมส่วนใหญ่ซึ่งยังให้เวลาสำหรับการค้นหาเพื่อนบ้านที่ใกล้ที่สุด แต่ความลึกของควอดทรีนั้นมากที่สุดคือจำนวนบิตของความแม่นยำของอินพุตซึ่งโดยทั่วไปไม่ใหญ่และมีวิธีการทางทฤษฎีสำหรับการควบคุมความลึกที่จะเป็นลอการิทึมเป็นหลัก (ดูโครงสร้างข้อมูลควอดทรีข้าม)kD


4
ดูตำราล่าสุดของ Sariel Har-Peled สำหรับข้อมูลสรุปที่ทันสมัยของ quadtrees ที่ถูกบีบอัด
Jeffε

ขอบคุณสำหรับการสรุปเชิงปริมาณที่ดีเดวิด เพียงเพื่อยืนยัน: คุณใช้ "อัตราส่วนภาพ" ตรงกันกับ "อัตราส่วนการแตกแขนง" หรือไม่? ฉันจะต้องตรวจสอบข้าม quadrees / octrees และบีบอัด quadtrees / octrees ด้วย
Noldorin

1
อัตราส่วนของกล่องสี่เหลี่ยมสามารถกำหนดเป็นอัตราส่วนของความยาวของขอบที่ยาวที่สุดต่อความยาวของขอบที่สั้นที่สุด ฉันไม่รู้ว่าควรจะหมายถึงการแตกแขนงในบริบทนี้เท่าไร แต่อัตราส่วนภาพนั้นไม่เกี่ยวข้องกับปัจจัยการแตกกิ่งของต้นไม้ (ซึ่งคงที่สำหรับโครงสร้างข้อมูลทั้งสอง)
David Eppstein

ฉันพลาด "เซลล์ใน" ทำให้รู้สึกตอนนี้
Noldorin

15

กลุ่มเพื่อนและฉันกำลังทำงานในเกม space-RTS เป็นโครงการสนุก ๆ เราใช้สิ่งต่าง ๆ มากมายที่เราเรียนรู้จากวิทยาการคอมพิวเตอร์เพื่อให้มีประสิทธิภาพสูงทำให้เราสามารถสร้างกองทัพขนาดใหญ่ได้ในภายหลัง

เพื่อจุดประสงค์นี้เราได้พิจารณาใช้ต้นไม้ kd แต่เรายกเลิกอย่างรวดเร็ว: การแทรกและการลบนั้นเป็นเรื่องธรรมดามากในโปรแกรมของเรา (พิจารณาเรือที่บินผ่านอวกาศ) และนี่เป็นระเบียบที่ไม่บริสุทธิ์กับต้นไม้ kd เราจึงเลือกแปดสำหรับเกมของเรา


อ่าใช่ฉันเคยได้ยินเรื่องนี้มาก่อนเช่นกัน การแทรก / ลบด้วย kd-trees เป็นการดำเนินการที่มีค่าใช้จ่ายสูง (เนื่องจากการปรับสมดุลใหม่) ผมเชื่อว่าความซับซ้อนเวลาที่ดีที่สุดในกรณีที่ยังคงเดิม แต่ ...
Noldorin

2
มันขึ้นอยู่กับว่าคุณจะซ่อม kd-tree อย่างไร ความซับซ้อนของเวลาที่ดีที่สุดในกรณีที่ดีไม่ใช่สิ่งที่ฉันมักตั้งเป้าไว้เช่น bogosort มี O-1 ที่ดีที่สุดในกรณีที่ซับซ้อน แต่ฉันหวังว่าจะไม่มีใครใช้มัน
Alex ten Brink

น่าเสียดายที่ฉันไม่สามารถหาข้อสรุปที่ดีเกี่ยวกับความซับซ้อนของเวลาสำหรับการดำเนินการทั่วไปในโครงสร้างข้อมูลเหล่านี้ได้ แต่ไม่ควรคำนึงถึง ความซับซ้อนของเวลาโดยเฉลี่ยมักจะเป็นเรื่องที่ลึกซึ้ง ...
ริน

1
ฉันคิดว่าคุณน่าจะทำได้ดีกว่านี้ถ้าคุณใช้ต้นไม้ KD ที่ใช้ขวานเป็นแกนและแบ่งพื้นที่ออกเป็นกึ่งกลาง ข้าม SAH อันยิ่งใหญ่และการตัดค่ามัธยฐานราคาแพงอื่น ๆ และคุณจะพบกับสิ่งที่ไม่เพียง แต่ค้นหาได้เร็วกว่าแปดเดือน แต่ยังสร้างได้เร็วขึ้น เนื่องจากคุณแบ่งพาร์ติชั่นอย่างเท่าเทียมกับที่คุณทำกับ octree แต่ด้วยต้นไม้ไบนารีแทนที่จะเป็น 8-ary tree สิ่งที่คุณทำก่อนหน้านี้สำหรับการลบไม่ควรจะซับซ้อนกว่านี้กับต้นไม้ KD จะเว้นระยะเท่ากันในวิธีที่คล้ายกัน ตัวอย่าง: คุณอาจลบโหนดว่างเปล่าที่เกินความลึกของ N.
Dragon Energy

8

ข้อดีของ octrees ในการแสดงผลเชิงพื้นที่ / เวลาหรืออย่างอื่นและในสถานการณ์ใดที่พวกเขาสามารถใช้งานได้มากที่สุด (ฉันเคยได้ยินการเขียนโปรแกรมกราฟิก 3D)

ต้นไม้ kD เป็นต้นไม้ไบนารีที่มีความสมดุลและมีการลองเลขฐานสิบแปดดังนั้นข้อดีและข้อเสียอาจได้รับมาจากโครงสร้างข้อมูลทั่วไปที่มากขึ้น โดยเฉพาะ:

  • การปรับสมดุลอาจมีราคาแพง (แปดไม่จำเป็นต้องปรับสมดุล)
  • การปรับสมดุลนั้นช่วยจัดการความแตกต่างได้ดีกว่าเพราะมันปรับตัวได้
  • ปัจจัยการแตกแขนงที่สูงขึ้นในเดือนตุลาคมหมายถึงต้นไม้ที่ตื้นกว่า (มีทางอ้อมและการจัดสรรน้อยลง) สำหรับการกระจายแบบเอกพันธ์

นอกจากนี้การแบ่งออกเป็นสองส่วน (เช่นเดียวกับในแปด) ให้การใช้งานเล็กน้อยในแง่ของการทวิบิต ในทำนองเดียวกันฉันคิดว่า octrees สามารถได้รับประโยชน์อย่างมากจากระยะทางที่คำนวณล่วงหน้าเมื่อทำการค้นหาระยะ

แก้ไข

เห็นได้ชัดว่าการอ้างอิงของฉันเพื่อพยายามและความสม่ำเสมอต้องต้องการความกระจ่าง

พยายามเป็นครอบครัวของโครงสร้างข้อมูลที่แสดงโดยต้นไม้ของพจนานุกรมและใช้เป็นพจนานุกรมสำหรับคีย์ที่มีลำดับ (ส่วนใหญ่ที่โดดเด่นสตริง แต่ยังลำดับดีเอ็นเอและบิตในค่าแฮสำหรับพยายามแฮ) หากพจนานุกรมแต่ละอันแมปหนึ่งบิตของพิกัด x, y และ z (บิตที่สำคัญที่สุดในระดับแรกของ trie, บิตที่มีนัยสำคัญต่อไปในระดับที่สองเป็นต้น) จากนั้น trie นั้นจะมีลักษณะเป็นทรีที่แบ่งย่อยพื้นที่ 3D อย่างสม่ำเสมอ ดังนั้น octrees จะสืบทอดลักษณะของความพยายามซึ่งโดยทั่วไปแล้ว:

  • ปัจจัยที่มีการแตกแขนงสูงอาจหมายถึงต้นไม้ที่ตื้นซึ่งมีทิศทางไม่กี่ทางดังนั้นการค้นหาจึงรวดเร็วเช่น 20 ระดับของต้นไม้ไบนารีสามารถจัดเก็บใน 4 ระดับของต้นไม้ที่มีปัจจัยการแตกแขนง 256
  • ความพยายามไม่ได้รับความสมดุลระหว่างการแทรกและการลบบันทึกการดำเนินการที่มีราคาแพงที่จำเป็นสำหรับต้นไบนารีแบบสมดุล

ข้อเสียคือความแตกต่างสามารถส่งผลให้ลอง / octrees ไม่สมดุลดังนั้นการค้นหาอาจต้องใช้หลายทิศทาง ปัญหาที่เท่าเทียมกันในการพยายามแก้ไขโดยใช้การบีบอัดของขอบเพื่อยุบหลายระดับของการอ้อมไปสู่ระดับเดียว Octrees ไม่ได้ทำสิ่งนี้ แต่ไม่มีอะไรที่จะห้ามไม่ให้คุณบีบอัด octree (แต่ฉันไม่คิดว่าคุณจะเรียกผลลัพธ์นี้ว่า octree ได้!)

สำหรับการเปรียบเทียบให้พิจารณาพจนานุกรมพิเศษสำหรับคีย์สตริงที่แสดงเป็น Trie ระดับแรกของ Trie จะแตกกิ่งกับอักขระตัวแรกในคีย์ ระดับที่สองของตัวละครตัวที่สองเป็นต้น สตริงใด ๆ สามารถค้นหาได้โดยค้นหาอักขระตัวแรกจากคีย์ในพจนานุกรมเพื่อรับพจนานุกรมตัวที่สองที่ใช้ในการค้นหาอักขระตัวที่สองจากคีย์เป็นต้น ชุดของสตริงกุญแจแบบสุ่มจะเป็นการกระจายตัวที่เป็นเนื้อเดียวกัน ชุดของสตริงคีย์ที่ทุกคนใช้คำนำหน้าร่วมกัน (เช่นทุกคำที่ขึ้นต้นด้วย "anti") นั้นต่างกันการกระจาย ในกรณีหลังพจนานุกรมแรกมีเพียงหนึ่งผูกพันสำหรับ "a" พจนานุกรมที่สองเพียงหนึ่งสำหรับ "n" และอื่น ๆ การค้นหาการแมปใด ๆ ในทั้งสามจะเป็นไปได้เสมอโดยการค้นหาพจนานุกรมสี่เล่มเดียวกันด้วยปุ่มสี่ปุ่มเดียวกัน นี่คือสิ่งที่ไม่มีประสิทธิภาพและนี่คือสิ่งที่ octrees ทำถ้าพวกมันถูกใช้เพื่อเก็บการกระจายตัวของอนุภาคที่ต่างกันซึ่งอนุภาคส่วนใหญ่อยู่ในปริมาตรเล็ก ๆ ภายในปริภูมิเวกเตอร์


"แปดพยายาม" นอกจากนี้คุณหมายถึงอะไรโดย "จัดการเซลล์สืบพันธุ์ที่ดีกว่า"? เนื้อเดียวกันไม่ได้เป็นคำที่ฉันพบเกี่ยวกับต้นไม้
Noldorin

2
"Octtrees ไม่ต้องการปรับสมดุล" นั่นไม่จริงอย่างแน่นอนสำหรับ octtrees ที่เก็บการแจกแจงจุดที่ต่างกัน อีกวิธีหนึ่งขึ้นอยู่กับว่าคุณกำหนด "octtree" โดยทั่วไป: การปรับสมดุลของ octtree นั้นเป็นไปไม่ได้ไม่ว่าจะเป็นไปตามที่ต้องการก็ตาม
Jeffε

@Noldorin "พยายามแปดตอน" ใช่. คุณรู้ไหมว่าคู่ชีวิตคืออะไร? en.wikipedia.org/wiki/Trie
Jon Harrop

@Noldorin "เป็นเนื้อเดียวกันไม่ใช่คำที่ฉันได้พบเกี่ยวกับต้นไม้" ฉันหมายถึงความสม่ำเสมอของการแจกแจงที่แบ่งพาร์ติชัน ตัวอย่างเช่นเมื่อแบ่งอนุภาคในพื้นที่ 3 มิติแล้วอะตอมในของแข็งจะกระจายอย่างสม่ำเสมอในขณะที่ดาวในเอกภพมีการกระจายแบบไม่ต่อเนื่อง ต้นไม้ kD มีแนวโน้มที่จะเป็นที่นิยมมากกว่าสำหรับการแจกแจงที่แตกต่างกันเนื่องจากการแบ่งพื้นที่ของพวกเขาคือการปรับตัว
Jon Harrop

@ Jɛ ff E "การปรับสมดุล octtree เป็นไปไม่ได้" นั่นคือสิ่งที่ฉันหมายถึง ขอโทษถ้าถ้อยคำของฉันสับสน
Jon Harrop

2

Octrees มีประโยชน์เป็นประเภทฐานหลักสำหรับโมเดลต่อเนื่องให้ดูตัวอย่างตัวแก้ปัญหาการไหลของGerris ชีวิตนั้นยากพอในพลศาสตร์ของของเหลวดังนั้นการรู้ว่าขนาดของ subcubes ทั้งหมดของคุณขึ้นอยู่กับความลึกของพวกมันเท่านั้นที่จะต้องมีปัจจัยที่ทำให้ง่ายขึ้น

Caveat: ฉันไม่ใช่นักเคลื่อนไหวแบบคล่องแคล่ว!


น่าสนใจ แน่นอนฉันสามารถชื่นชมว่า octrees นั้นทำงานกับแบบจำลองต่อเนื่องได้ง่ายกว่า ... ฉันสงสัยว่าทำไมการเขียนโปรแกรมกราฟิกล่ะ?
Noldorin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.