สมัครเรียนโทร. 085-350-7540 , 084-88-00-255 , ntprintf@gmail.com

Graph

Graph ใน Data Structures - Graph คืออะไร Graph ใน Data Structures - ความแตกต่างระหว่าง Directed และ Undirected Graph Graph ใน Data Structures - การเก็บข้อมูล Graph ด้วย Adjacency Matrix Graph ใน Data Structures - การเก็บข้อมูล Graph ด้วย Adjacency List Graph ใน Data Structures - Depth-First Search (DFS) คืออะไร Graph ใน Data Structures - การทำงานของ DFS ใน Graph Graph ใน Data Structures - Breadth-First Search (BFS) คืออะไร Graph ใน Data Structures - การทำงานของ BFS ใน Graph Graph ใน Data Structures - การตรวจสอบ Cycle ใน Graph Graph ใน Data Structures - การหาความสั้นที่สุดใน Graph ด้วย Dijkstra?s Algorithm Graph ใน Data Structures - การหาเส้นทางที่สั้นที่สุดใน Graph ด้วย Bellman-Ford Algorithm Graph ใน Data Structures - การทำงานของ Kruskal?s Algorithm เพื่อหา Minimum Spanning Tree Graph ใน Data Structures - การทำงานของ Prim?s Algorithm เพื่อหา Minimum Spanning Tree Graph ใน Data Structures - Topological Sorting ใน Directed Acyclic Graph (DAG) Graph ใน Data Structures - การประยุกต์ใช้งาน Graph ในการแก้ปัญหา

Graph ใน Data Structures - การตรวจสอบ Cycle ใน Graph

 

ในการศึกษาโครงสร้างข้อมูล (Data Structures) หนึ่งในหัวข้อที่ได้รับความนิยมและมีความสำคัญสูงคือ "กราฟ" (Graph) เนื่องจากกราฟเป็นโครงสร้างข้อมูลที่สามารถแทนความสัมพันธ์ระหว่างข้อมูลที่ซับซ้อนได้ เช่น การเชื่อมต่อในเครือข่ายคอมพิวเตอร์ การแสดงเส้นทางบนแผนที่ หรือแม้กระทั่งการวิเคราะห์และประมวลผลความสัมพันธ์ในสังคมออนไลน์

บทความนี้จะนำเสนอวิธีการตรวจสอบ "Cycles" หรือ "วงจร" ในกราฟอย่างละเอียด พร้อมด้วยตัวอย่างการใช้งานและโค้ดตัวอย่าง เพื่อให้นักเรียนเข้าใจหลักการทำงานและสามารถนำไปประยุกต์ใช้ได้ในงานจริง

 

1. ทำความรู้จักกับ Cycle ใน Graph

Cycle หมายถึง เส้นทางในกราฟที่เริ่มต้นจากโหนดหนึ่งและกลับมาที่โหนดเดิม โดยไม่ใช้เส้นทางเดิมซ้ำหากไม่ได้กลับมาที่จุดเริ่มต้น สําหรับกราฟที่ไม่มีทิศทาง (Undirected Graph) การมี Cycle หมายถึงการมีทางเดินที่กลับมาถึงจุดเริ่มต้นได้ สําหรับกราฟที่มีทิศทาง (Directed Graph) Cycle หมายถึงการวนกลับมาที่โหนดเดิมโดยผ่านเส้นทางที่มีทิศทาง

 

2. วิธีการตรวจสอบ Cycle ใน Undirected Graph

สำหรับการตรวจสอบการมีอยู่ของ Cycle ในกราฟที่ไม่มีทิศทาง วิธีที่นิยมใช้คือการใช้ Union-Find หรือการใช้อัลกอริทึม DFS (Depth-First Search)

 

การใช้ Union-Find

อัลกอริทึม Union-Find ทำงานโดยการจัดกลุ่มของโหนดที่เชื่อมต่อกันเป็นชุด (Sets) และเช็คว่าการเชื่อมต่อข้ามชุดจะทำให้เกิด Cycle หรือไม่

ตัวอย่างโค้ดการใช้ Union-Find:


class Graph:
    def __init__(self, vertices):
        self.V = vertices
        self.graph = []

    def add_edge(self, u, v):
        self.graph.append([u, v])

    def find(self, parent, i):
        if parent[i] == i:
            return i
        return self.find(parent, parent[i])

    def union(self, parent, rank, x, y):
        xroot = self.find(parent, x)
        yroot = self.find(parent, y)

        if rank[xroot] < rank[yroot]:
            parent[xroot] = yroot
        elif rank[xroot] > rank[yroot]:
            parent[yroot] = xroot
        else:
            parent[yroot] = xroot
            rank[xroot] += 1

    def is_cycle(self):
        parent = []
        rank = []

        for node in range(self.V):
            parent.append(node)
            rank.append(0)

        for u, v in self.graph:
            x = self.find(parent, u)
            y = self.find(parent, v)

            if x == y:
                return True
            self.union(parent, rank, x, y)
        return False

