Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ความแตกต่างระหว่าง Prim's และ Kruskal's Algorithm


ในบทความนี้ เราจะทำความเข้าใจความแตกต่างระหว่าง Prim's และ Kruskal's algorithms

Kruskal's Algorithm สำหรับ Minimum Spanning Tree (MST)

  • เมื่อมีกราฟที่เชื่อมต่อและไม่มีทิศทาง (undirected) spanning tree ของกราฟดังกล่าวคือ subgraph ที่เป็นต้นไม้เชื่อมโยงทุก vertex
  • กราฟเดียวสามารถมี spanning trees หลายตัวได้
  • Minimum spanning tree (MST) (หรือ minimum weight spanning tree) สำหรับกราฟที่มีน้ำหนัก เชื่อมต่อ และไม่มีทิศทาง คือ spanning tree ที่มีน้ำหนักน้อยกว่าหรือเท่ากับน้ำหนักของทุก spanning tree อื่น
  • น้ำหนักของ spanning tree กำหนดโดยการบวกน้ำหนักที่เกี่ยวข้องกับทุก edge ของ spanning tree
  • MST สามารถสร้างจาก vertex ที่มีน้ำหนักน้อยที่สุดในกราฟ
  • แต่ละโหนดถูกท่องเพียงครั้งเดียว
  • ทำงานเร็วใน sparse graphs
  • Time complexity คือ O(E log V) โดย V คือจำนวน vertices
  • ทำงานกับ disconnected components ได้

ขั้นตอนการหา MST ด้วย Kruskal's Algorithm:

  • จัดเรียง edges ตามลำดับน้ำหนักจากน้อยไปมาก
  • เลือก edge ที่เล็กที่สุด
  • ตรวจสอบว่ามันสร้าง cycle กับ spanning-tree ที่สร้างขึ้นจนถึงจุดนั้นหรือไม่
  • หากยังไม่สร้าง cycle ต้องรวม edge นี้เข้าไป
  • มิฉะนั้น สามารถทิ้งได้
  • ทำซ้ำขั้นตอน 2,3,4 จนกว่า spanning tree จะมี V-1 edges

Prim's Algorithm สำหรับ Minimum Spanning Tree (MST)

  • คล้ายกับ Kruskal's algorithm กล่าวคือ เป็น greedy algorithm
  • เริ่มต้นด้วย spanning tree ว่าง รักษาชุด vertex สองชุด
  • ชุดแรกมี vertices ที่รวมอยู่ใน MST แล้ว ส่วนอีกชุดมี vertices ที่ยังไม่รวม
  • ในทุกขั้นตอน อัลกอริทึมพิจารณา edges ทั้งหมดที่จะเชื่อมสองชุด เลือก edge ที่มีน้ำหนักน้อยที่สุด
  • หลังจากขั้นตอนนี้ อัลกอริทึมย้ายไปยัง endpoint อีกด้านของ edge ของชุดที่มี MST
  • MST สามารถสร้างจาก vertex ใดก็ได้ในกราฟ
  • โหนดหนึ่งถูกเดินทางหลายครั้งเพื่อหาค่าระยะทางต่ำสุด
  • Time complexity คือ O(V²) โดย V คือจำนวน vertices สามารถปรับปรุงเป็น O(E + log V) ด้วย Fibonacci heaps
  • ทำงานเร็วใน dense graphs
  • ให้ connected components และทำงานกับ connected graph เท่านั้น

ขั้นตอนการหา MST ด้วย Prim's Algorithm:

  • สร้าง mstSet ที่ติดตาม vertices ที่รวมอยู่ใน MST แล้ว
  • กำหนด key value ให้ทุก vertices ของ input graph
  • Key values เริ่มต้นกำหนดเป็น 'INFINITE'
  • กำหนด key value 0 ให้ vertex แรกเพื่อถูกเลือกก่อน
  • เมื่อ mstSet ยังไม่รวม vertices ทั้งหมด ทำตามขั้นตอนด้านล่าง
    • เลือก vertex 'u' ที่ไม่อยู่ใน mstSet และมี key value ต่ำสุด
    • 'u' นี้ถูกรวมเข้า mstSet
    • อัปเดต key value ของ vertices ติดจำนวนทั้งหมดของ 'u'
    • ทำได้โดย iteration ผ่าน vertices ติดจำนวนทั้งหมด
    • สำหรับ vertex ติดจำนวน 'v' หากน้ำหนัก edge 'u'-'v' น้อยกว่า key value ก่อนหน้าของ 'v' ให้อัปเดต key value เป็นน้ำหนักของ 'u-v'