Primi algoritm

Selles õpetuses saate teada, kuidas töötab Primi algoritm. Samuti leiate Primi algoritmi toimivaid näiteid C, C ++, Java ja Python.

Primi algoritm on minimaalne haarava puu algoritm, mis võtab sisendiks graafi ja leiab selle graafi servade alamhulga, mis

  • moodustavad puu, mis hõlmab kõiki tippe
  • on kõigi puude vahel, mida graafikult saab moodustada, kaalude minimaalne summa

Kuidas Prim'i algoritm töötab

See kuulub algoritmide klassi, mida nimetatakse ahneteks algoritmideks ja mis leiavad kohaliku optimaali lootuses leida ülemaailmne optimum.

Alustame ühest tipust ja jätkame madalaima raskusega servade lisamist, kuni jõuame oma eesmärgini.

Primi algoritmi juurutamise sammud on järgmised:

  1. Initsialiseerige minimaalne laienev puu juhuslikult valitud tipuga.
  2. Leidke kõik servad, mis ühendavad puu uute tippudega, leidke miinimum ja lisage see puule
  3. Korrake 2. toimingut seni, kuni saame minimaalse laiuse puu

Prim'i algoritmi näide

Alusta kaalutud graafik Vali tipu Vali lühima serva selle tipu ja lisage see Valige lähima tipu pole veel lahendus Vali lähim serv pole veel lahendus, kui on mitu valikuid, valida ühe juhusliku Korrake seni, kuni olete on laiuv puu

Primi algoritmi pseudokood

Prim'i algoritmi pseudokood näitab, kuidas loome kaks tippude U ja VU komplekti. U sisaldab külastatud tippude loendit ja VU nende tippude loendit, mida pole külastatud. Üksteise järel liigutame tipud komplektist VU seadmesse U, ühendades väikseima kaalu serva.

 T = ∅; U = ( 1 ); while (U ≠ V) let (u, v) be the lowest cost edge such that u ∈ U and v ∈ V - U; T = T ∪ ((u, v)) U = U ∪ (v)

Pythoni, Java ja C / C ++ näited

Ehkki kasutatakse graafikute külgnemismaatriksi esitamist, saab selle algoritmi efektiivsuse parandamiseks rakendada ka Adjacency List'i abil.

