graph-algorithms
การทำความเข้าใจเกี่ยวกับ Graph Algorithms
Graph Algorithms คืออัลกอริธึมที่ใช้ในการจัดการและค้นหาข้อมูลในกราฟ (graph) ซึ่งเป็นโครงสร้างข้อมูลที่ประกอบด้วยจุด (vertices หรือ nodes) และเส้นเชื่อมระหว่างจุดเหล่านั้น (edges) กราฟสามารถใช้ในการแสดงความสัมพันธ์ระหว่างวัตถุต่างๆ เช่น การแสดงเครือข่ายสังคม, ระบบการขนส่ง, ระบบคอมพิวเตอร์ และอื่นๆ
1. คำจำกัดความของกราฟ
- Vertex (Node): จุดหรือองค์ประกอบของกราฟ
- Edge: การเชื่อมต่อระหว่างจุดสองจุดในกราฟ
- Directed Graph: กราฟที่เชื่อมโยงจากจุดหนึ่งไปยังอีกจุดหนึ่งในทิศทางเดียว (มีทิศทาง)
- Undirected Graph: กราฟที่เชื่อมโยงระหว่างจุดสองจุดในทิศทางที่ไม่จำกัด
- Weighted Graph: กราฟที่มีการกำหนดน้ำหนัก (weight) หรือค่าให้กับแต่ละขอบ
- Unweighted Graph: กราฟที่ขอบไม่มีน้ำหนัก
- Connected Graph: กราฟที่ทุกจุดในกราฟสามารถเชื่อมโยงถึงกันได้
- Disconnected Graph: กราฟที่มีจุดบางจุดไม่สามารถเชื่อมโยงถึงจุดอื่นๆ ได้
2. ประเภทของ Graph Algorithms
1. Depth-First Search (DFS)
DFS คืออัลกอริธึมการค้นหากราฟที่เริ่มต้นจากจุดเริ่มต้น (source node) แล้วไปยังจุดที่ไม่เคยเยี่ยมชมมาก่อน โดยการเลือกเส้นทางที่ลึกที่สุด (downward) ก่อนที่จะกลับขึ้นไปสำรวจเส้นทางอื่นๆ
- วิธีการทำงาน:
- เริ่มต้นที่จุดเริ่มต้น
- เยี่ยมชมจุดนั้นและเยี่ยมชมจุดถัดไปตามเส้นเชื่อม (edge)
- ถ้ามีจุดที่ยังไม่ได้เยี่ยมชม, เลือกจุดนั้นและทำซ้ำจนกว่าจะไม่สามารถเยี่ยมชมจุดใหม่ได้
- หากไม่สามารถไปต่อได้, กลับไปยังจุดก่อนหน้านี้ที่ยังไม่เยี่ยมชม
- ประโยชน์: ดีในการค้นหาวงจร (cycle detection) และการค้นหาทุกจุดที่เชื่อมโยงถึงกัน
- Complexity: ( O(V + E) ), โดยที่ ( V ) คือจำนวนจุดและ ( E ) คือจำนวนเส้นเชื่อม
2. Breadth-First Search (BFS)
BFS คืออัลกอริธึมการค้นหากราฟที่เริ่มต้นจากจุดเริ่มต้นและสำรวจในระดับ (layer) ที่ใกล้ที่สุดก่อน แล้วค่อยๆ ขยายไปยังระดับถัดไป
- วิธีการทำงาน:
- เริ่มต้นจากจุดเริ่มต้น
- เยี่ยมชมทุกจุดที่เชื่อมโยงกับจุดเริ่มต้นก่อน
- จากนั้น เยี่ยมชมจุดที่เชื่อมโยงกับจุดที่เพิ่งเยี่ยมชม
- ทำซ้ำจนกว่าจะเยี่ยมชมทุกจุดที่สามารถเข้าถึงได้
- ประโยชน์: ดีในการหาทางสั้นที่สุดจากจุดเริ่มต้นไปยังจุดปลาย
- Complexity: ( O(V + E) )
3. Dijkstra's Algorithm
Dijkstra's Algorithm เป็นอัลกอริธึมที่ใช้ในการหาค่าทางสั้นที่สุดจากจุดเริ่มต้น (source) ไปยังจุดปลาย (destination) ในกราฟที่มีน้ำหนักของขอบ (edge weights)
- วิธีการทำงาน:
- กำหนดค่าเริ่มต้นให้กับทุกจุดในกราฟ (ระยะทางจากจุดเริ่มต้นเป็นค่ารวมของขอบ)
- เริ่มจากจุดเริ่มต้นและคำนวณทางสั้นที่สุดไปยังจุดที่เชื่อมโยงกับจุดเริ่มต้น
- อัปเดตระยะทางไปยังจุดที่ไม่เคยเยี่ยมชม
- ทำซ้ำกระบวนการจนกว่าจะครบทุกจุด
- ประโยชน์: ดีในการหาทางสั้นที่สุดในกราฟที่มีค่าเชื่อมต่อเป็นบวก
- Complexity: ( O(V^2) ) สำหรับกราฟที่ใช้การค้นหาด้วยฟูลล์ และ ( O(V \log V + E) ) สำหรับกราฟที่ใช้ Priority Queue
4. Bellman-Ford Algorithm
Bellman-Ford Algorithm เป็นอัลกอริธึมที่ใช้สำหรับหาทางสั้นที่สุดจากจุดเริ่มต้นในกราฟที่มีน้ำหนักขอบเป็นลบ
- วิธีการทำงาน:
- เริ่มต้นที่จุดเริ่มต้นและกำหนดระยะทางเริ่มต้นให้เป็นศูนย์
- อัปเดตระยะทางจากจุดเริ่มต้นไปยังจุดอื่นๆ โดยการทำซ้ำ ( V-1 ) ครั้ง (V คือจำนวนจุดในกราฟ)
- ตรวจสอบว่ามีการปรับปรุงค่าระยะทางในรอบสุดท้ายหรือไม่ ถ้ามีหมายความว่ามีวงจรเชิงลบในกราฟ
- ประโยชน์: สามารถใช้งานได้กับกราฟที่มีขอบลบ
- Complexity: ( O(V \times E) )
5. Floyd-Warshall Algorithm
Floyd-Warshall Algorithm เป็นอัลกอริธึมที่ใช้สำหรับหาทางสั้นที่สุดระหว่างทุกคู่ของจุดในกราฟ (All-pairs shortest path)
- วิธีการทำงาน:
- เริ่มต้นจากการกำหนดระยะทางระหว่างทุกคู่ของจุดเป็นค่าสูงสุด
- ทำการอัปเดตค่าระยะทางระหว่างทุกคู่ของจุดโดยการเพิ่มจุดระหว่างกลาง
- ประโยชน์: ดีในการหาทางสั้นที่สุดระหว่างทุกคู่ของจุด
- Complexity: ( O(V^3) )
3. Minimum Spanning Tree Algorithms
การสร้าง Minimum Spanning Tree (MST) คือการค้นหาโครงสร้างของกราฟที่เชื่อมโยงทุกจุดเข้าด้วยกันด้วยค่าใช้จ่ายรวมต่ำที่สุด
1. Kruskal's Algorithm
Kruskal's Algorithm ใช้ในการหาต้นไม้ที่ครอบคลุมทั้งหมดที่มีค่าน้ำหนักต่ำที่สุด (Minimum Spanning Tree) โดยการเรียงลำดับขอบ (edges) ตามน้ำหนักและเลือกขอบที่ไม่ทำให้เกิดวงจร
- วิธีการทำงาน:
- เรียงลำดับขอบตามน้ำหนัก
- เพิ่มขอบที่เชื่อมจุดสองจุดโดยไม่ทำให้เกิดวงจร
- Complexity: ( O(E \log E) )
2. Prim's Algorithm
Prim's Algorithm เริ่มจากจุดหนึ่งและเพิ่มขอบที่มีน้ำหนักต่ำที่สุดที่เชื่อมโยงกับจุดที่ยังไม่อยู่ใน MST
- วิธีการทำงาน:
- เริ่มต้นจากจุดหนึ่ง
- เลือกขอบที่มีน้ำหนักต่ำที่สุดที่เชื่อมโยงกับจุดใน MST
- ทำซ้ำจนกระทั่งทุกจุดในกราฟรวมอยู่ใน MST
- Complexity: ( O(V^2) ) หรือ ( O(E \log V) ) ถ้าใช้ Priority Queue
4. Topological Sort
Topological Sort คือการจัดเรียงลำดับจุดในกราฟที่เป็น Directed Acyclic Graph (DAG) โดยให้จุดที่มีการเชื่อมโยงกับจุดอื่นๆ ปรากฏก่อน
- วิธีการทำงาน: ใช้ DFS หรือ Kahn's Algorithm เพื่อหาลำดับที่ถูกต้อง
- Complexity: ( O(V + E) )
สรุป
- Graph Algorithms ใช้ในการจัดการกับกราฟเพื่อค้นหาคำตอบที่มีประสิทธิภาพในปัญหาต่างๆ เช่น การค้นหาทางสั้นที่สุด, การหาต้นไม้ที่มีค่าน้ำหนักต่ำที่สุด, และการจัดเรียงลำดับจุดในกราฟ
- DFS และ BFS ใช้ในการค้นหาจุดในกราฟ
- Dijkstra และ Bellman-Ford ใช้ในการหาทางสั้นที่สุด
- Kruskal และ Prim ใช้ในการหาต้นไม้ที่มีค่าน้ำหนักต่ำที่สุด
- Floyd-Warshall ใช้ในการหาทางสั้นที่สุดระหว่างทุกคู่ของจุด