ฉันพูดถูกเกี่ยวกับความแตกต่างระหว่างอัลกอริทึม Floyd-Warshall, Dijkstra และ Bellman-Ford หรือไม่?


16

ฉันกำลังศึกษาทั้งสามและฉันได้ระบุข้อสรุปจากพวกเขาด้านล่าง มีใครบอกฉันได้ไหมว่าฉันเข้าใจถูกต้องเพียงพอหรือไม่ ขอขอบคุณ.

  1. อัลกอริทึม Dijkstraจะใช้เมื่อคุณมีแหล่งเดียวและคุณต้องการทราบเส้นทางที่เล็กที่สุดจากโหนดหนึ่งไปยังอีกโหนดหนึ่ง แต่ล้มเหลวในกรณีเช่นนี้นี้

  2. อัลกอริทึม Floyd-Warshallถูกใช้เมื่อโหนดใด ๆ ทั้งหมดสามารถเป็นต้นทางดังนั้นคุณต้องการให้ระยะทางที่สั้นที่สุดในการเข้าถึงโหนดปลายทางใด ๆ จากโหนดต้นทางใด ๆ สิ่งนี้จะล้มเหลวก็ต่อเมื่อมีรอบการลบเท่านั้น

  3. Bellman-Fordถูกใช้เช่น Dijkstra เมื่อมีเพียงแหล่งเดียว สิ่งนี้สามารถรองรับน้ำหนักเชิงลบและการทำงานของมันเหมือนกับ Floyd-Warshall ยกเว้นแหล่งเดียวใช่ไหม (นี่คือสิ่งที่ฉันไม่แน่ใจ)


ยินดีต้อนรับ! ฉันแก้ไขส่วนรหัสซ้ำซ้อน ผู้คนสามารถคลิกไปที่ Wikipedia ด้วยตนเองหรือตรวจสอบอัลกอริทึมในหนังสือเรียนที่ชื่นชอบ โปรดทราบว่าคำถามของคุณเป็นคำถามแปลก ๆ ที่จะถามเพราะคำตอบ "ใช่" อาจไม่มีอะไรเพิ่มเติมอีกแล้ว
Raphael

คำตอบ:


23

อัลกอริทึมของ Dijkstra จะใช้เมื่อคุณมีแหล่งข้อมูลเดียวและคุณต้องการทราบเส้นทางที่เล็กที่สุดจากโหนดหนึ่งไปยังอีกโหนดหนึ่ง แต่ล้มเหลว [ในกราฟที่มีขอบลบ]

ssprevious[v]โวลต์

พฤติกรรมของอัลกอริทึมของ Dijkstra ในกราฟที่มีขอบเป็นลบนั้นขึ้นอยู่กับตัวแปรที่แม่นยำภายใต้การสนทนา อัลกอริทึมบางอย่างเช่นเดียวกับในวิกิพีเดียทำงานได้อย่างรวดเร็วเสมอ แต่ไม่คำนวณเส้นทางที่สั้นที่สุดเมื่อมีขอบลบ ตัวแปรอื่น ๆ เช่นหนึ่งในบันทึกการบรรยายเหล่านี้จะคำนวณเส้นทางที่สั้นที่สุดอย่างถูกต้องเสมอ (เว้นแต่จะมีวัฏจักรเชิงลบที่สามารถเข้าถึงได้จากแหล่งที่มา) แต่อาจต้องใช้เวลาชี้แจงในกรณีที่เลวร้ายที่สุดหากมีขอบลบ

อัลกอริทึมของ Floyd-Warshall ใช้เมื่อทุกโหนดใด ๆ สามารถเป็นแหล่งกำเนิดได้ดังนั้นคุณจึงต้องการระยะทางที่สั้นที่สุดในการเข้าถึงโหนดปลายทางใด ๆ จากโหนดต้นทางใด ๆ สิ่งนี้จะล้มเหลวก็ต่อเมื่อมีรอบการลบเท่านั้น

