ครอบคลุมสี่เหลี่ยมผืนผ้าโดยสายการกวาด


9

ฉันได้รับแบบฝึกหัดโชคไม่ดีที่ฉันไม่ประสบความสำเร็จ

มีชุดของรูปสี่เหลี่ยมเป็นและสี่เหลี่ยมผืนผ้า{0} การใช้อัลกอริธึมการกวาดล้างบนเครื่องบินกำหนดว่าครอบคลุมโดยชุดหรือไม่R1..RnR0R0R1..Rn

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหลักการของอัลกอริทึมบรรทัดกวาดดูที่นี่

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

  • ชุดของคะแนนเหตุการณ์ (จัดเก็บจุดสิ้นสุดของส่วนและจุดแยก)Q
  • สถานะ (โครงสร้างแบบไดนามิกสำหรับชุดเซกเมนต์ของเส้นการกวาดที่ตัดกัน)T

แนวคิดทั่วไป:สมมติว่าบรรทัดการกวาดเป็นเส้นแนวตั้งที่เริ่มเข้าใกล้ชุดของสี่เหลี่ยมจากด้านซ้าย ทั้งหมดเรียงพิกัดของรูปสี่เหลี่ยมและเก็บไว้ในในการเพิ่มการสั่งซื้อ - ควรใช้เวลาn) เริ่มต้นจากจุดเหตุการณ์แรกสำหรับทุก ๆ จุดกำหนดชุดของรูปสี่เหลี่ยมที่ตัดกันที่พิกัดกำหนดระบุส่วนต่อเนื่องของรูปสี่เหลี่ยมผืนผ้าแยกและตรวจสอบว่าพวกเขาครอบคลุมที่พิกัดปัจจุบันทั้งหมดหรือไม่ ด้วยเป็นต้นไม้ไบนารีมันจะใช้เวลาn) หากส่วนใดส่วนหนึ่งของยังคงเปิดอยู่lxQO(nlogn)xR0xTO(logn)R0R0ไม่ได้ครอบคลุมอย่างสมบูรณ์

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

ปัญหาคือวิธีการสร้างและดูแลรักษาและความซับซ้อนของการสร้างและดูแลรักษาคืออะไร ฉันคิดว่าต้นไม้ Rมีประโยชน์อย่างมากในกรณีนี้ แต่เนื่องจากฉันพบว่ามันยากมากที่จะกำหนดสี่เหลี่ยมผืนผ้าขอบเขตขั้นต่ำโดยใช้ต้นไม้ RTT

คุณมีความคิดเกี่ยวกับวิธีการแก้ปัญหานี้และโดยเฉพาะอย่างยิ่งวิธีการสร้างหรือไม่?T


1
สี่เหลี่ยมเหล่านี้อยู่ในแนวแกนหรือไม่? (คุณสามารถทำได้ทั้งสองวิธี แต่จะง่ายกว่าถ้าเป็น)
Louis

@Louis, ลองลดความซับซ้อนลงหน่อยลองสมมติว่ามีรูปสี่เหลี่ยมชิดแกน แต่แน่นอนว่ากรณีทั่วไปน่าสนใจกว่านี้
com

จุดใดของสี่เหลี่ยมคือคะแนนเหตุการณ์ มุมทั้งหมดมุมบนซ้าย ...
กราฟิลส์

@ ราฟาเอลเพียง x เท่านั้นที่เป็นคะแนนเหตุการณ์
com

คำตอบ:


6

มาเริ่มด้วยสี่เหลี่ยมที่เรียงกันตามแนวแกนเนื่องจากมีอาร์กิวเมนต์โดยตรงที่ง่าย เราจะกวาดเส้นแนวตั้ง เหตุการณ์เป็นจุดสิ้นสุดของขอบแนวนอนของรูปสี่เหลี่ยมผืนผ้า ขณะที่เรากวาดเราจะเก็บช่วงเวลาหนึ่งไว้บนบรรทัดการกวาดที่ "เปิด" โดย , :nRii1

  • เพิ่มช่วงเวลาแนวตั้งที่ครอบคลุมโดยสี่เหลี่ยมผืนผ้าไปยังบรรทัดการกวาดเมื่อเราพบเป็นครั้งแรกRiRi
  • ลบช่วงเวลาแนวตั้งที่ครอบคลุมโดยสี่เหลี่ยมผืนผ้าจากเส้นกวาดเมื่อมันเคลื่อนที่ผ่านRiRi

