หาก "เร็วที่สุด" รวมถึงจำนวนของเวลาที่ใช้วิธีการแก้ปัญหาจะขึ้นอยู่กับสิ่งที่ซอฟต์แวร์ที่คุณมีความสะดวกสบายและสามารถใช้อย่างรวดเร็ว ข้อสังเกตดังต่อไปนี้จึงมุ่งเน้นไปที่ความคิดเพื่อให้บรรลุความเป็นไปได้เร็วที่สุดในการคำนวณครั้ง
หากคุณใช้โปรแกรมกระป๋องแน่นอนว่าสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือการประมวลผลรูปหลายเหลี่ยมล่วงหน้าเพื่อตั้งค่าโครงสร้างข้อมูลแบบจุดในรูปหลายเหลี่ยมเช่นต้นไม้ KD หรือควอดทรีซึ่งโดยทั่วไปประสิทธิภาพการทำงานจะเป็น O (log (V ) * (N + V)) โดยที่ V คือจำนวนทั้งหมดของจุดยอดในรูปหลายเหลี่ยมและ N คือจำนวนคะแนนเนื่องจากโครงสร้างข้อมูลจะใช้เวลาอย่างน้อย O (log (V) * V) ความพยายามในการสร้างและจากนั้นจะ จะต้องมีการตรวจสอบสำหรับแต่ละจุดที่ราคาต่อจุด O (บันทึก (V))
คุณสามารถทำได้ดีขึ้นอย่างมีนัยสำคัญโดยการ gridding รูปหลายเหลี่ยมก่อนใช้ประโยชน์จากสมมติฐานที่ไม่ทับซ้อนกัน เซลล์กริดแต่ละเซลล์จะอยู่ในรูปหลายเหลี่ยมด้านใน (รวมถึงด้านในของ "รูปหลายเหลี่ยมสากล") ซึ่งในกรณีนี้จะติดฉลากเซลล์ด้วย id ของรูปหลายเหลี่ยมหรืออย่างอื่นก็มีขอบรูปหลายเหลี่ยมหนึ่งรูปหรือมากกว่า ราคาของการแรสเตอร์นี้เท่ากับจำนวนของกริดเซลล์ที่อ้างอิงในขณะที่ทำการแรสเตอร์ทั้งหมดขอบคือ O (V / c) โดยที่ c คือขนาดของเซลล์ แต่ค่าคงที่โดยนัยในสัญกรณ์โอใหญ่
(ความสวยงามอย่างหนึ่งของวิธีการนี้คือคุณสามารถใช้ประโยชน์จากกราฟิกรูทีนมาตรฐานได้ตัวอย่างเช่นหากคุณมีระบบที่ (a) จะวาดรูปหลายเหลี่ยมบนหน้าจอเสมือนโดยใช้ (b) สีที่แตกต่างสำหรับแต่ละรูปหลายเหลี่ยมและ (c) อนุญาต ให้คุณอ่านสีของพิกเซลที่คุณสนใจตามที่คุณต้องการ
ด้วยตารางนี้ในสถานที่คัดกรองจุดล่วงหน้าโดยการคำนวณเซลล์ที่มีการดำเนินการแต่ละจุด (การดำเนินการ O (1) ที่ต้องใช้นาฬิกาเพียงไม่กี่) นอกเสียจากว่าจะมีการจัดกลุ่มจุดล้อมรอบรูปหลายเหลี่ยมขอบเขตนี้โดยทั่วไปแล้วจะเหลือเฉพาะจุด O (c) ที่มีผลลัพธ์ที่ไม่ชัดเจน ต้นทุนรวมของการสร้างกริดและการคัดกรองล่วงหน้าจึงเป็น O (V / c + 1 / c ^ 2) + O (N) คุณต้องใช้วิธีอื่น (เช่นที่แนะนำมาจนถึงตอนนี้) เพื่อดำเนินการกับคะแนนที่เหลืออยู่ (นั่นคือวิธีที่อยู่ใกล้กับรูปหลายเหลี่ยม) ในราคา O (log (V) * N * c) .
เมื่อ c มีขนาดเล็กลงคะแนนที่น้อยลงและน้อยลงจะอยู่ในเซลล์กริดเดียวกันที่มีขอบและดังนั้นจึงน้อยลงและน้อยลงจะต้องใช้การประมวลผล O (บันทึก (V)) ต่อมา การทำเช่นนี้จำเป็นที่จะต้องเก็บเซลล์กริด O (1 / c ^ 2) และต้องใช้เวลา O (V / c + 1 / c ^ 2) เวลาในการแรสเตอร์รูปหลายเหลี่ยม ดังนั้นจะมีขนาดกริดที่เหมาะสมที่สุด ใช้มัน, ค่าใช้จ่ายในการคำนวณรวมเป็น O (เข้าสู่ระบบ (V) * N) แต่คงนัยโดยทั่วไปจะมีวิธีที่มีขนาดเล็กกว่าโดยใช้วิธีการบรรจุกระป๋องเนื่องจากความเร็ว O (N) ของการตรวจคัดกรองก่อน
20 ปีที่แล้วฉันทดสอบวิธีการนี้ (ใช้จุดเว้นระยะอย่างสม่ำเสมอทั่วทั้งอังกฤษและนอกชายฝั่งและใช้ตารางที่ค่อนข้างหยาบของเซลล์ประมาณ 400K ที่นำเสนอโดยบัฟเฟอร์วิดีโอในเวลานั้น) และได้รับคำสั่งสองขนาดของการเร่งความเร็วเมื่อเทียบกับอัลกอริทึมที่ดีที่สุด หา. แม้ว่ารูปหลายเหลี่ยมจะมีขนาดเล็กและเรียบง่าย (เช่นรูปสามเหลี่ยม) แต่คุณสามารถมั่นใจได้ถึงลำดับความสำคัญของการเร่งความเร็ว
จากประสบการณ์ของฉันการคำนวณเร็วมากจนการดำเนินการทั้งหมดถูก จำกัด ด้วยความเร็วข้อมูล I / O ไม่ใช่โดย CPU เมื่อคาดหวังว่า I / O อาจเป็นคอขวดคุณจะได้ผลลัพธ์ที่เร็วที่สุดโดยการเก็บคะแนนไว้ในรูปแบบที่บีบอัดให้ได้มากที่สุดเพื่อลดเวลาในการอ่านข้อมูล ให้คิดด้วยว่าควรเก็บผลลัพธ์อย่างไรเพื่อให้คุณสามารถ จำกัด การเขียนดิสก์ได้