Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

خوارزمية كروسكال

آخر تحديث

تبني خوارزمية كروسكال شجرة تمتد صغرى (MST) - وهي أرخص مجموعة من الأضلاع تصل كل العُقد دون تكوين دورات. تُرتّب كل الأضلاع حسب الوزن، ثم تضيف بجشع الضلع الأرخص التالي طالما أنه يصل بين عُقدتين غير متصلتين بعد. اضغط تشغيل بالأعلى لمشاهدة الشجرة تنمو، ضلعًا آمنًا ورخيصًا في كل مرة.

يتم التحقق من "هل هما متصلان بالفعل؟" باستخدام بنية بيانات union-find (المجموعات المنفصلة): يُتخطى أي ضلع إذا كانت نهايتاه في المكوّن نفسه بالفعل، لأن إضافته ستكوّن دورة. يهيمن الترتيب على التكلفة، مما يعطي O(E log E) إجمالًا. تتألق كروسكال في الرسوم البيانية المتفرقة.

التعقيد الزمني والمكاني

المقياسالتعقيدملاحظات
الزمنO(E log E)يهيمن عليه ترتيب الأضلاع
عمليات union-find≈ O(E α(V))شبه ثابتة لكل تحقق مع ضغط المسار
المساحةO(V + E)قائمة الأضلاع + بنية المجموعات المنفصلة
الأنسب لـالرسوم البيانية المتفرقةتعمل من قائمة أضلاع عامة

خطوة بخطوة

الخطوةماذا يحدث
1رتّب كل ضلع حسب الوزن تصاعديًا.
2ضع كل عقدة في مكوّنها الخاص (union-find).
3خذ الضلع الأرخص التالي.
4إذا كانت نهايتاه في مكوّنين مختلفين، أضفه إلى الشجرة ووحّدهما.
5وإلا فتخطّاه (سيكوّن دورة).
6توقّف عندما تصبح للشجرة V − 1 ضلعًا.

مثال محلول

رسم بياني بالعُقد A, B, C, D والأضلاع A-B(1)، B-C(2)، A-C(3)، C-D(4)، B-D(5). الأضلاع بعد الترتيب: A-B(1)، B-C(2)، A-C(3)، C-D(4)، B-D(5):

الضلع (الوزن)المكوّنات قبلالإجراء
A-B(1){A} {B} {C} {D}مكوّنان مختلفان - أضفه إلى MST، ووحّد إلى {A,B}.
B-C(2){A,B} {C} {D}مكوّنان مختلفان - أضفه إلى MST، ووحّد إلى {A,B,C}.
A-C(3){A,B,C} {D}A وC معًا بالفعل - تخطّه (سيكوّن دورة).
C-D(4){A,B,C} {D}مكوّنان مختلفان - أضفه إلى MST، ووحّد إلى {A,B,C,D}.
توقّف{A,B,C,D}للشجرة V - 1 = 3 أضلاع. MST = A-B, B-C, C-D، الوزن الكلي 7.

متى تستخدم خوارزمية كروسكال

استخدمها عندماتجنّبها عندما
يكون الرسم البياني متفرقًا (أضلاع قليلة مقارنةً بالعُقد).يكون الرسم البياني كثيفًا - خوارزمية بريم مع كومة أسرع عادةً.
تكون الأضلاع متاحة بالفعل كقائمة عامة يمكن ترتيبها.تصل الأضلاع فقط عبر قوائم جوار يجب اجتيازها لكل عقدة.
تريد تنفيذًا بسيطًا مدعومًا بـ union-find.تحتاج أن تنمو الشجرة من عقدة بداية محددة.
تريد بناء غابة تمتد لرسم بياني غير متصل.يجب أن تعالج أضلاعًا تصل تدفقيًا دون ترتيب كامل.

كود Kruskal's Algorithm

تنفيذ نظيف وقابل للتشغيل لخوارزمية Kruskal's Algorithm بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Kruskal's Algorithm بلغة Python

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
شغّل هذا الكود في ساحة تجربة Python

الأسئلة الشائعة حول خوارزمية كروسكال

ما هي شجرة التمدد الصغرى؟
شجرة التمدد الصغرى (MST) لرسم بياني موزون ومتصل هي مجموعة جزئية من الأضلاع تصل كل العُقد دون دورات وبأقل وزن كلي ممكن. لها بالضبط V - 1 ضلعًا لعدد V من العُقد.
ما الفرق بين خوارزمية كروسكال وخوارزمية بريم؟
كلتاهما تبنيان شجرة تمتد صغرى بجشع. تُرتّب كروسكال كل الأضلاع عالميًا وتضيف الأرخص الذي لا يكوّن دورة، مستخدمةً union-find. أما بريم فتُنمّي شجرة واحدة نحو الخارج من عقدة بداية، مضيفةً دائمًا الضلع الأرخص الذي يغادر الشجرة. تناسب كروسكال الرسوم المتفرقة؛ وتناسب بريم (مع كومة) الرسوم الكثيفة.
لماذا تستخدم خوارزمية كروسكال بنية union-find؟
قبل إضافة ضلع، يجب على كروسكال التحقق مما إذا كانت نهايتاه متصلتين بالفعل - إذ إن إضافة مثل هذا الضلع ستكوّن دورة. تُجيب union-find (المجموعات المنفصلة) عن سؤال "هل هما في المكوّن نفسه؟" وتدمج المكوّنات في زمن مُستهلَك شبه ثابت، مما يبقي الخوارزمية فعّالة.
متى ينبغي أن أستخدم خوارزمية كروسكال بدلًا من بريم؟
فضّل كروسكال عندما يكون الرسم البياني متفرقًا ولديك بالفعل كل الأضلاع كقائمة يمكن ترتيبها - فالترتيب O(E log E) رخيص عندما يكون E صغيرًا. تميل خوارزمية بريم بكومة ثنائية أو كومة فيبوناتشي إلى التفوق في الرسوم الكثيفة حيث يقترب E من ، لأنها تتجنّب ترتيب كل الأضلاع مسبقًا.
هل تعمل خوارزمية كروسكال على الرسوم البيانية غير المتصلة؟
نعم. إذا كان الرسم البياني غير متصل، فلن تستطيع كروسكال ببساطة الوصول إلى V - 1 ضلعًا، وتنتج بدلًا من ذلك غابة تمتد صغرى - شجرة MST لكل مكوّن متصل. يحدث هذا بشكل طبيعي لأن union-find لا تدمج أبدًا عُقدًا لا يوجد مسار بينها.
ما أكثر خطأ شائع عند تنفيذ خوارزمية كروسكال؟
إغفال ضغط المسار والدمج حسب الرتبة في union-find، مما يُهبط كل فحص اتصال من شبه ثابت إلى شبه خطي وقد يهيمن على زمن التنفيذ. خطأ آخر متكرر هو نسيان دمج المكوّنين فعليًا بعد إضافة ضلع، مما يتيح للأضلاع اللاحقة تكوين دورات.
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن