เช่นเดียวกับคำถามเกือบทั้งหมดแนวทางที่ดีที่สุดนั้นขึ้นอยู่กับ "การใช้เคส" และวิธีแสดงคุณสมบัติ กรณีการใช้งานโดยทั่วไปจะแตกต่างกันโดย (a) ว่ามีวัตถุจำนวนมากหรือน้อยในแต่ละชั้นและ (b) หรือไม่ว่าทั้งสองชั้น (หรือทั้งสอง) อนุญาตให้ precomputing โครงสร้างข้อมูลบางส่วน; นั่นคือไม่ว่าจะหนึ่งหรือทั้งสองอย่างเพียงพอและไม่เปลี่ยนแปลงเพื่อให้การลงทุนใน precomputation คุ้มค่า
ในกรณีปัจจุบันสิ่งนี้จะให้ภาพจำลองต่อไปนี้ โดยปกติแล้วคะแนนจะเป็นแบบไดนามิกนั่นคือจะไม่ได้รับล่วงหน้า (ถ้ามีล่วงหน้าหรือในกลุ่มที่มีขนาดใหญ่มากการปรับให้เหมาะสมบางอย่างจากการเรียงลำดับจะพร้อมใช้งาน) ให้Qเป็นจำนวนจุดสอบถามและPเป็นจำนวนจุดยอดรูปหลายเหลี่ยม
ข้อมูลรูปหลายเหลี่ยมเวกเตอร์
(1) ไม่กี่จุดจุดรูปหลายเหลี่ยมไม่กี่ใน toto ใช้วิธีแรงเดรัจฉานเช่นคลาสสิกอัลกอริทึมสายแทง สำหรับวิธีการที่เหมาะสมใด ๆ ค่าใช้จ่ายคือ O (P * Q) เนื่องจากราคา O (1) เวลาในการเปรียบเทียบจุดหนึ่งกับขอบรูปหลายเหลี่ยมและการเปรียบเทียบทั้งหมดจะต้องทำ
(2) อาจมีจุดยอดรูปหลายเหลี่ยมหลายรูปแบบ แต่เป็นแบบไดนามิก:ทุกครั้งที่มีการใช้จุดในแบบสอบถามรูปหลายเหลี่ยมอาจมีการเปลี่ยนแปลง ใช้อัลกอริทึมแรงเดรัจฉานอีกครั้ง ราคายังคงเป็น O (P * Q) ซึ่งจะมีขนาดใหญ่เพราะPจะมีขนาดใหญ่ แต่ไม่มีการช่วยเหลือ หากการเปลี่ยนแปลงมีขนาดเล็กหรือควบคุม ( เช่นรูปหลายเหลี่ยมมีการเปลี่ยนแปลงรูปร่างเล็กน้อยหรือเพียงแค่เคลื่อนที่ไปรอบ ๆ อย่างช้าๆ) คุณอาจจะสามารถใช้เวอร์ชันของโซลูชันถัดไปและหาวิธีที่มีประสิทธิภาพในการปรับปรุงโครงสร้างข้อมูลเมื่อรูปหลายเหลี่ยมเปลี่ยนแปลง นั่นน่าจะเป็นเรื่องของการวิจัยแบบดั้งเดิม
(3) จุดยอดรูปหลายเหลี่ยมและรูปหลายเหลี่ยมคงที่ (นั่นคือชั้นรูปหลายเหลี่ยมจะไม่ค่อยเปลี่ยนแปลง) คำนวณโครงสร้างข้อมูลล่วงหน้าเพื่อสนับสนุนการค้นหา (ซึ่งอาจขึ้นอยู่กับการกวาดบรรทัดหรืออัลกอริธึมควอดทรี ) ค่าใช้จ่ายล่วงหน้าสำหรับอัลกอริธึมเหล่านี้คือ O (P * log (P)) แต่ค่าใช้จ่ายของการสืบค้นกลายเป็น O (Q * log (P)) ดังนั้นค่าใช้จ่ายทั้งหมดคือ O ((P + Q) * บันทึก ( P))
การปรับปรุงบางอย่างมีให้ในกรณีพิเศษเช่น
(a) รูปหลายเหลี่ยมทั้งหมดเป็นรูปนูน (การประมวลผลรูปหลายเหลี่ยมล่วงหน้าสามารถทำได้เร็วกว่า )
(b) การตกแต่งภายในรูปหลายเหลี่ยมทั้งหมดแยกออกจากกันซึ่งในกรณีนี้คุณสามารถคิดว่าสหภาพของพวกเขาเป็นรูปหลายเหลี่ยมเดียว (ซึ่งช่วยให้อัลกอริทึมที่มีประสิทธิภาพตรงไปตรงมาเช่นที่อยู่บนพื้นฐานของสมการและ
(c) รูปหลายเหลี่ยมส่วนใหญ่ไม่คดเคี้ยวมาก -นั่นคือพวกเขาครอบครองส่วนใหญ่ของกล่องขอบเขตของพวกเขา - ในกรณีที่คุณสามารถทำการทดสอบเริ่มต้นขึ้นอยู่กับกล่องขอบเขตเท่านั้นแล้วปรับแก้ปัญหานั้น นี่คือการเพิ่มประสิทธิภาพที่เป็นที่นิยม
(d) จำนวนคะแนนมีขนาดใหญ่ การเรียงลำดับอาจช่วยปรับปรุงเวลา ตัวอย่างเช่นเมื่อใช้อัลกอริทึมการกวาดจุดจากซ้ายไปขวาคุณจะต้องเรียงลำดับคะแนนในพิกัดแรกของพวกเขาเพื่อให้คุณสามารถกวาดล้างจุดต่าง ๆ ได้ในเวลาเดียวกับที่คุณกวาดข้ามขอบรูปหลายเหลี่ยม ฉันไม่ทราบว่าการเพิ่มประสิทธิภาพดังกล่าวได้รับการเผยแพร่แล้ว หนึ่งที่ได้รับการเผยแพร่แม้ว่าจะดำเนินการเป็นรูปสามเหลี่ยม จำกัดของการรวมกันของจุดและจุดยอดรูปหลายเหลี่ยม: เมื่อการคำนวณที่สมบูรณ์แล้วการระบุจุดภายในควรจะรวดเร็ว ค่าใช้จ่ายในการคำนวณจะขยายเป็น O (Q * บันทึก (Q) + (P + Q) * บันทึก (P + Q)
ข้อมูลรูปหลายเหลี่ยม Raster
มันง่ายอย่างเหลือเชื่อ: ดูเลเยอร์รูปหลายเหลี่ยมเป็นตัวบ่งชี้ไบนารีแรสเตอร์ (1 = ภายในรูปหลายเหลี่ยม, 0 = ภายนอก) (ซึ่งอาจต้องใช้ตารางการค้นหาเพื่อแปลงค่าแรสเตอร์เป็นตัวบ่งชี้ภายใน / ภายนอก) แต่ละโพรบจุดต้องใช้ความพยายาม O (1) ในการสร้างดัชนีเซลล์แรสเตอร์และอ่านค่าของมัน ความพยายามทั้งหมดคือ O (Q)
โดยทั่วไปแล้ว
โซลูชันไฮบริดที่ดีในกรณีของเวกเตอร์รูปหลายเหลี่ยมคงที่ (กรณีเวกเตอร์ 3 ด้านบน) เริ่มแรกเพื่อ rasterize รูปหลายเหลี่ยมบางทีแม้จะมีความละเอียดหยาบเวลานี้แยกความแตกต่างของเซลล์ใด ๆ ที่ตัดส่วนใดส่วนหนึ่งของเขตรูปหลายเหลี่ยม . การใช้โพรบแบบแรสเตอร์ (ราคา: O (1)) โดยทั่วไปแล้วจะทำให้ได้คำตอบที่ชัดเจน (เป็นที่รู้กันว่าจุดนั้นอยู่ด้านในหรือด้านนอก) แต่บางครั้งก็ส่งผลให้เกิดคำตอบแบบไม่ จำกัด (จุดตกอยู่ในเซลล์ ผ่าน) ซึ่งในกรณีนี้แบบสอบถามเวกเตอร์ O (log (P)) ราคาแพงกว่าจะถูกสร้างขึ้น วิธีนี้มีค่าใช้จ่ายในการจัดเก็บเพิ่มเติมสำหรับแรสเตอร์ แต่ในหลายกรณีแม้แต่แรสเตอร์ขนาดเล็ก (หนึ่ง MB จะอนุญาตให้ใช้กับแรสเตอร์ 2000 โดย 2000 ที่เก็บ {0,1,2, ค่า null}) สามารถมอบประโยชน์มหาศาลในเวลาคำนวณ . asymptotically,