ประมาณหนึ่งปีที่ผ่านมาเพื่อนและฉันคิดถึงวิธีการใช้อัลกอริทึมของ Kruskal สำหรับกราฟที่มีความหนาแน่นสูงกว่าผูกไว้โดยทั่วไป โดยเฉพาะเราจะได้รับในทุกกรณีซึ่งคล้ายกับ Prim's เมื่อนำมาใช้โดยใช้เมทริกซ์ adjacencyΘ ( n 2 )
ฉันโพสต์เล็กน้อยเกี่ยวกับอัลกอริทึมในบล็อกของฉันรวมถึงรหัส C ++ และการวัดประสิทธิภาพ แต่นี่เป็นแนวคิดทั่วไป:
รักษาหนึ่งโหนดตัวแทนสำหรับแต่ละองค์ประกอบที่เชื่อมต่อ เริ่มแรกโหนดทั้งหมดเป็นตัวแทนของตัวเอง
รักษาเวกเตอร์
dist[i]
ดังกล่าวว่าสำหรับทุกองค์ประกอบมีองค์ประกอบข้ามขอบเหตุการณ์ที่เกิดขึ้นจะมีน้ำหนักเบาi
i
เมื่อค้นหาขอบที่เบาที่สุดที่ข้ามพาร์ทิชันให้หา
i
น้ำหนักที่ลดลงdist[i]
ในเวลาเชิงเส้นเมื่อเข้าร่วมสององค์ประกอบและปรับเปลี่ยนถ้อยคำเมทริกซ์เช่นว่าตอนนี้สำหรับทุกส่วนkและเครื่องหมายฉันไม่ได้เป็นตัวแทนขององค์ประกอบที่เชื่อมต่ออีกต่อไป ( ตอนนี้เหลือเพียงjเท่านั้น)c j A A i , k = min { A i , k , A j , k } k i j
การหดตัวของขอบที่เบาที่สุดและการค้นหาของขอบดังกล่าวสามารถทำได้ในเวลาเชิงเส้น เราทำเช่นนี้ครั้งเพื่อค้นหา MST จำเป็นต้องมีการทำบัญชีเล็กน้อยเพื่อหาขอบที่เราต้องการเพิ่มใน MST จริง ๆ แต่ไม่ได้เพิ่มความซับซ้อน ดังนั้นรันไทม์เป็น2) การดำเนินการเป็นเพียงสองสามลูปΘ ( n 2 )
Kruskal รุ่นนี้เป็นที่รู้จักกันดีในวรรณคดีหรือไม่?