มันง่ายที่จะทำเช่นนี้กับต้นไม้ไบนารีเพื่อการปรับปรุงที่ใช้เวลา (ปัญหาคือโดยหลักแล้วคือ 1 มิติคุณคิดออกว่าจุดสิ้นสุดอยู่ในช่วงเวลาที่ไม่ได้เปิดและขยาย / ผสานอย่างเหมาะสมเมื่อทำการเพิ่มและทำให้ยาวขึ้นเมื่อลบออก)O(logn)

แล้วคุณก็ตรวจสอบว่าในช่วงของไม่มีช่วงเวลาที่เปิดที่เคยตัดช่วงแนวตั้งของR_0สิ่งที่ทั้งเป็นเวลาพื้นที่R0R0O(nlogn)O(n)

สำหรับกรณีทั่วไปเคล็ดลับที่เห็นได้ชัดไม่เร็วนัก ใช้อัลกอริธึมบรรทัดการกวาดแบบมาตรฐานเพื่อคำนวณส่วนย่อยระนาบทั้งหมดที่เกิดจากสี่เหลี่ยม

เห็นได้ชัดว่าบางดิสก์เหมือนชุดของใบหน้าครอบคลุมR_0ด้วยตัวเองสิ่งนี้ไม่ได้บอกเรามากพอเนื่องจากสิ่งที่เราสนใจคือใบหน้าใด ๆ เหล่านี้อยู่ในและนอกสี่เหลี่ยมอื่น ๆ ในการทำเช่นนี้เราปรับเปลี่ยนโครงสร้างเล็กน้อยเพื่อให้เมื่อเราเพิ่มขอบเราจะติดแท็กด้านหนึ่งด้วยข้อมูลประจำตัวของสี่เหลี่ยมผืนผ้าที่อยู่ภายใน นี้จะเพิ่มค่าใช้จ่ายเพื่อให้การก่อสร้างเป็นเวลา; โดยไม่มีข้อสันนิษฐานเกี่ยวกับสี่เหลี่ยมเอาต์พุตอาจมีขนาดดังนั้นเราจึงใช้พื้นที่จำนวนมากในกรณีที่เลวร้ายที่สุดดังนั้นเวลาจึงเป็นFR0R0O(1)O(n2logn)Ω(n2)

สุดท้ายถูกปกคลุมไปตราบใดที่ไม่มีใบหน้าในได้เพียงขอบได้ติดแท็กในฐานะที่เป็นหนึ่งในR_iประเด็นก็คือว่าถ้าขอบของอยู่ในดังนั้นทั้งหมดของก็เช่นกัน ลองจินตนาการว่าการลากเส้นเหนือมุมฉากไปตามขอบนี้: มันสามารถทิ้งไว้ภายนอกหรือล้อมรอบด้วยขอบของมากกว่าหนึ่งเส้นR0FRifRiffRiffRi

ดังนั้นข้อสรุปคือกรณีพิเศษคือและกรณีทั่วไปคืออย่างน้อยที่สุด แต่ฉันสงสัยว่ามันจะดีขึ้นO(nlogn)O(n2logn)


ขอบคุณมากสำหรับคำตอบของคุณ มีบางสิ่งที่ฉันต้องการให้ชัดเจนเกี่ยวกับกรณีทั่วไป - จุดเหตุการณ์คือพิกัดถูกกำหนดล่วงหน้า, สถานะ - ช่วงเวลาที่ "เปิด" เนื่องจากฉันเข้าใจว่ามันเป็นช่วงเวลาที่สอดคล้องกับของหนึ่งในของ s ซึ่งถูกค้นพบโดย . ส่วนที่มีฉันไม่เข้าใจ ฉันคิดว่าในการวนซ้ำทุกครั้ง (เพิ่ม) เราควรตรวจสอบว่าช่วงเวลาตัดกันใช่ไหม QxTxiRRi,i1R0R0
com

สำหรับกรณีทั่วไปโดยทั่วไปฉันสมมติว่าคุณรู้วิธีสร้างแผนที่ระนาบทั้งหมดที่เกิดจากรูปสี่เหลี่ยมผืนผ้าแล้วฉันก็เถียงว่าหน้านี้มีทั้งหมดในถ้าขอบด้านหนึ่งอยู่ใน "ภายใน" ของR_iคุณสามารถติดตามสิ่งนี้ได้ในอัลกอริทึมการกวาดปกติ (เช่นจากหนังสือ "Marks") เพียงแค่บันทึกทิศทาง "ข้างใน" และ "นอก" ของกลุ่มเมื่อมีการเพิ่มลงในบรรทัดการกวาด RiRi
Louis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.