การปรับเปลี่ยนอัลกอริธึมของ Dijkstra สำหรับน้ำหนักขอบที่ดึงจากช่วง


10

สมมติว่าฉันมีกราฟกำกับที่มีน้ำหนักขอบถูกดึงมาจากช่วง[1,,K]โดยที่Kคงที่ หากฉันพยายามค้นหาเส้นทางที่สั้นที่สุดโดยใช้อัลกอริทึมของ Dijkstraฉันจะแก้ไขอัลกอริทึม / โครงสร้างข้อมูลและปรับปรุงความซับซ้อนของเวลาเป็นO(|V|+|E|)อย่างไร


คุณควรเจาะจงมากกว่านี้โครงสร้างข้อมูลของคุณคืออะไร? และคุณไม่สามารถได้รับน้อยO(V+E) ) ทบทวนการบรรยาย
jonaprieto

เพียงเพราะความเป็นไปได้สำหรับน้ำหนักขอบที่แตกต่างนั้นเล็กไม่ได้หมายความว่าจำนวนของระยะทางนั้นเล็ก
Joe

3
จุดแรกของกราฟสีของคุณด้วยสีน้ำเงินแล้วแบ่งแต่ละขอบของขนาดtเป็นขอบt (โดยการเพิ่มจุดยอดที่ไม่มีสีt1 ) จากนั้นเรียกใช้ BFS บนกราฟใหม่นี้เพื่อหาเส้นทางที่สั้นที่สุดจากโหนดเริ่มต้นไปยังโหนดสีน้ำเงินO(|V|+|E|)ถ้าคุณมีค่าคงที่kk

@ SaeedAmiri ทำไมไม่ลองเขียนคำตอบนี้ดูล่ะ?
Joe

@ Joe เพราะไม่ได้แก้ไข dijkstra (อย่างน้อยก็โดยตรงไม่เกี่ยวข้องกับ dijkstra)

คำตอบ:


16

{0,1,,K}O(K|V|+|E|)

{D,D+1,,D+K}DDD+Kd[u]+wt(u,w)(u,w)d[u]ud[u]D

A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D

  • ลบนาที : ในขณะที่ว่างเพิ่มขึ้นDแล้วลบและกลับจุดสุดยอดจาก(D)]A[h(D)]DA[h(D)]

  • แทรกด้วยกุญแจ : เพิ่มจุดสุดยอดถังของ(k)]kA[h(k)]

  • ลดคีย์ เพื่อ : ย้ายจุดสุดยอดจากเพื่อ(k)]kkA[h(k)]A[h(k)]

แทรกและการลดลงที่สำคัญมีการดำเนินงานอย่างต่อเนื่องเวลาดังนั้นเวลาทั้งหมดที่ใช้ในการดำเนินงานเหล่านั้นจะ|) รวมเวลาที่ใช้ในการลบนาทีจะเป็นบวกค่าสุดท้ายของDค่าสุดท้ายของคือระยะทางสูงสุด (จำกัด ) จากแหล่งที่มาถึงจุดสุดยอดใด ๆ (เพราะลบนาทีที่ใช้เวลาทำซ้ำเพิ่มโดย ) ระยะทางสูงสุดคือมากที่สุดเนื่องจากแต่ละเส้นทางจะมีขอบมากที่สุดดังนั้นเวลาทั้งหมดที่ใช้โดยอัลกอริทึมคือ|)O(|V|+|E|)O(|V|)DDiDiK(|V|1)|V|1O(K|V|+|E|)


ฉันชอบคิวแบบวงกลมนั่นเป็นวิธีที่ดีกว่าความคิดของฉันในการมีอาร์เรย์ขนาด K * v โดยใช้ชิ้นขนาด av เท่านั้นในเวลาใดก็ตาม
rrenaud

ฉันใช้มันโดยใช้ลิสต์ที่เชื่อมโยงสองครั้งนั่นหมายความว่ายังคงเป็น O (1) สำหรับการค้นหาคีย์ min หรือไม่?
user1675999

@ user1675999 ฉันไม่แน่ใจ ถ้ารายการของคุณเรียงลำดับตามคีย์คุณจะแทรกและย่อ - คีย์ได้อย่างมีประสิทธิภาพได้อย่างไร หากรายการของคุณไม่ได้เรียงลำดับตามคีย์คุณจะลบ -min ได้อย่างมีประสิทธิภาพได้อย่างไร
Neal Young

5

ฉันสมมุติว่าเป็นจำนวนเต็มและน้ำหนักขอบเป็นส่วนสำคัญ ไม่เช่นนั้นจะไม่ซื้ออะไรให้คุณเลยคุณสามารถลดน้ำหนักได้เสมอเพื่อให้ค่า min edge มีราคาและค่าสูงสุดมีค่าดังนั้นปัญหาจึงเหมือนกับปัญหาเส้นทางที่สั้นที่สุดมาตรฐานK1K

อัลกอริธึม / การร่างภาพร่าง: ใช้คิวลำดับความสำคัญในลักษณะบ้าแบบนี้เป็นอาร์เรย์ของรายการที่คีย์ค่าใช้จ่ายและใช้อัลกอริทึมของ Dijkstra มาตรฐาน เก็บตัวนับที่ติดตามต้นทุนของรายการขั้นต่ำในฮีป แก้ไขโทร dequeue หลังจากที่รายการจะถูกลบออกจากการสแกนเชิงเส้น ใช่เสียงแบบนี้บ้า แต่คงที่ให้คุณโกงและหลอกสัญชาตญาณอัลกอริทึมของคุณจากการสแกนเชิงเส้น คุณต้องสแกนจากเครื่องหมายนาทีสุดท้ายเนื่องจากอัลกอริทึมของ Disjkstra นั้นดีต่อการใช้คิวของคุณ ตามเวลาที่ร้องขอ dequeue รายการที่แทรกลงในคิวมักจะมากกว่าหรือเท่ากับขั้นต่ำก่อนหน้านี้ เส้นทางที่สั้นที่สุดที่ยาวที่สุดที่เป็นไปได้มีความยาวK×|V|KK×|V|ดังนั้นค่าสแกนที่ถูกตัดจำหน่ายของคุณคือถ้า K คงที่K×|V|=O(|V|)


-2

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


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