Python Java C C ++
 # Prim's Algorithm in Python INF = 9999999 # number of vertices in graph V = 5 # create a 2d array of size 5x5 # for adjacency matrix to represent graph G = ((0, 9, 75, 0, 0), (9, 0, 95, 19, 42), (75, 95, 0, 51, 66), (0, 19, 51, 0, 31), (0, 42, 66, 31, 0)) # create a array to track selected vertex # selected will become true otherwise false selected = (0, 0, 0, 0, 0) # set number of edge to 0 no_edge = 0 # the number of egde in minimum spanning tree will be # always less than(V - 1), where V is number of vertices in # graph # choose 0th vertex and make it true selected(0) = True # print for edge and weight print("Edge : Weight") while (no_edge  G(i)(j): minimum = G(i)(j) x = i y = j print(str(x) + "-" + str(y) + ":" + str(G(x)(y))) selected(y) = True no_edge += 1 
 // Prim's Algorithm in Java import java.util.Arrays; class PGraph ( public void Prim(int G()(), int V) ( int INF = 9999999; int no_edge; // number of edge // create a array to track selected vertex // selected will become true otherwise false boolean() selected = new boolean(V); // set selected false initially Arrays.fill(selected, false); // set number of edge to 0 no_edge = 0; // the number of egde in minimum spanning tree will be // always less than (V -1), where V is number of vertices in // graph // choose 0th vertex and make it true selected(0) = true; // print for edge and weight System.out.println("Edge : Weight"); while (no_edge < V - 1) ( // For every vertex in the set S, find the all adjacent vertices // , calculate the distance from the vertex selected at step 1. // if the vertex is already in the set S, discard it otherwise // choose another vertex nearest to selected vertex at step 1. int min = INF; int x = 0; // row number int y = 0; // col number for (int i = 0; i < V; i++) ( if (selected(i) == true) ( for (int j = 0; j G(i)(j)) ( min = G(i)(j); x = i; y = j; ) ) ) ) ) System.out.println(x + " - " + y + " : " + G(x)(y)); selected(y) = true; no_edge++; ) ) public static void main(String() args) ( PGraph g = new PGraph(); // number of vertices in grapj int V = 5; // create a 2d array of size 5x5 // for adjacency matrix to represent graph int()() G = ( ( 0, 9, 75, 0, 0 ), ( 9, 0, 95, 19, 42 ), ( 75, 95, 0, 51, 66 ), ( 0, 19, 51, 0, 31 ), ( 0, 42, 66, 31, 0 ) ); g.Prim(G, V); ) )
 // Prim's Algorithm in C #include #include #define INF 9999999 // number of vertices in graph #define V 5 // create a 2d array of size 5x5 //for adjacency matrix to represent graph int G(V)(V) = ( (0, 9, 75, 0, 0), (9, 0, 95, 19, 42), (75, 95, 0, 51, 66), (0, 19, 51, 0, 31), (0, 42, 66, 31, 0)); int main() ( int no_edge; // number of edge // create a array to track selected vertex // selected will become true otherwise false int selected(V); // set selected false initially memset(selected, false, sizeof(selected)); // set number of edge to 0 no_edge = 0; // the number of egde in minimum spanning tree will be // always less than (V -1), where V is number of vertices in //graph // choose 0th vertex and make it true selected(0) = true; int x; // row number int y; // col number // print for edge and weight printf("Edge : Weight"); while (no_edge < V - 1) ( //For every vertex in the set S, find the all adjacent vertices // , calculate the distance from the vertex selected at step 1. // if the vertex is already in the set S, discard it otherwise //choose another vertex nearest to selected vertex at step 1. int min = INF; x = 0; y = 0; for (int i = 0; i < V; i++) ( if (selected(i)) ( for (int j = 0; j G(i)(j)) ( min = G(i)(j); x = i; y = j; ) ) ) ) ) printf("%d - %d : %d", x, y, G(x)(y)); selected(y) = true; no_edge++; ) return 0; )
 // Prim's Algorithm in C++ #include #include using namespace std; #define INF 9999999 // number of vertices in grapj #define V 5 // create a 2d array of size 5x5 //for adjacency matrix to represent graph int G(V)(V) = ( (0, 9, 75, 0, 0), (9, 0, 95, 19, 42), (75, 95, 0, 51, 66), (0, 19, 51, 0, 31), (0, 42, 66, 31, 0)); int main() ( int no_edge; // number of edge // create a array to track selected vertex // selected will become true otherwise false int selected(V); // set selected false initially memset(selected, false, sizeof(selected)); // set number of edge to 0 no_edge = 0; // the number of egde in minimum spanning tree will be // always less than (V -1), where V is number of vertices in //graph // choose 0th vertex and make it true selected(0) = true; int x; // row number int y; // col number // print for edge and weight cout << "Edge" << " : " << "Weight"; cout << endl; while (no_edge < V - 1) ( //For every vertex in the set S, find the all adjacent vertices // , calculate the distance from the vertex selected at step 1. // if the vertex is already in the set S, discard it otherwise //choose another vertex nearest to selected vertex at step 1. int min = INF; x = 0; y = 0; for (int i = 0; i < V; i++) ( if (selected(i)) ( for (int j = 0; j G(i)(j)) ( min = G(i)(j); x = i; y = j; ) ) ) ) ) cout << x << " - " << y << " : " << G(x)(y); cout << endl; selected(y) = true; no_edge++; ) return 0; )

Primsi vs Kruskali algoritm

Kruskali algoritm on veel üks populaarne minimaalse ulatusega puu algoritm, mis kasutab graafiku MST leidmiseks teistsugust loogikat. Tipust alustamise asemel sorteerib Kruskali algoritm kõik servad väikesest kaalust suureni ja lisab pidevalt kõige madalamaid servi, eirates tsükli loovaid servi.

Primi algoritmi keerukus

Primi algoritmi ajaline keerukus on O(E log V).

Primi algoritmirakendus

  • Elektrijuhtmete kaablite paigaldamine
  • Projekteeritud võrgus
  • Protokollide loomiseks võrgutsüklites

Huvitavad Artiklid...