DAA - เส้นทางที่สั้นที่สุด
อัลกอริทึมของ Dijkstra
อัลกอริทึมของ Dijkstra แก้ปัญหาเส้นทางที่สั้นที่สุดของแหล่งเดียวบนกราฟถ่วงน้ำหนักกำกับG = (V, E)โดยที่ขอบทั้งหมดไม่เป็นลบ (เช่นw (u, v) ≥ 0 สำหรับแต่ละขอบ(u, v ) Є E )
ในอัลกอริทึมต่อไปนี้เราจะใช้ฟังก์ชันเดียว Extract-Min()ซึ่งแยกโหนดด้วยคีย์ที่เล็กที่สุด
Algorithm: Dijkstra’s-Algorithm (G, w, s)
for each vertex v Є G.V
v.d := ∞
v.∏ := NIL
s.d := 0
S := Ф
Q := G.V
while Q ≠ Ф
u := Extract-Min (Q)
S := S U {u}
for each vertex v Є G.adj[u]
if v.d > u.d + w(u, v)
v.d := u.d + w(u, v)
v.∏ := u
การวิเคราะห์
ความซับซ้อนของอัลกอริทึมนี้ขึ้นอยู่กับการใช้ฟังก์ชัน Extract-Min หากใช้ฟังก์ชัน extract min โดยใช้การค้นหาเชิงเส้นความซับซ้อนของอัลกอริทึมนี้คือO(V2 + E).
ในอัลกอริทึมนี้ถ้าเราใช้ min-heap ซึ่ง Extract-Min() ฟังก์ชันทำงานเพื่อส่งคืนโหนดจาก Q ด้วยคีย์ที่เล็กที่สุดความซับซ้อนของอัลกอริทึมนี้สามารถลดลงได้อีก
ตัวอย่าง
ให้เราพิจารณาจุดยอด 1 และ 9เป็นจุดยอดเริ่มต้นและปลายทางตามลำดับ ในขั้นต้นจุดยอดทั้งหมดยกเว้นจุดยอดเริ่มต้นจะถูกทำเครื่องหมายด้วย∞และจุดยอดเริ่มต้นจะถูกทำเครื่องหมายด้วย0.
จุดยอด | เริ่มต้น | ขั้นตอนที่ 1 V 1 | ขั้นตอนที่ 2 V 3 | ขั้นตอนที่ 3 V 2 | ขั้นตอนที่ 4 V 4 | ขั้นตอนที่5 V 5 | ขั้นตอนที่6 V 7 | ขั้นตอนที่7 V 8 | ขั้นตอนที่ 8 V 6 |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | ∞ | 5 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
3 | ∞ | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
4 | ∞ | ∞ | ∞ | 7 | 7 | 7 | 7 | 7 | 7 |
5 | ∞ | ∞ | ∞ | 11 | 9 | 9 | 9 | 9 | 9 |
6 | ∞ | ∞ | ∞ | ∞ | ∞ | 17 | 17 | 16 | 16 |
7 | ∞ | ∞ | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
8 | ∞ | ∞ | ∞ | ∞ | ∞ | 16 | 13 | 13 | 13 |
9 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | 20 |
ดังนั้นระยะทางต่ำสุดของจุดยอด 9 จากจุดยอด 1 คือ 20. และเส้นทางคือ
1 → 3 → 7 → 8 → 6 → 9
เส้นทางนี้ถูกกำหนดโดยอิงจากข้อมูลรุ่นก่อน
อัลกอริทึม Bellman Ford
อัลกอริทึมนี้แก้ปัญหาเส้นทางที่สั้นที่สุดของแหล่งเดียวของกราฟกำกับ G = (V, E)ซึ่งน้ำหนักขอบอาจเป็นลบ ยิ่งไปกว่านั้นอัลกอริทึมนี้สามารถใช้เพื่อค้นหาเส้นทางที่สั้นที่สุดได้หากไม่มีวงจรถ่วงน้ำหนักเชิงลบใด ๆ
Algorithm: Bellman-Ford-Algorithm (G, w, s)
for each vertex v Є G.V
v.d := ∞
v.∏ := NIL
s.d := 0
for i = 1 to |G.V| - 1
for each edge (u, v) Є G.E
if v.d > u.d + w(u, v)
v.d := u.d +w(u, v)
v.∏ := u
for each edge (u, v) Є G.E
if v.d > u.d + w(u, v)
return FALSE
return TRUE
การวิเคราะห์
ครั้งแรก for loop ใช้สำหรับการเริ่มต้นซึ่งทำงานใน O(V)ครั้ง. ต่อไปfor วนรอบ |V - 1| ผ่านขอบซึ่งใช้เวลาO(E) ครั้ง.
ดังนั้นอัลกอริทึม Bellman-Ford จึงทำงาน O(V, E) เวลา.
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการทำงานของอัลกอริทึม Bellman-Ford ทีละขั้นตอน กราฟนี้มีขอบลบ แต่ไม่มีวัฏจักรเชิงลบดังนั้นปัญหาสามารถแก้ไขได้โดยใช้เทคนิคนี้
ในขณะเริ่มต้นจุดยอดทั้งหมดยกเว้นแหล่งที่มาจะถูกทำเครื่องหมายด้วย∞และแหล่งที่มาจะถูกทำเครื่องหมายด้วย 0.
ในขั้นตอนแรกจุดยอดทั้งหมดที่สามารถเข้าถึงได้จากแหล่งที่มาจะได้รับการอัปเดตโดยต้นทุนขั้นต่ำ ดังนั้นจุดยอดa และ h มีการปรับปรุง
ในขั้นตอนถัดไปจุดยอด a, b, f และ e มีการปรับปรุง
ตามตรรกะเดียวกันในจุดยอดขั้นตอนนี้ b, f, c และ g มีการปรับปรุง
ที่นี่จุดยอด c และ d มีการปรับปรุง
ดังนั้นระยะห่างต่ำสุดระหว่างจุดยอด s และจุดยอด d คือ 20.
จากข้อมูลรุ่นก่อนพา ธ คือ s → h → e → g → c → d