เหตุใดจึงต้องใช้ Algorithm ของ Dijkstra หาก Breadth First Search (BFS) สามารถทำสิ่งเดียวกันได้เร็วขึ้น


112

สามารถใช้ทั้งสองเพื่อค้นหาเส้นทางที่สั้นที่สุดจากแหล่งเดียว BFS ทำงานในO(E+V)ขณะที่ Dijkstra วิ่งเข้าO((V+E)*log(V))มา

นอกจากนี้ฉันเคยเห็น Dijkstra ใช้หลายอย่างเช่นในโปรโตคอลการกำหนดเส้นทาง

เหตุใดจึงต้องใช้อัลกอริทึมของ Dijkstra หาก BFS สามารถทำสิ่งเดียวกันได้เร็วกว่า

คำตอบ:


158

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

ในขณะเดียวกัน BFS เพียงแค่ขยายการค้นหาทีละ“ ขั้นตอน” (ลิงค์ขอบสิ่งที่คุณต้องการเรียกมันในแอปพลิเคชันของคุณ) ในทุกๆการวนซ้ำซึ่งจะมีผลในการค้นหาขั้นตอนจำนวนน้อยที่สุดที่จะไปถึง โหนดที่กำหนดจากแหล่งที่มาของคุณ (“ root”)


1
ทั้งสองจะให้ผลลัพธ์เดียวกันคือเส้นทางระหว่างจุดยอดสองจุด แต่มีเพียง dijkstra เท่านั้นที่จะรับประกันเส้นทางที่สั้นที่สุด
Edwin

1
ดูคำตอบที่ยอมรับความคิดเห็นที่สอง วิธีที่ดีมากในการอธิบายว่าเหตุใดความซับซ้อนของการคำนวณจึงแตกต่างกัน: stackoverflow.com/questions/25449781/…
jmcarter9t

24

หากคุณพิจารณาเว็บไซต์ท่องเที่ยวเว็บไซต์เหล่านี้ใช้อัลกอริทึมของ Dijkstra เนื่องจากน้ำหนัก (ระยะทาง) บนโหนด

หากคุณจะพิจารณาระยะห่างที่เท่ากันระหว่างโหนดทั้งหมด BFS เป็นตัวเลือกที่ดีกว่า

ตัวอย่างเช่นพิจารณาA -> (B, C) -> (F)ด้วยน้ำหนักขอบที่กำหนดโดยA->B= 10, A->C= 20, B->F= C->F= 5

ที่นี่ถ้าเราใช้ BFS คำตอบจะเป็น ABF หรือ ACF เนื่องจากทั้งสองเป็นเส้นทางที่สั้นที่สุด (เกี่ยวกับจำนวนขอบ) แต่ถ้าเราใช้ Dijstra คำตอบจะเป็น ABF เท่านั้นเพราะพิจารณาน้ำหนักในการเชื่อมต่อ เส้นทาง.



4

จากมุมมองของการนำไปใช้งานอัลกอริทึมของ Dijkstra สามารถใช้งานได้เหมือนกับ BFS โดยการสลับqueueกับไฟล์priority queue.

ที่มา

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