บทความที่อ้างอิงมีน้ำใจ แต่ผมเชื่อว่ามีคือ "ความง่ายและสง่างาม" การแก้ปัญหา: สำหรับชุดข้อมูลทางภูมิศาสตร์ที่มีสองชนิดกล่อง bounding ผู้ที่ไม่ได้นั่งบน + -180 เที่ยงจะสามารถเก็บและค้นหาได้เช่นเคย ผู้ที่กำลังปั่นป่วน + -180 meridian สามารถเก็บไว้ในรูปแบบกึ่งเสริม : กล่าวคือเก็บช่วงของละติจูดตามปกติ แต่แทนที่จะเก็บช่วงของลองจิจูดที่ไม่รวมอยู่ในกล่อง (และสลับบิตเพื่อระบุว่ารูปแบบใด กำลังใช้พื้นที่เก็บข้อมูล) โดยพื้นฐานแล้วไม่จำเป็นต้องทำการดัดแปลงใด ๆ กับดัชนีทางภูมิศาสตร์หรือโครงสร้างแผนผังการค้นหา อัลกอริธึมการค้นหาเพียงเล็กน้อยเท่านั้น
ไม่ว่าจะด้วยวิธีใดก็ตามนี่เป็นคำตอบสำหรับคำถาม
ฉันคิดว่าคุณคาดหวังว่าการป้อนข้อมูลเป็นลำดับของตัวอธิบายกล่องขอบ ((LLx, LLy), (URx, URy)) โดยที่:
-540 <= LLx, -180 <= URx, LLx <= 180 และ URx <= 180 นอกจากนี้ -90 <= LLy <= URy <= 90
จุดที่ (ลองจิจูด, ละติจูด) = (x, y) ถูกพิจารณาว่าอยู่ใน BB ถ้าหาก
LLy <= y <= URy และ
อาจเป็น LLx <= x <= URx หรือ LLx - 360 <= x <= URx
สำหรับเอาต์พุตคุณต้องการพารามิเตอร์สำหรับกล่อง bounding ที่เล็กที่สุดที่มีการรวมกันของอินพุตทั้งหมด
เห็นได้ชัดว่าค่า จำกัด y ของกล่องขอบเขตต่ำสุด (MBR) จะเป็นค่าต่ำสุดและสูงสุดของค่า y สำหรับ x วงเงินใช้กวาดเส้นเพื่อหาช่องว่างที่ใหญ่ที่สุด
นี่คือคำอธิบายของอัลกอริทึม เพื่อแสดงให้เห็นว่าสมมติว่าการป้อนข้อมูลประกอบด้วยสี่กล่อง
((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))
นี่คือแผนภาพของกล่อง (สีแดง) และ MBRs (เป็นสีดำ) ของกล่องแรกจากนั้นสองกล่องแรกจากนั้นกล่องแรกจะเป็นกล่องสามกล่อง
โปรดสังเกตว่าในขั้นตอนที่สองกล่องในซีกโลกตะวันออกและตะวันตกนั้นล้อมรอบด้วย MBR ซึ่งข้ามเส้นแวง + -180 องศาทำให้มันปรากฏเป็นกล่องสองแยกบนแผนที่นี้ ในขั้นตอนสุดท้าย MBR นั้นจะต้องถูกขยายไปทางตะวันออกเพื่อรองรับกล่องเล็ก ๆ ระหว่างอเมริกาใต้และแอนตาร์กติกา
แยกพิกัด x ทั้งหมดของกล่องคำนวณหาโมดูโล 360 (เพื่อวางไว้ในช่วง -180..180) เรียงลำดับจากน้อยไปหามากและผนวกค่าแรก (เพิ่มขึ้น 360 องศา) ต่อท้ายเพื่อทำให้ห่อ รอบ:
-149, -90, -81, -77, -69, -36, 77, 156, 211
(โปรดสังเกตว่า 211 และ -149 เป็นเมริเดียนเดียวกัน)
คิดว่าแต่ละพิกัด x เป็นตัวแทนช่วงเวลาระหว่างพิกัดก่อนหน้า (แต่ไม่รวมถึงค่าก่อนหน้า) และมัน เช่น -77 หมายถึงค่าทั้งหมดตั้งแต่ -81 ถึง -77 แต่ไม่รวมถึง -81 สำหรับแต่ละกล่องหลังจากแรกให้นับจำนวนกล่องที่มีช่วงเวลานั้น
1, 0, 1, 0, 1, 0, 1, 0
ตัวอย่างเช่น "1" แรกหมายความว่าหนึ่งกล่องครอบคลุมช่วงตั้งแต่ -149 ถึง -90 (นี่คือกล่องที่สาม)
เป็นการเพิ่มประสิทธิภาพคุณสามารถหยุดการนับทันทีที่พบกล่องใด ๆ ที่ครอบคลุมช่วง x และเลื่อนไปยังช่วง x ถัดไป เราพยายามกำหนดช่วงเวลาที่อาจไม่ครอบคลุมโดยกล่องใด ๆ
คำนวณความแตกต่างแรกของพิกัด x ที่เรียงใน (1)
59, 9, 4, 8, 33, 113, 79, 55
จับคู่เหล่านี้กับความครอบคลุมใน (2) ค้นหาความแตกต่างที่ใหญ่ที่สุดที่จำนวนการครอบคลุมคือ 0 ตรงนี้มันเท่ากับ113
องค์ประกอบที่หกของอาเรย์ก่อนหน้า นี่คือช่องว่างที่ยิ่งใหญ่ที่สุดในลองจิจูดที่เหลือจากชุดของกล่อง
(น่าสนใจความเป็นไปได้สูงสุดที่เกิดขึ้นมากกว่าหนึ่งตำแหน่งแสดงให้เห็นว่าการแก้ปัญหาไม่จำเป็นต้องไม่ซ้ำกัน! อาจมีมากกว่าหนึ่ง MBR สำหรับชุดของกล่องคุณสามารถกำหนดหนึ่งที่ไม่ซ้ำกันโดยการเพิ่มเงื่อนไขเพิ่มเติมเช่นต้องการ ระยะทางเฉลี่ยใน MBR ถึง + -180 เมอริเดียนนั้นใหญ่ที่สุดเท่าที่จะทำได้เพื่อแก้ปัญหาให้เลือก (พูด) ทางออกตะวันออกสุด
ค้นหาช่วงเวลาที่เกี่ยวข้อง: ที่นี่มาจาก -36 ถึง 77 นี่คือช่วงของลองจิจูดที่ไม่ได้อยู่ใน MBR ดังนั้นเติมเต็มในช่วงจาก -180 ถึง 180 ที่นี่ส่วนเติมเต็มคือช่วงเวลาแยกสองช่วงหนึ่งช่วงจาก -180 ถึง -36 และอีกช่วงจาก 77 ถึง 180 อีกวิธีหนึ่งแทนส่วนประกอบที่เป็นสี่เหลี่ยมเดียวอาจคร่อมเครื่องหมาย + -180 องศาเมริเดียน: จาก -283 ถึง -36 ที่นี่ (หรือเทียบเท่าจาก 77 ถึง 324)
ใช้ min และ max ของค่า y สำหรับมุมของ MBR
((-283, -85), (-36, 81))