เมื่อใดที่ฉันควรใช้ Kruskal เมื่อเทียบกับ Prim (และในทางกลับกัน)


194

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

คำตอบ:


201

ใช้อัลกอริทึมของ Prim เมื่อคุณมีกราฟที่มีขอบจำนวนมาก

สำหรับกราฟกับVจุดEขอบ Kruskal ของขั้นตอนวิธีการทำงานในO (E ล็อก V)เวลาและขั้นตอนวิธีการ Prim สามารถทำงานในO (E + V บันทึก V)ตัดจำหน่ายเวลาถ้าคุณใช้Fibonacci กอง

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


8
ฉันจะพูดว่า "สถานการณ์ทั่วไป" แทนที่จะเป็นค่าเฉลี่ย .. ฉันคิดว่ามันเป็นคำที่คลุมเครือที่จะใช้ตัวอย่างเช่น "ขนาดเฉลี่ย" ของตารางแฮชคืออะไร ไม่มีความเห็น.
yairchu

2
@SplittingField: ฉันเชื่อว่าคุณกำลังเปรียบเทียบแอปเปิ้ลกับส้ม การวิเคราะห์ค่าตัดจำหน่ายเป็นวิธีที่ง่ายในการรับฟังก์ชั่นการวัด (เพื่อที่จะพูด) --- ไม่ว่าจะเป็นกรณีที่เลวร้ายที่สุดหรือกรณีโดยเฉลี่ยจะขึ้นอยู่กับสิ่งที่คุณกำลังพิสูจน์ ในความเป็นจริง (ที่ผมมองมันได้ตอนนี้) การใช้ภาษาบทความวิกิพีเดียที่แสดงถึงว่าเพียงใช้ในการวิเคราะห์กรณีที่เลวร้ายที่สุด ตอนนี้การใช้การวิเคราะห์ดังกล่าวหมายความว่าคุณไม่สามารถทำสัญญาที่แข็งแกร่งเกี่ยวกับค่าใช้จ่ายของการดำเนินการเฉพาะได้ แต่เมื่อถึงเวลาที่อัลกอริทึมเสร็จสิ้นก็จะเกิดขึ้นจริงโดย O (E + VlogV) แม้แต่กรณีที่เลวร้ายที่สุด
agorenst

10
ฟังดูดีในทางทฤษฎี แต่ฉันพนันได้เลยว่ามีคนไม่กี่คนที่สามารถนำ Fibonacci heap ไปใช้ได้
Alexandru

2
@tambamblin สามารถมีขอบ C (V, 2) ในกรณีที่แย่ที่สุด ดังนั้นเวลารวมของอัลกอริธึมของ Prim จะลดลงถึง O (V ^ 2 + VlogV) เช่น O (V ^ 2) ในกรณี fibonacci heap หรือไม่
กรีนก็อบลิน

7
นอกจากนี้ยังมีปัจจัยที่สำคัญอีกอย่างหนึ่ง: ผลลัพธ์ของ Prims เป็น MST เฉพาะเมื่อกราฟเชื่อมต่อ (เอาท์พุทที่ดูเหมือนว่าฉันจะไม่ใช้อย่างอื่น) แต่ผลลัพธ์ของ Kruskal เป็นป่า Spanning ขั้นต่ำ
อังเดรฉัน

102

ผมพบว่าหัวข้อที่ดีมากในสุทธิที่อธิบายถึงความแตกต่างในทางที่ตรงไปตรงมามาก: http://www.thestudentroom.co.uk/showthread.php?t=232168

อัลกอริธึมของ Kruskal จะเติบโตโซลูชันจาก edge ที่ถูกที่สุดโดยการเพิ่ม edge ที่ถูกที่สุดถัดไปหากว่ามันไม่ได้สร้างรอบ

อัลกอริทึมของ Prim จะเติบโตโซลูชันจากจุดสุดยอดแบบสุ่มโดยการเพิ่มจุดสุดยอดที่ถูกที่สุดถัดไปจุดยอดที่ไม่ได้อยู่ในการแก้ปัญหาในปัจจุบัน แต่เชื่อมต่อกับมันโดยขอบที่ถูกที่สุด

เอกสารแนบที่นี่เป็นเอกสารที่น่าสนใจในหัวข้อนั้นป้อนคำอธิบายรูปภาพที่นี่ป้อนคำอธิบายรูปภาพที่นี่

หากคุณใช้ทั้ง Kruskal และ Prim ในรูปแบบที่ดีที่สุด: ด้วยการค้นหาสหภาพและ finbonacci heap ตามลำดับคุณจะสังเกตได้ว่า Kruskal นั้นง่ายต่อการนำไปปฏิบัติอย่างไรเมื่อเปรียบเทียบกับ Prim

Prim นั้นยากกว่าด้วยฟีโบนักชีฮีปส่วนใหญ่เพราะคุณต้องจัดทำตารางการทำหนังสือเพื่อบันทึกการเชื่อมโยงแบบสองทิศทางระหว่างโหนดกราฟและโหนดฮีป ด้วยการค้นหาของยูเนี่ยนมันเป็นสิ่งที่ตรงกันข้ามโครงสร้างนั้นง่ายและสามารถสร้าง mst ได้โดยตรงโดยแทบไม่มีค่าใช้จ่ายเพิ่มเติม


2
Nitpick: 'ภาพนิ่ง' สุดท้ายในแต่ละรายการควรอ่าน "ทำซ้ำจนกว่าคุณจะมีต้นไม้ทอด"; ไม่ใช่จนกระทั่ง MST ซึ่งเป็นงานที่เกิดขึ้นซ้ำ ๆ - ฉันจะรู้ได้อย่างไรว่ามันน้อยมาก - นั่นเป็นสาเหตุที่ฉันติดตาม Prim's / Kruskal เพื่อเริ่มต้น!
OJFord

@OllieFord ฉันพบกระทู้นี้เพื่อค้นหาภาพง่ายๆของ Prim และ Kruskal algorithm อัลกอริทึมรับประกันได้ว่าคุณจะพบต้นไม้และต้นไม้นั้นเป็น MST และคุณรู้ว่าคุณได้พบต้นไม้เมื่อคุณมีขอบตรง V-1
mikedu95

@ mikedu95 คุณถูกต้องทำให้เป็นจุดเดียวกับความคิดเห็นก่อนหน้าของฉันจากมุมที่แตกต่าง
OJFord

แต่ไม่ใช่เงื่อนไขที่คุณต้องเลือกด้วยน้ำหนักเพียงจุดเดียวระหว่างจุดยอดคุณไม่สามารถเลือกน้ำหนัก 2 มากกว่าหนึ่งครั้งจากกราฟด้านบนคุณต้องเลือกน้ำหนักตัวถัดไป: 3 @Snicolas
ani0904071

30

ฉันรู้ว่าคุณไม่ได้ขอสิ่งนี้ แต่ถ้าคุณมีหน่วยการประมวลผลมากขึ้นคุณควรพิจารณาอัลกอริทึมของBorůvkaเสมอเพราะมันอาจขนานกันได้ง่าย - ดังนั้นจึงมีข้อดีด้านประสิทธิภาพมากกว่าอัลกอริทึม Kruskal และJarník-Prim


23

Kruskal สามารถมีประสิทธิภาพที่ดีขึ้นหากขอบสามารถเรียงในเวลาเชิงเส้นหรือจะเรียงแล้ว

Prim ดีกว่าหากจำนวนขอบถึงจุดสูงสุดสูง


19

ความซับซ้อนของเวลาKruskalกรณีที่เลวร้ายที่สุดคือO (E log E)นี่เป็นเพราะเราจำเป็นต้องเรียงลำดับขอบ Primเวลาซับซ้อนกรณีที่เลวร้ายที่สุดคือO (E ล็อก V)ที่มีคิวลำดับความสำคัญหรือดียิ่งขึ้น, O (เข้าสู่ระบบ E V + V)กับFibonacci กอง เราควรใช้ Kruskal เมื่อกราฟกระจัดกระจายจำนวนขอบ iesmall เช่น E = O (V) เมื่อมีการเรียงขอบแล้วหรือถ้าเราสามารถเรียงในเวลาเชิงเส้น เราควรใช้ Prim เมื่อกราฟมีความหนาแน่นเช่นจำนวนขอบสูงเช่น E = O (V²)


สำหรับผมแล้ว Prim นั้นไม่เคยเลวร้ายไปกว่า Kruskal ที่ชาญฉลาด เนื่องจาก E ควรมีอย่างน้อย V-1 จึงมีต้นไม้ทอด ฉันคิดว่าเหตุผลที่เราอาจชอบ Kruskal สำหรับกราฟที่กระจัดกระจายก็คือโครงสร้างข้อมูลนั้นง่ายมาก
Yu Gu

16

หากเราหยุดอัลกอริธึมในอัลกอริธึมของ Prim Prim จะสร้าง Tree ที่เชื่อมต่อกันเสมอ


5

หนึ่งโปรแกรมที่สำคัญของอัลกอริทึม Kruskal อยู่ในการจัดกลุ่มการเชื่อมโยงเดียว

พิจารณา n จุดยอดและคุณมีกราฟที่สมบูรณ์เพื่อให้ได้ AK กลุ่มของจุดเหล่านั้นเรียกใช้อัลกอริทึมของ Kruskal เหนือขอบ n- (k-1) แรกของชุดขอบเรียงลำดับคุณได้ k-cluster ของกราฟที่มีค่าสูงสุด การเว้นวรรค


3

เวลาที่ดีที่สุดสำหรับ Kruskal คือ O (E logV) สำหรับการใช้กองทับถมของ Prim เราสามารถรับ O (E + V lgV) ดังนั้นในกราฟที่หนาแน่น Prim's ดีกว่ามาก


2

Prim's นั้นดีกว่าสำหรับกราฟที่มีความหนาแน่นมากขึ้นและในเรื่องนี้เราไม่จำเป็นต้องให้ความสนใจกับวงรอบมากนักโดยการเพิ่มขอบในขณะที่เราจัดการกับโหนดเป็นหลัก Prim's เร็วกว่า Kruskal ในกรณีของกราฟที่ซับซ้อน


2

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

กราฟเช่นนี้ _____________ | | | | | | | __________ | | ตั้งชื่อจุดสุดยอด a, b, c, d, e, f

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