สมมติว่าฉันมีกราฟกำกับที่มีน้ำหนักขอบถูกดึงมาจากช่วงโดยที่คงที่ หากฉันพยายามค้นหาเส้นทางที่สั้นที่สุดโดยใช้อัลกอริทึมของ Dijkstraฉันจะแก้ไขอัลกอริทึม / โครงสร้างข้อมูลและปรับปรุงความซับซ้อนของเวลาเป็นอย่างไร
สมมติว่าฉันมีกราฟกำกับที่มีน้ำหนักขอบถูกดึงมาจากช่วงโดยที่คงที่ หากฉันพยายามค้นหาเส้นทางที่สั้นที่สุดโดยใช้อัลกอริทึมของ Dijkstraฉันจะแก้ไขอัลกอริทึม / โครงสร้างข้อมูลและปรับปรุงความซับซ้อนของเวลาเป็นอย่างไร
คำตอบ:
ลบนาที : ในขณะที่ว่างเพิ่มขึ้นDแล้วลบและกลับจุดสุดยอดจาก(D)]
แทรกด้วยกุญแจ : เพิ่มจุดสุดยอดถังของ(k)]
ลดคีย์ เพื่อ : ย้ายจุดสุดยอดจากเพื่อ(k)]
แทรกและการลดลงที่สำคัญมีการดำเนินงานอย่างต่อเนื่องเวลาดังนั้นเวลาทั้งหมดที่ใช้ในการดำเนินงานเหล่านั้นจะ|) รวมเวลาที่ใช้ในการลบนาทีจะเป็นบวกค่าสุดท้ายของDค่าสุดท้ายของคือระยะทางสูงสุด (จำกัด ) จากแหล่งที่มาถึงจุดสุดยอดใด ๆ (เพราะลบนาทีที่ใช้เวลาทำซ้ำเพิ่มโดย ) ระยะทางสูงสุดคือมากที่สุดเนื่องจากแต่ละเส้นทางจะมีขอบมากที่สุดดังนั้นเวลาทั้งหมดที่ใช้โดยอัลกอริทึมคือ|)
ฉันสมมุติว่าเป็นจำนวนเต็มและน้ำหนักขอบเป็นส่วนสำคัญ ไม่เช่นนั้นจะไม่ซื้ออะไรให้คุณเลยคุณสามารถลดน้ำหนักได้เสมอเพื่อให้ค่า min edge มีราคาและค่าสูงสุดมีค่าดังนั้นปัญหาจึงเหมือนกับปัญหาเส้นทางที่สั้นที่สุดมาตรฐาน
อัลกอริธึม / การร่างภาพร่าง: ใช้คิวลำดับความสำคัญในลักษณะบ้าแบบนี้เป็นอาร์เรย์ของรายการที่คีย์ค่าใช้จ่ายและใช้อัลกอริทึมของ Dijkstra มาตรฐาน เก็บตัวนับที่ติดตามต้นทุนของรายการขั้นต่ำในฮีป แก้ไขโทร dequeue หลังจากที่รายการจะถูกลบออกจากการสแกนเชิงเส้น ใช่เสียงแบบนี้บ้า แต่คงที่ให้คุณโกงและหลอกสัญชาตญาณอัลกอริทึมของคุณจากการสแกนเชิงเส้น คุณต้องสแกนจากเครื่องหมายนาทีสุดท้ายเนื่องจากอัลกอริทึมของ Disjkstra นั้นดีต่อการใช้คิวของคุณ ตามเวลาที่ร้องขอ dequeue รายการที่แทรกลงในคิวมักจะมากกว่าหรือเท่ากับขั้นต่ำก่อนหน้านี้ เส้นทางที่สั้นที่สุดที่ยาวที่สุดที่เป็นไปได้มีความยาวดังนั้นค่าสแกนที่ถูกตัดจำหน่ายของคุณคือถ้า K คงที่
คุณสามารถใช้การจัดเรียงทอพอโลยีเพื่อค้นหาวิธีแก้ปัญหาปล่อยให้แหล่งที่มามีระดับ 0 จากนั้นไปจากแต่ละแหล่งจากขอบถ้าแหล่งข้อมูลอื่นมี 0 องศาจากนั้นวางลงในคิวและทำเช่นนั้น ในกรณีนี้ (ไม่มีวงรอบในกราฟ) สามารถบรรลุ V + E ได้เหมือนที่ผ่านทุกจุดยอดและขอบหนึ่งครั้ง