الگوریتم کروسکال چیست؟ – توضیح کراسکال به زبان ساده با مثال و کد

۲۵۶ بازدید
آخرین به‌روزرسانی: ۲۹ اردیبهشت ۱۴۰۳
زمان مطالعه: ۱۳ دقیقه
الگوریتم کروسکال چیست؟ – توضیح کراسکال به زبان ساده با مثال و کد

الگوریتم کروسکال یکی از الگوریتم های حریصانه در نظریه گراف‌ها و ریاضیات گسسته است که برای پیدا کردن مقدار کمینه درخت پوشا از گراف داده شده همبند، وزن‌دار و بدون جهت استفاده می‌شود. درخت پوشا زیرگرافی از گراف G(V,E) است. درخت پوشا تمام رئوس گراف داده شده را پوشش می‌دهد با این شرط که مجموع وزن یال‌های درخت در کمترین حالت ممکن باشد. در موردی که گراف داده شده همبند نباشد با به‌کار بردن الگوریتم کروسکال می‌توان MST هر جزء همبند را پیدا کرد. میزان پیچیدگی زمانی الگوریتم کروسکال برابر با O(E∗log(E)) و پیچیدگی فضایی این الگوریتم O(E) است.

997696

در این مطلب از مجله فرادرس درباره الگوریتم کروسکال بحث کرده‌ایم. اینکه این الگوریتم چیست، چطور کار می‌کند و چگونه می‌توان این الگوریتم را پیاده‌سازی کرد. برای هر کدام مثال‌های تصویری یا کدنویسی شده آورده‌ایم و در نهایت بعضی از مهم‌ترین کاربرد‌های الگوریتم کروسکال را به صورت مختصر و شفاف توضیح داده‌ایم.

الگوریتم کروسکال چیست؟

فرض کنید در منطقه شهرستانی چند روستا وجود دارند. به عنوان شهردار کل منطقه، تصمیم به بازدید از تمام روستاها گرفته‌ایم. اما برای این کار زمان خیلی کمی در اختیار داریم. بنابراین می‌خواهیم همه روستاها را طوری بازدید کنیم که مسیر طی شده کمترین زمان ممکن شود.

در صورت تلاش برای فرمول‌نویسی مسئله مطرح شده بالا در مبحث نظریه گراف‌ها فرمول مورد نظر را باید با توجه به موارد زیر پیاده‌سازی کنیم.

  • در نظر گرفتن روستاها به عنوان رئوس گراف
  • جاده‌های بین روستاها به عنوان یال‌های گراف
  • و مسافت هر جاده به عنوان وزن یال مربوطه

در چنین مواردی الگوریتم کروسکال به کمک حل مسئله می‌آید. به‌طور کل الگوریتم کروسکال برای پیدا کردن « مقدار کمینه درخت پوشا» (Minimum Spanning Tree | MST) در گراف‌های همبند وزن‌دار غیر جهت‌دار به‌کار می‌رود. قبل از بحث درباره جزئیات بیشتر الگوریتم کروسکال باید اول معنی مقدار کمینه درخت پوشا را در گراف درک کنیم.

برای مثال تصویر داده شده در پایین، گراف G را با شش راس و نُه یال نشان می‌دهد.

گرافی با ۶ گره و ۹ یال

این گراف می‌تواند چندین درخت پوشا داشته باشد. بعضی از این درخت‌ها در تصاویر زیر همراه با هزینه مربوط به هر کدام نمایش داده شده‌اند.

«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»

اما از آنجا که حداقل یک درخت پوشا با اندازه‌ مجموع وزن‌های کمتر وجود دارد، هیچ کدام از این درخت‌های پوشا درخت پوشای کمینه نیستند. درخت پوشای کمینه یا MST گراف بالا در تصویر زیر نمایش داده شده است.

گراف پوشا

وزن MST گراف داده شده برابر با ۱۷ است. به این معنا که نمی‌توانیم هیچ درخت پوشایی بر روی گراف G با وزن کمتر از ۱۷ پیدا کنیم.

روش های تسلط بر طراحی الگوریتم با فرادرس

