แต่น่าเสียดายที่ผมยังไม่ได้ดังนั้นที่แข็งแกร่งในการทำความเข้าใจกวาดสายอัลกอริทึม เอกสารและตำราเรียนทั้งหมดในหัวข้อได้อ่านไปแล้วอย่างไรก็ตามความเข้าใจยังห่างไกล เพื่อให้ชัดเจนฉันพยายามที่จะแก้ปัญหาการออกกำลังกายให้มากที่สุดเท่าที่จะทำได้ แต่งานที่สำคัญและน่าสนใจจริงๆยังคงเป็นสิ่งที่ท้าทายสำหรับฉัน
แบบฝึกหัดต่อไปนี้ที่ฉันพบในบันทึกการบรรยายของการแยกส่วนบรรทัดโดยเจฟฟ์เอริกผู้มีอำนาจทุกอย่าง
การออกกำลังกาย 2.อธิบายและวิเคราะห์อัลกอริทึม sweepline การกำหนดให้วงกลมในระนาบไม่ว่าจะเป็นที่สองตัดในO ( n log n )เวลา แต่ละวงกลมเอ็ดระบุไว้โดยศูนย์และรัศมีของมันเพื่อให้การป้อนข้อมูลที่ประกอบด้วยสามอาร์เรย์X [ 1 .. n ] , Y [ 1 .. n ]และR [ 1 .. n ] ใช้ความระมัดระวังอย่างถูกต้องใช้ดั้งเดิมในระดับต่ำ
ลองทำสิ่งที่ซับซ้อนให้ง่ายขึ้น เรารู้อะไรเกี่ยวกับจุดตัดของวงกลม อะนาล็อกที่สามารถพบได้ด้วยการตัดกันของเส้น เส้นสองเส้นอาจตัดกันหากพวกมันอยู่ติดกันซึ่งสองวงควรมีคุณสมบัติใดเพื่อตัดกัน ให้เป็นระยะทางระหว่างศูนย์กลางของวงกลมr 0และr 1ศูนย์กลางของวงกลม พิจารณาบางกรณี:
กรณีที่ 1: ถ้าว่าไม่มีวิธีแก้ปัญหาวงกลมจะแยกกัน
กรณีที่ 2: ถ้าดังนั้นจึงไม่มีวิธีแก้ปัญหาเนื่องจากมีวงกลมหนึ่งวงอยู่ในอีกวงหนึ่ง
กรณีที่ 3: ถ้าและr 0 = r 1ดังนั้นวงกลมจะเกิดขึ้นพร้อมกันและมีวิธีแก้ปัญหาจำนวนไม่ จำกัด
ดังนั้นดูเหมือนว่าเงื่อนไขการแยกพร้อมแน่นอนว่าอาจเป็นเงื่อนไขที่ผิด โปรดแก้ไขหากเป็นเช่นนั้น
ขั้นตอนวิธี ทีนี้เราต้องหาอะไรที่เหมือนกันระหว่างวงกลมสองวงที่ตัดกัน ด้วยการแยกแบบอะนาล็อกถึงเส้นเราจำเป็นต้องมีเงื่อนไขการแทรกและลบเงื่อนไขในคิวเหตุการณ์ สมมติว่าจุดเหตุการณ์เป็นพิกัด x ของจุดแรกและจุดสุดท้ายที่เส้นกวาดแนวตั้งแตะ บนจุดแรกที่เราแทรกวงกลมสถานะ และการตรวจสอบจุดตัด (3 กรณีสำหรับการตรวจสอบที่กล่าวถึงข้างต้น) กับแวดวงที่ใกล้ที่สุดในประเด็นสุดท้ายที่เราวงกลมลบจากสถานะ
ดูเหมือนว่าเพียงพอสำหรับอัลกอริธึมการกวาดบรรทัด หากมีสิ่งผิดปกติหรืออาจมีบางสิ่งที่ควรทำแตกต่างกันอย่าลังเลที่จะแบ่งปันความคิดของคุณกับเรา
ภาคผนวก :
ฉันแทรกวงกลมเมื่อเส้นกวาดแนวตั้งแตะเป็นวงกลมเป็นครั้งแรกและลบวงกลมออกจากสถานะเมื่อเส้นกวาดแตะเป็นครั้งสุดท้าย ควรตรวจสอบทางแยกสำหรับวงก่อนหน้าที่ใกล้ที่สุด หากเราเพิ่มแวดวงลงในสถานะและมีแวดวงอื่นที่เราเพิ่มไปก่อนหน้านี้แล้วและยังคงอยู่ที่นั่นดังนั้นวงกลมที่ซบเซาจึงไม่ "ปิด" ดังนั้นอาจมีทางแยก
status
รักษาวงกลมที่ตัดกับเส้นกวาดอยู่หรือไม่? สมมติว่าคุณมี 100 แวดวงในขณะนี้status
และคุณประมวลผลเหตุการณ์การแทรกและแทรกวงกลมที่ 101 คุณเปรียบเทียบกับแวดวงจำนวนเท่าใดเพื่อตรวจหาจุดตัด คุณเลือกแวดวงที่จะเปรียบเทียบอย่างไร