อัลกอริทึมและโครงสร้างข้อมูลที่มีประสิทธิภาพที่สุดสำหรับการบำรุงรักษาข้อมูลส่วนประกอบที่เชื่อมต่อบนกราฟแบบไดนามิกคืออะไร


9

สมมติว่าฉันมีกราฟหร็อมแหร็มไม่ จำกัด ทิศทางและจำเป็นต้องสามารถเรียกใช้แบบสอบถามต่อไปนี้ได้อย่างมีประสิทธิภาพ:

  • IsConnected(N1,N2) - ส่งคืนหากมีเส้นทางระหว่างถึงมิฉะนั้นTN1N2F
  • ConnectedNodes(N) - ส่งคืนชุดของโหนดที่สามารถเข้าถึงได้จากN

สิ่งนี้ทำได้ง่ายโดยการคำนวณส่วนประกอบที่เชื่อมต่อของกราฟไว้ล่วงหน้า คำสั่งทั้งสองสามารถทำงานในเวลาO(1)

ถ้าฉันยังต้องสามารถเพิ่มขอบโดยพลการ - - จากนั้นฉันสามารถเก็บส่วนประกอบไว้ในโครงสร้างข้อมูลที่ไม่จัดวางได้ เมื่อใดก็ตามที่มีการเพิ่มขอบถ้ามันเชื่อมต่อสองโหนดในองค์ประกอบที่แตกต่างกันฉันจะรวมองค์ประกอบเหล่านั้น สิ่งนี้จะเพิ่มค่าใช้จ่ายให้กับและราคาเป็นและ (ซึ่งอาจเป็น )AddEdge(N1,N2)O(1)AddEdgeO(InverseAckermann(|Nodes|))ผมsโอnnอีเสื้ออีdโอnnอีเสื้ออีdยังไม่มีข้อความโอdอีsO(1)

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

  • ผมsโอnnอีเสื้ออีd(ยังไม่มีข้อความ1,ยังไม่มีข้อความ2) - ผลตอบแทนถ้ามีเส้นทางระหว่างและมิฉะนั้นFTยังไม่มีข้อความ1ยังไม่มีข้อความ2F
  • โอnnอีเสื้ออีdยังไม่มีข้อความโอdอีs(ยังไม่มีข้อความ) - ผลตอบแทนที่ชุดของโหนดที่สามารถเข้าถึงได้จากNยังไม่มีข้อความ
  • AddEdก.อี(ยังไม่มีข้อความ1,ยังไม่มีข้อความ2) - เพิ่มขอบระหว่างสองโหนด โปรดทราบว่า ,หรือทั้งคู่อาจไม่เคยมีมาก่อนยังไม่มีข้อความ1ยังไม่มีข้อความ2
  • Rอีม.โอโวลต์อีEdก.อี(ยังไม่มีข้อความ1,ยังไม่มีข้อความ2) - ลบขอบที่มีอยู่ระหว่างสองโหนด

(ฉันสนใจสิ่งนี้จากมุมมองของการพัฒนาเกม - ปัญหานี้ดูเหมือนว่าจะเกิดขึ้นในบางสถานการณ์บางทีผู้เล่นสามารถสร้างสายไฟฟ้าและเราจำเป็นต้องรู้ว่าเครื่องกำเนิดไฟฟ้าเชื่อมต่อกับอาคารหรือไม่ผู้เล่นสามารถล็อคได้ และปลดล็อคประตูและเราจำเป็นต้องรู้ว่าศัตรูสามารถเข้าถึงผู้เล่นได้หรือไม่ แต่มันเป็นปัญหาที่เกิดขึ้นโดยทั่วไป


โอnnอีเสื้ออีdยังไม่มีข้อความโอdอีsไม่สามารถเรียกใช้อาจเป็นเพราะถ้ามันส่งกลับรายการของโหนดก็จะต้องเวลา การใช้งานด้วย BFS นั้นดีที่สุดดังนั้นโครงสร้างข้อมูลที่มีศักยภาพจะต้องรองรับ IsConnected, AddEdge และ RemoveEdge เท่านั้น ดูเหมือนว่าจะเกี่ยวข้องกับคำถามของคุณ: stackoverflow.com/questions/7241151/…O(1)nΩ(n)โอnnอีเสื้ออีdยังไม่มีข้อความโอdอีs
Tom van der Zanden

@TomvanderZanden กลับชุดที่ถูกสร้างขึ้นแล้ว (ในการเขียนโปรแกรมเป็นตัวชี้หรือการอ้างอิง) เป็น ... ถึงแม้จะมีไม่มากที่ผู้ใช้ของสามารถทำเช่นนั้นและไม่ได้รับการคุ้มครองโดยisconnectedO(1)โอnnอีเสื้ออีdยังไม่มีข้อความโอdอีsO(1)ผมsโอnnอีเสื้ออีd
user253751

คำตอบ:


11

ปัญหานี้เรียกว่าการเชื่อมต่อแบบไดนามิกและเป็นพื้นที่ใช้งานของการวิจัยในชุมชนวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎี ยังมีปัญหาสำคัญที่ยังคงเปิดอยู่ที่นี่

เพื่อให้คำศัพท์ชัดเจนคุณขอการเชื่อมต่อแบบไดนามิกเต็มรูปแบบ เนื่องจากคุณต้องการเพิ่มและลบขอบ มีผลลัพธ์ของ Holm, de Lichtenberg และ Thorup (J.ACM 2001) ที่ได้รับเวลาอัปเดตและเวลาสอบถามจากความเข้าใจของฉันดูเหมือนว่าจะใช้งานได้ เพียงแค่พูดโครงสร้างข้อมูลยังคงรักษาลำดับชั้นของต้นไม้ทอดไว้และการเชื่อมต่อแบบไดนามิกในต้นไม้นั้นง่ายกว่า ฉันสามารถขอแนะนำเอริค D. Demaine ของบันทึกสำหรับคำอธิบายที่ดีดูที่นี่สำหรับวิดีโอ บันทึกของ Erik ยังมีตัวชี้ไปยังผลลัพธ์ที่เกี่ยวข้องอื่น ๆ ตามหมายเหตุ: ผลลัพธ์เหล่านี้ทั้งหมดเป็นผลลัพธ์ทางทฤษฎีO(เข้าสู่ระบบ2n)O(logn/loglogn)

โครงสร้างข้อมูลเหล่านี้อาจไม่มีการสืบค้นConnectedNodesต่อ se แต่สามารถทำได้โดยง่าย เพียงรักษาเป็นโครงสร้างข้อมูลเพิ่มเติมกราฟ (พูดเป็นรายการขอบเชื่อมต่อสองเท่า) และทำการค้นหาเชิงลึกครั้งแรกเพื่อรับโหนดที่สามารถเข้าถึงได้จากโหนดที่แน่นอน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.