ตามหน้านี้อัลกอริทึมของ Dijkstra เป็นเพียง BFS ที่มีลำดับความสำคัญ มันง่ายจริงๆเหรอ? ผมคิดว่าไม่.
ตามหน้านี้อัลกอริทึมของ Dijkstra เป็นเพียง BFS ที่มีลำดับความสำคัญ มันง่ายจริงๆเหรอ? ผมคิดว่าไม่.
คำตอบ:
คุณสามารถใช้อัลกอริทึมของ Dijkstra ในฐานะ BFS โดยมีคิวลำดับความสำคัญ (แม้ว่าจะไม่ใช่การติดตั้งเพียงอย่างเดียว)
อัลกอริทึมของ Dijkstra อาศัยคุณสมบัติที่เส้นทางที่สั้นที่สุดจากถึงเป็นเส้นทางที่สั้นที่สุดไปยังจุดยอดใด ๆ ตามเส้นทาง นี่คือสิ่งที่ BFS ทำT
หรือในมุมมองอื่น: อัลกอริทึมของ Dijkstra จะทำงานอย่างไรถ้าน้ำหนักทั้งหมดเป็น 1 เหมือนกับ BFS
ก่อนอื่นเราจะปรับ BFS ให้เป็นกราฟถ่วงน้ำหนักทั่วไปที่มากขึ้นอย่างไร
นี่คือแนวคิดจากหนังสือ "อัลกอริทึม (ส่วน 4.4)" โดย Dasgupta et al:
สำหรับขอบใด ๆของ (มีน้ำหนัก ) แทนที่โดยขอบของความยาวโดยการเพิ่มโหนดหุ่นระหว่างและVe l e l e 1 l e - 1 u v
ด้วยเหตุนี้ขอบของกราฟผลลัพธ์ทั้งหมดจึงมีความยาวหน่วย ดังนั้นเราจึงสามารถคำนวณระยะทางในโดยการเรียกใช้ BFS บนG' G G ′
ประการที่สองอัลกอริทึม Dijkstra บนเอาชนะ BFS บนกราฟที่ถูกแปลงอย่างไรG ′
BFS บนอาจช้ามากหากบางใหญ่เพราะเสียเวลามากเกินไปในการคำนวณระยะทางไปยังโหนดจำลองที่เราไม่สนใจเลย อัลกอริทึม Dijkstra หลีกเลี่ยงสิ่งนี้โดยการตั้งค่าระยะทางโดยประมาณสำหรับโหนดและผ่อนคลายพวกเขาเมื่อใดก็ตามที่เป็นไปได้l e
ประการที่สามอัลกอริทึม Dijkstra ทำงานอย่างไรบนกราฟที่ไม่ถ่วง
มันทำงานเหมือนกับที่ BFS ทำ เราทำอย่างละเอียดจากสองประเด็นหลัก
เมื่อ "ผ่อนคลาย"
สำหรับอัลกอริทึม Dijkstra บนกราฟน้ำหนักทั่วไปการพักผ่อนคือ
for all edges (u,v) in E:
if dist(v) > dist(u) + w(u,v)
dist(v) = dist(u) + w(u,v)
สำหรับ BFS บนกราฟที่ไม่ถ่วงเรารู้ว่าและดังนั้นการพักผ่อนจึงง่ายกว่า:w ( u , v ) = 1
for all edges (u,v) in E:
if dist(v) = \infty
dist(v) = dist(u) + 1
ใน "คิวลำดับความสำคัญ"
เมื่ออัลกอริทึม Dijkstra ทำงานบนกราฟที่ไม่ถ่วงเวลาคิวลำดับความสำคัญจะมีค่าที่แตกต่างกันสองตัว (ระยะทาง) ดังนั้นคิว FIFO ของ BFS ก็เพียงพอ