g = Graph(3)
g.add_edge(0, 1)
g.add_edge(1, 2)
g.add_edge(0, 2)

if g.is_cycle():
    print("Graph contains cycle")
else:
    print("Graph does not contain cycle")

 

3. วิธีการตรวจสอบ Cycle ใน Directed Graph

ในกราฟที่มีทิศทาง การตรวจสอบ Cycle มักจะใช้ DFS โดยการทำ Mark โหนดที่เยี่ยมชมและตรวจสอบเส้นทางที่วนกลับมาที่โหนดที่ถูก Mark แล้ว

 

การใช้ DFS


from collections import defaultdict

class Graph:
    def __init__(self, vertices):
        self.graph = defaultdict(list)
        self.V = vertices

    def add_edge(self, u, v):
        self.graph[u].append(v)

    def is_cyclic_util(self, v, visited, rec_stack):
        visited[v] = True
        rec_stack[v] = True

        # Recur for all neighbors
        for neighbour in self.graph[v]:
            if not visited[neighbour]:
                if self.is_cyclic_util(neighbour, visited, rec_stack):
                    return True
            elif rec_stack[neighbour]:
                return True

        rec_stack[v] = False
        return False

    def is_cyclic(self):
        visited = [False] * self.V
        rec_stack = [False] * self.V

        for node in range(self.V):
            if not visited[node]:
                if self.is_cyclic_util(node, visited, rec_stack):
                    return True
        return False

g = Graph(4)
g.add_edge(0, 1)
g.add_edge(1, 2)
g.add_edge(2, 3)
g.add_edge(3, 1)

if g.is_cyclic():
    print("Graph contains cycle")
else:
    print("Graph does not contain cycle")

 

4. การนำไปประยุกต์ใช้ในงานจริง

การตรวจสอบ Cycle เป็นสิ่งสำคัญในหลายบริบท เช่น การวิเคราะห์เครือข่าย การวางแผนเส้นทางของโครงสร้างพื้นฐาน และการจัดการงานในระบบคอมพิวเตอร์ที่ต้องหลีกเลี่ยงปัญหาวงจร

 

5. สรุป

การตรวจสอบ Cycle ในกราฟจำเป็นต้องเข้าใจคุณสมบัติของกราฟและเลือกใช้วิธีการที่เหมาะสมกับลักษณะของกราฟนั้นๆ การใช้ Union-Find เหมาะกับ Undirected Graph ในขณะที่การใช้ DFS เหมาะกับ Directed Graph การเรียนรู้และฝึกฝนการใช้เครื่องมือต่างๆ ใน Data Structures เช่น การตรวจสอบ Cycle จะช่วยให้นักเรียนสามารถแก้ไขปัญหาที่ซับซ้อนได้อย่างมีประสิทธิภาพ

หากคุณสนใจศึกษาเพิ่มเติมเกี่ยวกับการตรวจสอบและวิเคราะห์กราฟ รวมถึงโครงสร้างข้อมูลอื่นๆ เราขอแนะนำหลักสูตรของเราที่ Expert-Programming-Tutor ซึ่งจะช่วยให้คุณเปลี่ยนจากผู้เริ่มต้นเป็นผู้เชี่ยวชาญในด้านวิทยาการคอมพิวเตอร์และระบบสารสนเทศได้อย่างมั่นใจ!

 

 

หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง

หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/


Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android


บทความนี้อาจจะมีที่ผิด กรุณาตรวจสอบก่อนใช้

หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor

ไม่อยากอ่าน Tutorial อยากมาเรียนเลยทำอย่างไร?

สมัครเรียน ONLINE ได้ทันทีที่ https://elearn.expert-programming-tutor.com

หรือติดต่อ

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM

แผนที่ ที่ตั้งของอาคารของเรา

แผนผังการเรียนเขียนโปรแกรม

Link อื่นๆ

Allow sites to save and read cookie data.
Cookies are small pieces of data created by sites you visit. They make your online experience easier by saving browsing information. We use cookies to improve your experience on our website. By browsing this website, you agree to our use of cookies.

Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com

ติดต่อเราได้ที่

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
แผนที่ ที่ตั้งของอาคารของเรา