تخطَّ إلى المحتوى

Prim's Algorithm

خوارزمية Prim Prim's Algorithm

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

بعكس Kruskal التي ترتّب كل الأضلاع دفعة واحدة، Prim تنمو محليًا: تبدأ من عقدة عشوائية، وباستخدام طابور أولوية (كومة) تختار بكل خطوة أرخص ضلع 'يعبر' من داخل الشجرة الحالية لعقدة خارجها — أسلوب يُذكّرك بـ Dijkstra، لكن المعيار هنا هو وزن الضلع نفسه لا مجموع المسار.

الصياغة

import heapq
visited = {start}
pq = [(w, start, v) for v, w in graph[start]]
heapq.heapify(pq)
while pq:
    weight, u, v = heapq.heappop(pq)
    if v in visited:
        continue
    visited.add(v)
    mst_weight += weight
    for neighbor, w in graph[v]:
        if neighbor not in visited:
            heapq.heappush(pq, (w, v, neighbor))

📄 مثال

import heapq

def prim(graph, start):
    visited = {start}
    pq = [(w, start, v) for v, w in graph[start]]
    heapq.heapify(pq)
    mst_weight = 0
    mst_edges = []
    while pq and len(visited) < len(graph):
        weight, u, v = heapq.heappop(pq)
        if v in visited:
            continue
        visited.add(v)
        mst_weight += weight
        mst_edges.append((u, v, weight))
        for neighbor, w in graph[v]:
            if neighbor not in visited:
                heapq.heappush(pq, (w, v, neighbor))
    return mst_weight, mst_edges

graph = {"A": [("B", 6), ("C", 2)], "B": [("A", 6), ("D", 3)], "C": [("A", 2), ("D", 1)], "D": [("B", 3), ("C", 1)]}
print(prim(graph, "A"))

أهم النقاط

النقطةالوظيفة
التعقيد الزمنيO(E log V) بطابور أولوية (كومة ثنائية)، أو O(V²) بمصفوفة جوار لرسوم كثيفة
الأنسب لـرسوم بيانية كثيفة (عدد أضلاع كبير نسبيًا لعدد العقد)
الهيكل المساعدطابور أولوية (Priority Queue / Min-Heap)

💡 نصائح عملية

  • لرسم بياني كثيف جدًا (قريب من كامل)، تطبيق Prim بمصفوفة جوار بسيطة O(V²) قد يكون أسرع عمليًا من نسخة الكومة رغم التعقيد النظري الأعلى للرمز البسيط

⚠️ أخطاء شائعة

  • الخلط بينها وبين Dijkstra لتشابه الكود — Prim تقارن وزن الضلع المباشر فقط، بينما Dijkstra تقارن مجموع المسار الكلي من المصدر

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.