อัลกอริธึมที่เร็วที่สุดสำหรับการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟคืออะไร?


24

ในกราฟที่ไม่มีการถ่วงน้ำหนักและไม่มีทิศทางด้วย vertices และ edge เช่นวิธีใดที่เร็วที่สุดในการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟ สามารถทำได้เร็วกว่า Floyd-Warshall ซึ่งเป็นแต่เร็วมากต่อการทำซ้ำหรือไม่?VE2V>EO(V3)

ถ้ากราฟนั้นถูกถ่วงน้ำหนักล่ะ?

คำตอบ:


32

เนื่องจากนี่เป็นกราฟที่ไม่ถ่วงคุณจึงสามารถเรียกใช้Breadth First Search (BFS) จากทุก ๆ จุดยอดในกราฟ การวิ่งของ BFS แต่ละครั้งจะให้ระยะทางที่สั้นที่สุด (และเส้นทาง) จากจุดเริ่มต้นไปยังจุดสุดยอดอื่น ๆ ความซับซ้อนของเวลาสำหรับหนึ่ง BFS คือเนื่องจากในกราฟของคุณ การรันด้วยคูณจะให้ความซับซ้อนของเวลาvO(V+E)=O(V)E=O(V)VO(V2)

สำหรับกราฟน้ำหนักแบบถ่วงน้ำหนักอัลกอริทึมของจอห์นสันที่แนะนำโดย Yuval นั้นเร็วที่สุดสำหรับกราฟแบบกระจาย มันต้องใช้เวลาซึ่งในกรณีของคุณจะออกมาเป็นV) สำหรับกราฟที่ไม่ระบุทิศทางแบบถ่วงน้ำหนักคุณสามารถเรียกใช้อัลกอริทึมของ Dijkstraจากแต่ละโหนดหรือแทนที่ขอบที่ไม่ได้บอกทิศทางด้วยขอบสองทิศทางที่ตรงข้ามกันและเรียกใช้อัลกอริทึมของจอห์นสัน ทั้งสองอย่างนี้จะให้เวลา aysmptotic เช่นเดียวกับอัลกอริทึมของจอห์นสันด้านบนสำหรับกรณีของคุณ นอกจากนี้โปรดทราบว่าวิธีการ BFS ที่ฉันกล่าวถึงข้างต้นใช้งานได้กับกราฟทั้งแบบกำหนดทิศทางและไม่ระบุทิศทางO(V2logV+VE)O(V2logV)



7

คุณสามารถลองสร้าง Floyd-Warshall เวอร์ชั่นที่เร็วกว่าในการฝึกแบบเบาบาง

ขั้นแรกให้เราจำได้ว่าอัลกอริทึมนี้ทำอะไร:

ให้เป็นเมทริกซ์ของระยะทาง ในตอนต้นของขั้นตอนวิธีเป็นน้ำหนักของขอบเจ ถ้าขอบนี้ไม่ได้อยู่แล้วM_MMi,jijMi,j=

อัลกอริทึมมีขั้นตอนในขั้นตอนของอัลกอริทึมสำหรับทุกคู่ของโหนดเราตั้งค่าVki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

เห็นได้ชัดว่าหากหรือดังนั้นจึงไม่จำเป็นต้องทำการอัปเดต ดังนั้นในขั้นตอนแรกของอัลกอริทึมเราจะต้องดำเนินการประมาณเปรียบเทียบโดยที่และแสดง จำนวนขอบขาเข้าและขาออกของโหนด -th ตามลำดับ เมื่ออัลกอริธึมดำเนินไปจะมีการเติมรายการของเมทริกซ์มากขึ้นเรื่อย ๆ ดังนั้นขั้นตอนสุดท้ายอาจใช้เวลานานกว่านั้นมากMi,k=Mk,j=degin(k)degout(k)degin(k)degout(k)kM

โปรดทราบว่าเราต้องการวิธีที่มีประสิทธิภาพในการวนซ้ำเฉพาะเซลล์ที่ไม่สิ้นสุดในแถว -th และคอลัมน์ของเมทริกซ์ สิ่งนี้สามารถทำได้โดยเก็บชุดของขอบขาเข้าและขาออกสำหรับทุกโหนดk

ปรากฏว่าขั้นตอนแรกของอัลกอริทึมจะได้ประโยชน์อย่างมากจากการกระจาย ตัวอย่างเช่นกราฟที่สร้างแบบสุ่มด้วยแสดงให้เห็นว่าการวนซ้ำครั้งแรก ( ) เป็นเพียงขั้นตอนหากกราฟแยกออกเป็นชิ้นส่วนที่เชื่อมต่อหลายคนแล้วเมทริกซ์จะยังคงค่อนข้างเบาบางตลอดขั้นตอนวิธีการและรันไทม์ทั้งหมดอาจจะเป็นต่ำเป็น(V) ในทางกลับกันหากกราฟมีองค์ประกอบที่เชื่อมต่อเพียงหนึ่งองค์ประกอบดังนั้นการทำซ้ำครั้งล่าสุดคาดว่าจะใช้ขั้นตอนในกรณีนี้เวลาทำงานทั้งหมดอาจจะเป็น3) มีขนาดใหญ่เท่ากับรุ่นที่ไม่มีกระจัดกระจายE=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)

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