Menu
Coddy logo textTech

Prim Algoritması

Son güncelleme

Prim algoritması, minimum kapsayan ağacı (MST) - tüm düğümleri döngü olmadan bağlayan en ucuz kenar kümesini - bir başlangıç düğümünden dışa doğru tek bir ağaç büyüterek oluşturur. Her adımda ağaçtan ağacın dışındaki bir düğüme geçen tüm kenarlara bakar ve en ucuzunu ekler. Ağacın genişlemesini izlemek için yukarıdan oynat'a basın; her zaman yeni bir düğüme ulaşan en düşük ağırlıklı kenarı alır.

Her zaman minimum geçiş kenarını seçtiği için her ekleme güvenlidir (bir MST'nin parçası olması garantidir). Her dıştaki düğüme giden en ucuz kenara göre anahtarlanmış ikili yığın öncelik kuyruğu ile Prim O(E log V) sürede çalışır. Tek bir bağlı ağaç büyütmek yerine tüm kenarları küresel olarak sıralayan Kruskal ile zıtlık oluşturur.

Zaman ve alan karmaşıklığı

UygulamaKarmaşıklıkNotlar
İkili yığınO(E log V)Geçiş kenarlarının öncelik kuyruğu
Komşuluk matrisiO(V²)Daha basit; yoğun grafikler için iyi
AlanO(V + E)Ağaç üyeliği + öncelik kuyruğu
En uygunYoğun grafiklerTek bir başlangıç düğümünden büyür

Adım adım

AdımNe olur
1Ağacı herhangi bir tek düğümle başlatın.
2Ağaçtan ağacın dışındaki bir düğüme geçen tüm kenarlara bakın.
3En küçük ağırlığa sahip geçiş kenarını seçin.
4O kenarı ve yeni düğümünü ağaca ekleyin.
5Tüm düğümler ağaçta olana kadar tekrarlayın.

Çözümlü örnek

A-B=1, A-C=3, B-C=2, B-D=4, C-D=5 kenarlarına sahip 4 düğümlü bir grafiğin MST'sini A'dan başlayarak oluşturma:

AdımAğaçGeçiş kenarlarıSeçilen kenar
1{A}A-B=1, A-C=3A-B (ağırlık 1)
2{A, B}A-C=3, B-C=2, B-D=4B-C (ağırlık 2)
3{A, B, C}B-D=4, C-D=5B-D (ağırlık 4)
4{A, B, C, D}yok - tüm düğümler ağaçtatamamlandı: MST ağırlığı 1+2+4 = 7

Prim algoritması ne zaman kullanılır

Şu durumda kullanınŞu durumda kaçının
Bağlı, yönsüz ve ağırlıklı bir grafiğin minimum kapsayan ağacına ihtiyacınız var.Grafik yönlü veya en kısa yollara ihtiyacınız var - bunun yerine Dijkstra veya Bellman-Ford kullanın.
Grafik yoğun (E, 'ye yakın); O(V²) matris biçimi basit ve hızlı.Grafik seyrek ve kenarlar zaten sıralı veya sıralaması kolay - Kruskal genellikle daha basittir.
Ağacın bir bölgeden dışa doğru büyümesini istiyorsunuz (ör. artımlı ağ düzeni).Grafik bağlantısız - Prim yalnızca bir bileşeni kapsar; minimum kapsayan ormana ihtiyacınız var.
Zaten bir komşuluk yapınız ve bir öncelik kuyruğunuz mevcut.Küresel bir kenar kümesinde döngüleri tespit etmeniz gerekiyor - union-find (Kruskal) bu şekle daha iyi uyar.

Prim's Algorithm kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Prim's Algorithm uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Prim's Algorithm kodu

Python
1import heapq2
3
4def prim(graph, start):5    visited = {start}6    heap = [(w, start, v) for v, w in graph[start]]7    heapq.heapify(heap)8    mst, total = [], 09    while heap and len(visited) < len(graph):10        w, u, v = heapq.heappop(heap)11        if v in visited:12            continue13        visited.add(v)14        mst.append((u, v, w))15        total += w16        # Offer the new node's edges to the frontier17        for neighbor, weight in graph[v]:18            if neighbor not in visited:19                heapq.heappush(heap, (weight, v, neighbor))20    return mst, total21
22
23graph = {24    "A": [("B", 4), ("C", 1)],25    "B": [("A", 4), ("C", 3), ("D", 2)],26    "C": [("A", 1), ("B", 3), ("D", 5)],27    "D": [("B", 2), ("C", 5), ("E", 7)],28    "E": [("D", 7)],29}30
31mst, total = prim(graph, "A")32for u, v, w in mst:33    print(f"{u} - {v} (weight {w})")34print("Total MST weight:", total)
Bu kodu Python Playground'da çalıştır

Prim Algoritması SSS

Prim algoritmasının zaman karmaşıklığı nedir?
İkili yığın öncelik kuyruğu ile Prim O(E log V) sürede çalışır. Her adımda minimum geçiş kenarını tarayan daha basit komşuluk matrisi sürümü O(V²)'dir ve yoğun grafiklerde daha hızlı olabilir. Her ikisi de O(V + E) alan kullanır.
Prim ile Kruskal algoritması arasındaki fark nedir?
Her ikisi de minimum kapsayan ağacı açgözlü şekilde bulur. Prim bir başlangıç düğümünden tek bir bağlı ağaç büyütür ve ağaçtan çıkan en ucuz kenarı tekrar tekrar ekler (bir öncelik kuyruğu kullanarak). Kruskal ağırlığa göre sıralanmış tüm kenarları değerlendirir ve döngü oluşturmayan en ucuzunu ekler (union-find kullanarak). Prim genellikle yoğun grafiklerde, Kruskal seyrek grafiklerde tercih edilir.
Prim algoritması her zaman optimal MST'yi bulur mu?
Evet. Her adımda mevcut ağacı geçen en ucuz kenarı eklemek güvenlidir - bir minimum kapsayan ağaca aittir (kesim özelliği). Güvenli kenarları tekrar tekrar eklemek, grafik bağlı olduğu sürece gerçek bir minimum kapsayan ağaç verir.
Kruskal yerine Prim algoritmasını ne zaman kullanmalıyım?
Grafik yoğun olduğunda Prim'e başvurun, çünkü O(V²) matris biçimi tüm E kenarları sıralamaktan kaçınır ve bir başlangıç düğümünden tek bir ağaç büyütür. Kruskal, kenar listesini sıralamanın ucuz olduğu ve union-find'ın döngü kontrollerini hızlı tuttuğu seyrek grafiklerde parlar. Her ikisi de doğru bir MST üretir, bu nedenle seçim esas olarak kenar yoğunluğuna ve halihazırda hangi veri yapılarına sahip olduğunuza bağlıdır.
Başlangıç düğümü sonuçtaki MST'yi etkiler mi?
Hayır - hangi düğümden başladığınızdan bağımsız olarak MST'nin toplam ağırlığı aynıdır, çünkü bağlı bir grafiğin minimum kapsayan ağaç ağırlığı benzersizdir. Belirli kenarlar yalnızca birkaç kenar aynı ağırlığı paylaştığında ve birden fazla MST bulunduğunda farklılık gösterebilir. Aksi takdirde Prim, başlangıç düğümünden bağımsız olarak tam olarak aynı ağaca ulaşır.
Prim algoritması bağlantısız grafikleri işleyebilir mi?
Doğrudan değil. Prim tek bir ağaç büyütür, bu nedenle yalnızca başlangıç düğümünü içeren bağlı bileşeni kapsar ve gerisini dokunmadan bırakır. Her bileşeni kapsamak için Prim'i ziyaret edilmemiş bir düğümden tekrar tekrar çalıştırırsınız ve tek bir ağaç yerine minimum kapsayan bir orman üretirsiniz.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA