ในกราฟที่ไม่มีการถ่วงน้ำหนักและไม่มีทิศทางด้วย vertices และ edge เช่นวิธีใดที่เร็วที่สุดในการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟ สามารถทำได้เร็วกว่า Floyd-Warshall ซึ่งเป็นแต่เร็วมากต่อการทำซ้ำหรือไม่?
ถ้ากราฟนั้นถูกถ่วงน้ำหนักล่ะ?
ในกราฟที่ไม่มีการถ่วงน้ำหนักและไม่มีทิศทางด้วย vertices และ edge เช่นวิธีใดที่เร็วที่สุดในการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟ สามารถทำได้เร็วกว่า Floyd-Warshall ซึ่งเป็นแต่เร็วมากต่อการทำซ้ำหรือไม่?
ถ้ากราฟนั้นถูกถ่วงน้ำหนักล่ะ?
คำตอบ:
เนื่องจากนี่เป็นกราฟที่ไม่ถ่วงคุณจึงสามารถเรียกใช้Breadth First Search (BFS) จากทุก ๆ จุดยอดในกราฟ การวิ่งของ BFS แต่ละครั้งจะให้ระยะทางที่สั้นที่สุด (และเส้นทาง) จากจุดเริ่มต้นไปยังจุดสุดยอดอื่น ๆ ความซับซ้อนของเวลาสำหรับหนึ่ง BFS คือเนื่องจากในกราฟของคุณ การรันด้วยคูณจะให้ความซับซ้อนของเวลา
สำหรับกราฟน้ำหนักแบบถ่วงน้ำหนักอัลกอริทึมของจอห์นสันที่แนะนำโดย Yuval นั้นเร็วที่สุดสำหรับกราฟแบบกระจาย มันต้องใช้เวลาซึ่งในกรณีของคุณจะออกมาเป็นV) สำหรับกราฟที่ไม่ระบุทิศทางแบบถ่วงน้ำหนักคุณสามารถเรียกใช้อัลกอริทึมของ Dijkstraจากแต่ละโหนดหรือแทนที่ขอบที่ไม่ได้บอกทิศทางด้วยขอบสองทิศทางที่ตรงข้ามกันและเรียกใช้อัลกอริทึมของจอห์นสัน ทั้งสองอย่างนี้จะให้เวลา aysmptotic เช่นเดียวกับอัลกอริทึมของจอห์นสันด้านบนสำหรับกรณีของคุณ นอกจากนี้โปรดทราบว่าวิธีการ BFS ที่ฉันกล่าวถึงข้างต้นใช้งานได้กับกราฟทั้งแบบกำหนดทิศทางและไม่ระบุทิศทาง
มีขั้นตอนวิธีการจอห์นสันซึ่งเป็นเวลาการทำงานเป็นVE)
คุณสามารถลองสร้าง Floyd-Warshall เวอร์ชั่นที่เร็วกว่าในการฝึกแบบเบาบาง
ขั้นแรกให้เราจำได้ว่าอัลกอริทึมนี้ทำอะไร:
ให้เป็นเมทริกซ์ของระยะทาง ในตอนต้นของขั้นตอนวิธีเป็นน้ำหนักของขอบเจ ถ้าขอบนี้ไม่ได้อยู่แล้วM_
อัลกอริทึมมีขั้นตอนในขั้นตอนของอัลกอริทึมสำหรับทุกคู่ของโหนดเราตั้งค่า
เห็นได้ชัดว่าหากหรือดังนั้นจึงไม่จำเป็นต้องทำการอัปเดต ดังนั้นในขั้นตอนแรกของอัลกอริทึมเราจะต้องดำเนินการประมาณเปรียบเทียบโดยที่และแสดง จำนวนขอบขาเข้าและขาออกของโหนด -th ตามลำดับ เมื่ออัลกอริธึมดำเนินไปจะมีการเติมรายการของเมทริกซ์มากขึ้นเรื่อย ๆ ดังนั้นขั้นตอนสุดท้ายอาจใช้เวลานานกว่านั้นมาก
โปรดทราบว่าเราต้องการวิธีที่มีประสิทธิภาพในการวนซ้ำเฉพาะเซลล์ที่ไม่สิ้นสุดในแถว -th และคอลัมน์ของเมทริกซ์ สิ่งนี้สามารถทำได้โดยเก็บชุดของขอบขาเข้าและขาออกสำหรับทุกโหนด
ปรากฏว่าขั้นตอนแรกของอัลกอริทึมจะได้ประโยชน์อย่างมากจากการกระจาย ตัวอย่างเช่นกราฟที่สร้างแบบสุ่มด้วยแสดงให้เห็นว่าการวนซ้ำครั้งแรก ( ) เป็นเพียงขั้นตอนหากกราฟแยกออกเป็นชิ้นส่วนที่เชื่อมต่อหลายคนแล้วเมทริกซ์จะยังคงค่อนข้างเบาบางตลอดขั้นตอนวิธีการและรันไทม์ทั้งหมดอาจจะเป็นต่ำเป็น(V) ในทางกลับกันหากกราฟมีองค์ประกอบที่เชื่อมต่อเพียงหนึ่งองค์ประกอบดังนั้นการทำซ้ำครั้งล่าสุดคาดว่าจะใช้ขั้นตอนในกรณีนี้เวลาทำงานทั้งหมดอาจจะเป็น3) มีขนาดใหญ่เท่ากับรุ่นที่ไม่มีกระจัดกระจาย