الگوریتم کروسکال یکی از الگوریتم‌هایی است که برای حل مسائل مربوط به گراف‌ها طراحی شده است. دنیای کامپیوتر پر است از این الگوریتم‌ها و می‌توان گفت حرفه‌ای‌ترین برنامه‌نویسان کسانی هستند که توانایی طراحی الگوریتم‌ها را دارند. طراحی الگوریتم یکی از رشته‌های تخصصی علوم کامپیوتر است. روش‌های مختلفی برای آموزش طراحی الگوریتم وجود دارد، یکی از روش‌های خوب استفاده از کلاس‌ها و دوره‌های آموزشی است. باید توجه کنیم که فیلم‌های آموزشی نسبت به کلاس‌ها از مزیت‌های بیشتری برخوردار هستند. فرادرس نیز به عنوان یکی از بزرگترین تولید کنندگان محتوا آموزشی فارسی، فیلم‌های بسیار خوبی در زمینه طراحی الگوریتم ارائه داده است.

در ادامه، چند مورد از مزیت‌های فیلم‌های آموزشی را نسبت به کلاس‌های حضوری فهرست کرده‌ایم.

  • مشکل اول این است که موسسات خیلی کمی برای آموزش طراحی الگوریتم وجود دارند.
  • در صورت پیدا کردن چنین موسسه‌ای هزینه مالی زیادتری نسبت به فیلم‌های آموزشی باید متقبل شد.
  • چنین کلاس‌هایی دارای زمان‌بندی مشخصی هستند که معمولا دانشجو مجبور به تنظیم زمان خود با موسسه است زیرا زمان کلاس با دانشجو تنظیم نمی‌شود.
  • کیفیت آموزشی این کلاس‌ها را به‌جز از طریق کسب تجربه نمی‌توان سنجید.
مجموعه آموزش طراحی الگوریتم

به این منظور و برای راهنمایی شما همراهان عزیز، فرادرس فیلم‌های آموزشی زیادی را به‌صورت اختصاصی در این باره تولید و منتشر کرده است که در ادامه چند مورد از آن‌ها را معرفی کرده‌ایم.

پیاده سازی الگوریتم کروسکال

ایده اصلی الگوریتم کروسکال برای پیداکردن درخت پوشای کمینه یا MST گراف G با V راس و E یال در دو نکته کلی خلاصه شده که در ادامه فهرست کرده‌ایم.

  • باید همه یال‌ها را به ترتیب صعودی مطابق بر وزنشان منظم بچینیم.
  • سپس اولین دسته یال‌ها به اندازه V−1 را انتخاب می‌کنیم، با این شرط که حلقه‌ای توسط یال‌های انتخاب شده تشکیل نشود.

برای یادگیری روش تقسیم و حل در طراحی الگوریتم می‌توانید از فیلم آموزش روش تقسیم و حل همراه با مرور و تست کنکور کارشناسی ارشد در فرادرس که در ادامه به صورت لینک آمده استفاده کنید.

باید به این نکته توجه کرد که برای هر گراف با V راس، برای تشکیل MST فقط به V-1 یال نیاز داریم. زیرا برای اتصال همه راس‌ها به هم V-1 یال کافی است.

چند مهندس در حال کر درون شرکت هستند - الگوریتم کروسکال

در بخش‌های بعد با مطالعه بیشتر الگوریتم و دیدن مثال‌ها روش کار دقیق الگوریتم کروسکال را درک خواهیم کرد.

مراحل فرایند اجرای الگوریتم

برای هر گراف G=(V,E) پیدا کردن MST با استفاده از الگوریتم کروسکال شامل مراحل زیر می‌شود.

  1. همه یال‌های گراف را بر اساس وزنشان به صورت صعودی مرتب می‌کنیم.
  2. یال با کمترین وزن را پیدا می‌کنیم. اگر اضافه کردن این یال به درخت پوشای جواب باعث ایجاد حلقه شود، این یال را از داخل جواب‌ها حذف می‌کنیم. در غیر این صورت، یال پیدا شده را به جواب اضافه می‌کنیم.
  3. قدم بالایی را تا زمان رسیدن به تعداد V1 یال ادامه می‌دهیم.

مثالی از الگوریتم کروسکال

در این سوال فرضی می‌خواهیم MST گراف را پیدا کنیم. شکل نمایش داده شده در تصویر زیر مر بوط به گراف پایه، همبند، وزن‌دار و غیرجهت‌داری است که از ۶ راس و ۹ یال تشکیل شده.