ถูกต้อง. Floyd-Warshall เป็นตัวอย่างหนึ่งของอัลกอริธึมพา ธ ที่สั้นที่สุดของคู่ทั้งหมดซึ่งหมายความว่าคำนวณเส้นทางที่สั้นที่สุดระหว่างทุก ๆโหนดคู่ อีกตัวอย่างหนึ่งคือ "สำหรับแต่ละโหนด v ให้รัน Dijkstra ด้วย v เป็นโหนดต้นทาง" มีอีกหลายคน

Bellman-Ford ใช้เหมือนของ Dijkstra เมื่อมีเพียงแหล่งเดียว สิ่งนี้สามารถรองรับน้ำหนักเชิงลบและการทำงานของมันเหมือนกับของ Floyd-Warshall ยกเว้นแหล่งเดียวใช่ไหม

O(V3)O(V2E)O(VE)เวลาสำหรับแต่ละจุดสุดยอดแหล่งที่มา

สำหรับรายละเอียดเพิ่มเติมโปรดอ่านตำราเรียนอัลกอริทึมที่คุณชื่นชอบ (คุณมีตำราอัลกอริทึมที่ชื่นชอบใช่ไหม?)


คุณอยากแบ่งปันตำราเรียนอัลกอริทึมที่คุณชื่นชอบไหม?
Abdul


@Abdul baited - ตำราเรียนที่ใช้ใน MIT / Stanford คือ T. Cormen และคณะ อัลกอริทึมเบื้องต้น หนังสือที่ใช้ใน Cornell คือ J. Kleinberg และการออกแบบอัลกอริทึม cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/ …
AffluentOwl

2

อัลกอริธึมทั้งสามครอบคลุมในสไลด์บรรยายโดยศาสตราจารย์แจฮยอนพาร์ค (มหาวิทยาลัยสแตนฟอร์ด) นี่คือลิงค์ขั้นตอนวิธีเส้นทางที่สั้นที่สุด


สิ่งนี้ไม่ได้ตอบคำถามเกี่ยวกับความแตกต่างและไม่ได้อยู่ในตัวเองเพียงลิงค์ที่ไม่มีการสรุปไม่ถือว่าเป็นคำตอบที่ดี ดูเหมือนว่าซ้ำซ้อนเพราะมันไม่ครอบคลุมมากกว่าคำตอบที่มีอยู่
Evil

1

หน้าวิกิพีเดียในการแก้ปัญหาเส้นทางที่สั้นที่สุดอธิบายสองปัญหาที่แตกต่างกัน: SSSP และ APSP

เส้นทางที่สั้นที่สุดของแหล่งเดียว (SSSP):

  • อัลกอริทึมของ Dijkstra: แก้ปัญหาเส้นทางที่สั้นที่สุดในแหล่งเดียว
    • ข้อ จำกัด : เฉพาะขอบลบที่ไม่สามารถจัดการได้
    • กราฟที่ไม่ถ่วงน้ำหนัก: Dijkstra เหมือนกับ BFS
  • อัลกอรึทึมของเบลแมน - ฟอร์ด: แก้ไขปัญหาแหล่งเดียวหากน้ำหนักขอบอาจเป็นลบ นี่คือการปรับปรุง Dijkstra ซึ่งตอนนี้สามารถรับน้ำหนักเชิงลบได้เช่นกัน

เส้นทางที่สั้นที่สุดของคู่ทั้งหมด (APSP):

  • อัลกอริทึม Floyd – Warshall: แก้เส้นทางที่สั้นที่สุดของคู่ทั้งหมด รองรับทั้งขอบบวกและลบ
    • ข้อ จำกัด : ไม่สามารถจัดการกับวงจรเชิงลบได้

ดังนั้น Floyd – Warshall จึงไม่เหมือนกับ BFS แม้ว่าวิธีการพื้นฐานจะเหมือนกัน แต่การเขียนโปรแกรมแบบไดนามิก


1

บางทีนี่อาจเป็นความคิดเห็นมากกว่าคำตอบ แต่ก็เป็นข้อแตกต่างระหว่างอัลกอริธึมที่คำตอบอื่นไม่ได้กล่าวถึง

คนมักจะเรียกอัลกอริทึมของฟลอยด์ Floyd-Warshallแต่อัลกอริทึมของฟลอยด์และวอร์ ธ ฮอลล์นั้นไม่เหมือนกัน

O(1)O(n2)

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