อัลกอริทึมของ Dijkstra เป็นเพียง BFS ที่มีลำดับความสำคัญหรือไม่


22

ตามหน้านี้อัลกอริทึมของ Dijkstra เป็นเพียง BFS ที่มีลำดับความสำคัญ มันง่ายจริงๆเหรอ? ผมคิดว่าไม่.


1
ทำไมคุณคิดอย่างนั้น
กราฟิลส์

@ ราฟาเอลเพราะมันดูเหมือนง่ายเกินไปและเป็น: ฉันศึกษาอีกครั้งและฉันเห็นตอนนี้มันไม่ได้ติดตามระยะห่างระหว่างโหนดดังนั้นมันจึงเป็น BFS จริง ๆ ไม่ใช่ Dijkstra
Barry Fruitman

1
ดี Dijkstra ไม่เปลี่ยนค่าคิวคือ "เรียง" กับ (มักเรียกว่า "ผ่อนคลาย"); หากคุณห้ามไม่ให้เป็นเช่นนั้นจริง
Raphael

คำตอบ:


20

คุณสามารถใช้อัลกอริทึมของ Dijkstra ในฐานะ BFS โดยมีคิวลำดับความสำคัญ (แม้ว่าจะไม่ใช่การติดตั้งเพียงอย่างเดียว)

อัลกอริทึมของ Dijkstra อาศัยคุณสมบัติที่เส้นทางที่สั้นที่สุดจากถึงเป็นเส้นทางที่สั้นที่สุดไปยังจุดยอดใด ๆ ตามเส้นทาง นี่คือสิ่งที่ BFS ทำTst

หรือในมุมมองอื่น: อัลกอริทึมของ Dijkstra จะทำงานอย่างไรถ้าน้ำหนักทั้งหมดเป็น 1 เหมือนกับ BFS


4

ก่อนอื่นเราจะปรับ BFS ให้เป็นกราฟถ่วงน้ำหนักทั่วไปที่มากขึ้นอย่างไรG=(V,E)

นี่คือแนวคิดจากหนังสือ "อัลกอริทึม (ส่วน 4.4)" โดย Dasgupta et al:

สำหรับขอบใด ๆของ (มีน้ำหนัก ) แทนที่โดยขอบของความยาวโดยการเพิ่มโหนดหุ่นระหว่างและVe l e l e 1 l e - 1 u ve=(u,v)Elele1le1uv

ด้วยเหตุนี้ขอบของกราฟผลลัพธ์ทั้งหมดจึงมีความยาวหน่วย ดังนั้นเราจึงสามารถคำนวณระยะทางในโดยการเรียกใช้ BFS บนG' G G GGG

ประการที่สองอัลกอริทึม Dijkstra บนเอาชนะ BFS บนกราฟที่ถูกแปลงอย่างไรG GG

BFS บนอาจช้ามากหากบางใหญ่เพราะเสียเวลามากเกินไปในการคำนวณระยะทางไปยังโหนดจำลองที่เราไม่สนใจเลย อัลกอริทึม Dijkstra หลีกเลี่ยงสิ่งนี้โดยการตั้งค่าระยะทางโดยประมาณสำหรับโหนดและผ่อนคลายพวกเขาเมื่อใดก็ตามที่เป็นไปได้l eGle

ประการที่สามอัลกอริทึม 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 ) = 1dist(v)=w(u,v)=1

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • ใน "คิวลำดับความสำคัญ"

    เมื่ออัลกอริทึม Dijkstra ทำงานบนกราฟที่ไม่ถ่วงเวลาคิวลำดับความสำคัญจะมีค่าที่แตกต่างกันสองตัว (ระยะทาง) ดังนั้นคิว FIFO ของ BFS ก็เพียงพอ

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