گرافی با ۶ گره و ۹ یال - الگوریتم کروسکال

اکنون مطابق الگوریتم توصیف شده در بالا، برای پیدا کردن درخت پوشای کمینه این گراف باید مراحل زیر را طی کنیم.

  1. همه یال‌ها را بر طبق وزن‌های مربوط به هر کدام با نظم صعودی در جدولی به صورت مرتب قرار می‌دهیم.
  2. سپس اولین یال‌ از دسته یال‌ها به اندازه V−1=5 را انتخاب می‌کنیم. دسته‌های انتخاب شده نباید شامل شکل حلقه شوند.
  • مرحله اول: مرتب کردن یال‌ها با نظم صعودی. در جدول زیر می‌توانیم فهرست یال‌ها را بعد از مرتب کردن مشاهده کنیم.
وزنVUشماره یال
2541
2642
3433
3324
4535
5656
6527
7218
8319
  • مرحله دوم: ۵ یال را از محل شروع جدول انتخاب می‌کنیم. البته به شرطی که این یال‌ها با هم حلقه تشکیل ندهند.
    • یال 45 را بررسی می‌کنیم. این اولین یال است. از آنجا که یال تنها نمی‌تواند حلقه‌ای تشکیل دهد پس این یال را به گراف جواب اضافه می‌کنیم.
گراف ساده
    • سپس یال‌های 3
گراف پوشا بدون حلقه
    • این بار یال 23 را بررسی می‌کنیم. این بار هم
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»
    • این بار نوبت به بررسی یال 3
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»
    • این دفعه یال 56 را بررسی می‌کنیم. اضافه کردن این یال هم به جواب باعث ایجاد حلقه در گراف جواب می‌شود. بنابراین این یال را نیز به گراف جواب اضافه نمی‌کنیم.
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»
    • الان نوبت بررسی یال 25 است. اضافه کردن این یال نیز به گراف جواب باعث تشکیل حلقه 23452 می‌شود. بنابراین این یال را نیز به گراف جواب اضافه نمی‌کنیم.
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»
    • در نهایت هم یال 12 را بررسی می‌کنیم. از آنجا که اضافه کردن این یال به گراف جواب باعث تشکیل حلقه نمی‌شود، بنابراین این یال را هم به جواب اضافه می‌کنیم. با اضافه کردن این یال، در کل ۵ یال را به گراف جواب اضافه کرده‌ایم. در نتیجه الان گراف جواب بدست آمده مطابق با درخت پوشای کمینه این گراف است.

گراف MST بعد از اضافه کردن هر ۵ یال پیدا شده به شکل زیر می‌شود.

گراف پوشای کمینه

در نهایت وزن MST را نیز می‌توان به سادگی با فرمول 7+3+3+2+2=17  بدست آورد.

مثال های کدنویسی شده الگوریتم کروسکال

در این بخش می‌خواهیم الگوریتم کروسال را با کمک کدنویسی پیاده‌سازی کنیم. برای انجام این‌کار بهترین روش در ابتدا پیاده‌سازی «شبه کد» (Pseudocode) این الگوریتم است.

توجه کنید که در زبان های برنامه نویسی مختلف سینتکس‌ها و ابزار متفاوتی برای کدنویسی موجود است، اما شبه‌کد، سینتکس جامع و خوانایی دارد. بنابراین همیشه بهتر است که در ابتدا شبه‌کد را پیاده‌سازی و درک کنیم و سپس از روی آن به پیاده‌سازی الگوریتم‌های خود بپردازیم.

1MST_Kruskal(Edges, V, E):
2    e=0, i=0
3    sum=0
4    Sort(Edges)
5    while(e<V-1):
6        u=Edges[i].u
7        v=Edges[i].v
8        if(Adding edge {u, v} do not form cycle):
9            Print(Adding edge {u, v} to MST)
10            sum+=Edges[i].weight
11            e+=1
12        i+=1

کد نمایش داده شده بالا پیاده‌سازی شبه‌کد الگوریتم کروسکال است. از روی شبه‌کد بالا می‌توان این الگوریتم را به زبان‌های مختلف پیاده‌سازی کرد.

مثال های کد نویسی شده با زبان های برنامه نویسی

برای بررسی موثرتر این مطلب که آیا شامل شدن یالی به جواب، باعث تشکیل حلقه می‌شود یا نه، از مفهومی به نام «مجموعه‌های مجزا» (Disjoint-Sets) استفاده خواهیم کرد. برای کدنویسی باید مطابق شبه‌کد و الگوریتم توصیف شده در بالا به پیش برویم. در وهله اول فهرست مرتبی از یال‌ها را به صورت صعودی ایجاد می‌کنیم. سپس V−1 یال را به جواب اضافه می‌کنیم. البته توجه داریم که این یال‌ها نباید در کنار یکدیگر حلقه تشکیل بدهند. قبل از اینکه یالی را به MST اضافه کنیم، از تابع find از DSU را برای بررسی تعلق یا عدم تعلق گره‌های هر دو سر یال به مجموعه یکسان استفاده می‌کنیم.

دو عدد مانیتور و یک کیس نورپردازی شده بر روی میز آماده به کار هستند

اگر راس‌های دوسر یال به مجموعه یکسانی تعلق نداشتند، آن وقت آن یال را به MST اضافه می‌کنیم. زیرا اضافه کردن این یال به گراف جواب MST باعث ایجاد حلقه نمی‌شود. اکنون از تابع «اتحاد» (Union) DSU برای ادغام دو مجموعه مجزا استفاده خواهیم کرد. در ادامه قبل از پرداختن به کدنویسی این الگوریتم، طرح اولیه آن را مشاهده می‌کنیم.

متغیرها

  • V: متغیری سراسری که تعداد رأس‌های گراف را نمایش می‌دهد.
  • E: متغیر سراسری دیگری که تعداد یال‌های درون گراف را محاسبه کرده و نشان می‌دهد.
  • یال‌ها: لیستی از یال‌ها که بر اساس وزنشان به صورت صعودی مرتب شده است و در الگوریتم کروسکال استفاده می‌شود.

روش

  • MST_Kruskal: تابعی که مسئول پیدا کردن MST در گراف داده شده است. این تابع طبق مطالب مطرح شده درباره الگوریتم در شبه‌کد بالا پیاده‌سازی شده است.

در صورتی که به پیاده‌سازی الگوریتم‌ها به زبان برنامه‌نویسی و مبحث گراف‌ها علاقه‌مند هستید، پیشنهاد می‌کنیم مطلب برنامه تشخیص وجود دور در گراف جهت دار همراه با راهنمای کاربردی را از مجله فرادرس مطالعه کنید. در این برنامه برای تشخیص وجود دور در گراف، الگوریتم طراحی شده‌ای را معرفی کرده‌ایم. سپس این الگوریتم را به سه زبان برنامه نویسی پایتون، جاوا و ++C کدنویسی کردیم.

پیاده سازی الگوریتم کروسکال با زبان های C و ++C

در این بخش، برنامه کدنویسی شده‌ای با زبان‌های C و ++C از روی طرح اولیه و الگوریتم کروسکال توصیف شده در بالا را مشاهده می‌کنید.

1#include<bits/stdc++.h>
2using namespace std;
3// Using DSU to quickly
4// tell whether adding edge 
5// will form a cycle.
6class DSU{
7     
8    // Declaring two arrays to hold
9    // information about parent and 
10    // rank of each node. 
11    int *parent;
12    int *rank;
13public:
14    // Constructor
15    DSU(int n){
16        
17        // Defining size of the arrays.
18        parent=new int[n];
19        rank=new int[n];
20        
21        // Initializing their values 
22        // by is and 0s.
23        for(int i=0;i<n;i++)
24        {
25            parent[i]=i;
26            rank[i]=0;
27        }
28    }
29    
30    // Find function
31    int find(int node){
32        
33        // If the node is the parent of 
34        // itself then it is the leader 
35        // of the tree. 
36        if(node==parent[node]) return node;
37        
38        //Else, finding parent and also 
39        // compressing the paths.
40        return parent[node]=find(parent[node]);
41    }
42    
43    // Union function 
44     void Union(int u,int v){
45        
46        // Make u as a leader 
47        // of its tree.
48        u=find(u);
49        
50        // Make v as a leader 
51        // of its tree.
52        v=find(v);
53        
54        // If u and v are not equal,
55        // because if they are equal then
56        // it means they are already in 
57        // same tree and it does not make 
58        // sense to perform union operation.
59        if(u!=v)
60        {
61            // Checking tree with 
62            // smaller depth/height.
63            if(rank[u]<rank[v])
64            {
65                int temp=u;
66                u=v;
67                v=temp;
68            }
69            // Attaching lower rank tree
70            // to the higher one. 
71            parent[v]=u;
72            
73            // If now ranks are equal
74            // increasing rank of u. 
75            if(rank[u]==rank[v])
76                rank[u]++;
77        }
78    }
79};
80// Edge class
81class Edge{
82public:
83    // Endpoints and weight of the edge.
84    int u,v,weight;
85    // Constructor
86    Edge(int U,int V,int Weight){
87        u=U;
88        v=V;
89        weight=Weight;
90    }
91};
92class Graph{
93public:
94    // Number of Vertices and Edges
95    int V, E;
96    // List of Edge(s).
97    vector<Edge> edges;
98    // Constructor of Graph class
99    Graph(int v,int e){
100        V=v;
101        E=e;
102        // // Initializing list of edges.
103        // edges=new ArrayList<>();
104    }
105    // comparator to compare two edges 
106    // based on their edges. 
107    static bool comparator(Edge e1, Edge e2)
108    {
109        return e1.weight < e2.weight;
110    }
111    // Function responsible to print MST.
112    void MST_Kruskal(){
113        // Initializing e, i, and sum with 0.
114        int e=0,i=0,sum=0;
115        // Creating an object of DSU class. 
116        DSU dsu(V);
117        // Sorting edges using a custom comparator
118        sort(edges.begin(), edges.end(), comparator);
119        
120        // Iterating till we include V-1 edges in MST
121        while(e<V-1)
122        {
123            Edge edge=edges[i++];
124            
125            int u=dsu.find(edge.u);
126            int v=dsu.find(edge.v);
127            // Checking if adding edge with endpoints
128            // u and v form a cycle.
129            // If not
130            if(u!=v)
131            {
132                cout<<"Adding edge "<<edge.u<<" <---> "<<edge.v<<" to MST\n";
133                // Adding the weight of current edge to total
134                // weight of the MST.
135                sum+=edge.weight;
136                // Including the edge.
137                dsu.Union(u,v);
138                // Increasing the edge count.
139                e++;
140            }
141        }
142        // Printing the total sum of the MST.
143        cout<<"MST has a weight of "<<sum;
144    }
145    // Function to add edges.
146    void addEdge(int u,int v,int weight){
147        edges.push_back(Edge(u,v,weight));
148    }
149};
150int main(){
151    // Creating an object of Graph type.
152    Graph g(6,9);
153    
154    // Adding 9 edges to make the same
155    // graph as given in examples.
156    g.addEdge(0,1,7);
157    g.addEdge(0,2,8);
158    g.addEdge(1,2,3);
159    g.addEdge(1,4,6);
160    g.addEdge(2,3,3);
161    g.addEdge(2,4,4);
162    g.addEdge(3,4,2);
163    g.addEdge(3,5,2);
164    g.addEdge(4,5,2);
165    
166    // Calling the MST_Kruskal Function.
167    g.MST_Kruskal();
168    return 0;
169}

پیاده سازی الگوریتم کروسکال با زبان Java

در این بخش، برنامه کدنویسی شده‌ای به زبان جاوا، از روی طرح اولیه و الگوریتم کروسکال توصیف شده در مطلب را مشاهده می‌کنید.

1import java.util.*;
2public class Graph{
3    // Using DSU to quickly
4    // tell whether adding edge 
5    // will form a cycle.
6    static class DSU{
7         
8        // Declaring two arrays to hold
9        // information about the parent and 
10        // rank of each node. 
11        private int parent[];
12        private int rank[];
13        
14        // Constructor
15        DSU(int n){
16            
17            // Defining size of the arrays.
18            parent=new int[n];
19            rank=new int[n];
20            
21            // Initializing their values 
22            // with i's and 0s.
23            for(int i=0;i<n;i++)
24            {
25                parent[i]=i;
26                rank[i]=0;
27            }
28        }
29        
30        // Find function
31        public int find(int node){
32            
33            // If the node is the parent of 
34            // itself then it is the leader 
35            // of the tree. 
36            if(node==parent[node]) return node;
37            
38            //Else, finding parent and also 
39            // compressing the paths.
40            return parent[node]=find(parent[node]);
41        }
42        
43        // Union function 
44        public void union(int u,int v){
45            
46            // Make u as a leader 
47            // of its tree.
48            u=find(u);
49            
50            // Make v as a leader 
51            // of its tree.
52            v=find(v);
53            
54            // If u and v are not equal,
55            // because if they are equal then
56            // it means they are already in 
57            // same tree and it does not make 
58            // sense to perform union operation.
59            if(u!=v)
60            {
61                // Checking tree with 
62                // smaller depth/height.
63                if(rank[u]<rank[v])
64                {
65                    int temp=u;
66                    u=v;
67                    v=temp;
68                }
69                // Attaching lower rank tree
70                // to the higher one. 
71                parent[v]=u;
72                
73                // If now ranks are equal
74                // increasing rank of u. 
75                if(rank[u]==rank[v])
76                    rank[u]++;
77            }
78        }
79    }
80    // Edge class
81    static class Edge{
82        // Endpoints and weight of the edge.
83        int u,v,weight;
84        // Constructor
85        Edge(int u,int v,int weight){
86            this.u=u;
87            this.v=v;
88            this.weight=weight;
89        }
90    }
91    // Number of Vertices and Edges
92    static int V, E;
93    // List of Edge(s).
94    static List<Edge> edges;
95    // Constructor of Graph class
96    Graph(int V,int E){
97        this.V=V;
98        this.E=E;
99        // Initializing list of edges.
100        edges=new ArrayList<>();
101    }
102    
103    // Function responsible to print MST.
104    static void MST_Kruskal(){
105        // Initializing e, i and sum with 0.
106        int e=0,i=0,sum=0;
107        // Creating an object of DSU class. 
108        DSU dsu=new DSU(V);
109        // Sorting edges using a custom comparator
110        Collections.sort(edges,
111            new Comparator<Edge>(){
112                public int compare(Edge e1,Edge e2){
113                    return e1.weight-e2.weight;
114                }
115            }
116        );
117        
118        // Iterating till we include V-1 edges in MST
119        while(e<V-1)
120        {
121            Edge edge=edges.get(i++);
122            
123            int u=dsu.find(edge.u);
124            int v=dsu.find(edge.v);
125            // Checking if adding edge with endpoints
126            // u and v form a cycle.
127            // If not
128            if(u!=v)
129            {
130                System.out.println("Adding edge "+ edge.u +" <---> "+ edge.v +" to MST");
131                // Adding the weight of current edge to total
132                // weight of the MST.
133                sum+=edge.weight;
134                // Including the edge.
135                dsu.union(u,v);
136                // Increasing the edge count.
137                e++;
138            }
139        }
140        // Printing the total sum of the MST.
141        System.out.println("MST has a weight of "+sum);
142    }
143    // Function to add edges.
144    static void addEdge(int u,int v,int weight){
145        edges.add(new Edge(u,v,weight));
146    }
147    public static void main(String args[]){
148        // Creating an object of Graph type.
149        Graph g=new Graph(6,9);
150        
151        // Adding 9 edges to make the same
152        // graph as given in examples.
153        g.addEdge(0,1,7);
154        g.addEdge(0,2,8);
155        g.addEdge(1,2,3);
156        g.addEdge(1,4,6);
157        g.addEdge(2,3,3);
158        g.addEdge(2,4,4);
159        g.addEdge(3,4,2);
160        g.addEdge(3,5,2);
161        g.addEdge(4,5,2);
162        
163        // Calling the MST_Kruskal Function.
164        g.MST_Kruskal();
165    }
166}

تجزیه و تحلیل پیچیدگی زمانی و فضایی الگوریتم کروسکال

در این قسمت از مطلب، پیچیدگی‌های این الگوریتم را به صورت کلی فرمول نویسی کرده‌ایم. «پیچیدگی زمانی» (Time Complexity) الگوریتم کروسکال را می‌توان با نکات زیر توصیف کرد.

  • هزینه زمانی مرتب کردن E عدد یال برابر با O(E∗log(E)) است.
  • برای هر یال، از الگوریتم Union-Find استفاده می‌کنیم که هزینه زمانی معادل O(E∗α(V)) بر عهده سیستم گذاشته می‌شود.
  • در مقادیر عملی V، مقدار V1080V\leq10^{80} است. از آنجا که O(𝛼(𝑉)) عبارت O(E∗α(V)) را می‌توان به صورت O(E) نیز نوشت.

بنابراین کل پیچیدگی زمانی این الگوریتم برابر با  

پیچیدگی فضایی این الگوریتم هم به این صورت است که چون از لیست یا برداری برای ذخیره E تعداد یال گراف داده شده استفاده می‌کنیم. پیچیدگی فضایی برابر با O(E) است.

فیلم های کمک درسی در رابطه با طراحی الگوریتم

طراحی الگوریتم یکی از دروس اصلی رشته‌های مربوط به علوم کامپیوتر در دانشگاه‌ها است. این قسمت از مطلب به‌طور خاص مناسب دانشجویانی ارائه شده که نه تنها می‌خواهند بدانند که طراحی الگوریتم چیست بلکه باید برای آزمون‌های دانشگاهی و کنکور ارشد نیز آماده شوند. وب‌سایت آموزشی فرادرس فیلم‌های بسیار خوبی درباره الگوریتم با استفاده از اساتید حرفه‌ای و تجزیه و تحلیل سوالات کنکور سال‌های متمادی تهیه کرده است.

مجموعه آموزش طراحی الگوریتم

در این بخش چند مورد از این فیلم‌های آموزشی را معرفی می‌کنیم. این فیلم‌ها هم برای دانشجویان و برنامه‌نویسان و هم برای سایر افرادی که می‌خواهند با مبحث طراحی الگوریتم تا حد بسیار خوبی آشنا شوند مفید است.

کاربردهای الگوریتم کروسکال

MST-هایی که توسط الگوریتم کروسکال پیدا می‌شوند کاربردهای فهرست شده در پایین را دارند.

  • در طراحی شبکه، پیدا کردن MST حداقل مقدار سیم مورد نیاز را برای اتصال همه گره‌ها یا سرورهای شبکه، مشخص می‌کند.
  • با استفاده از MST می توان مسئله فروشنده دوره‌گرد را نیز با تخمین بسیار خوبی حل کرد. این مسئله کارایی و عملکرد بسیار خوب مقدار کمینه درخت پوشا را برای حل چالش‌های بهینه‌سازی پیچیده نشان می‌دهد.
یک گراف بسیار پیچیده با گره‌ها و یال‌های رنگی - الگوریتم کروسکال
  • MST برای پیکربندی پروتکل‌های Ethernet Bridging نیز استفاده می‌شود. استفاده از این درخت‌های پوشا از تشکیل حلقه در شبکه‌ها جلوگیری می‌کند.
  • تمام سایر مسائل گراف دیگری که در آن‌ها باید تمام راس‌ها را با حداقل هزینه بازدید کنیم نیز با استفاده از MST قابل حل است.

جمع بندی

در این مطلب از مجله فرادرس معنی عبارت درخت پوشا در گراف‌ها همراه با درخت پوشای کمینه را با کمک مثال‌های مختلف فهمیدیم. متوجه شدیم که الگوریتم کروسکال، از نوع الگوریتم‌های حریصانه برای پیدا کردن درخت کمینه پوشا است. این الگوریتم بر روی هر گراف وزن‌دار و غیرجهت‌دار همبندی کار می‌کند. همچنین آموختیم که چگونه MST گراف را با استفاده از الگوریتم کروسکال پیدا کنیم. در نهایت، پیچیدگی‌های زمانی و فضای این الگوریتم را بررسی کردیم و با چند مورد از کاربردهای مهم این الگوریتم آشنا شدیم.

الگوریتم کروسکال یکی از مفاهیم مهم در نظریه گراف‌ها و ریاضیات گسسته ‌است که همین‌طور که دیدیم، می‌تواند بسیار از مسائل مربوط به شبکه را حل کند. شناخت و پیاده‌سازی و کارکردن با این الگوریتم تاثیر بسیاری در مهارت کدنویسی و حل مسئله برنامه‌نویسان دارد.

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
SCALERsimplilearn
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *