Prims algoritme

I denne opplæringen vil du lære hvordan Prims algoritme fungerer. Du vil også finne eksempler på bruk av Prims algoritme i C, C ++, Java og Python.

Prims algoritme er en minimumsomspennende trealgoritme som tar en graf som inngang og finner delsett av kantene til grafen som

  • danne et tre som inkluderer hvert toppunkt
  • har minimumssummen av vekter blant alle trærne som kan dannes ut fra grafen

Hvordan Prims algoritme fungerer

Det faller inn under en klasse algoritmer kalt grådige algoritmer som finner det lokale optimale i håp om å finne et globalt optimalt.

Vi starter fra ett toppunkt og fortsetter å legge til kanter med lavest vekt til vi når målet vårt.

Trinnene for implementering av Prims algoritme er som følger:

  1. Initialiser det minste spennende treet med et toppunkt valgt tilfeldig.
  2. Finn alle kantene som forbinder treet med nye hjørner, finn minimum og legg det til treet
  3. Fortsett å gjenta trinn 2 til vi får et minimum spennende tre

Eksempel på Prims algoritme

Start med en vektet graf Velg en toppunkt Velg den korteste kanten fra dette toppunktet og legg den til Velg nærmeste toppunkt som ikke er i løsningen ennå Velg nærmeste kant som ikke er i løsningen ennå, hvis det er flere valg, velg en tilfeldig Gjenta til du har et spennende tre

Prims algoritme pseudokode

Pseudokoden for prims algoritme viser hvordan vi lager to sett med hjørner U og VU. U inneholder listen over hjørner som har blitt besøkt og VU listen over hjørner som ikke har det. En etter en flytter vi hjørner fra sett VU til sett U ved å koble den minste vektkanten.

 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)

Python, Java og C / C ++ eksempler

Selv om det er brukt matriserepresentasjon av grafer, kan denne algoritmen også implementeres ved hjelp av Adjacency List for å forbedre effektiviteten.

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; )

Prim's vs Kruskals algoritme

Kruskals algoritme er en annen populær minimumsomspennende trealgoritme som bruker en annen logikk for å finne MST i en graf. I stedet for å starte fra et toppunkt, sorterer Kruskals algoritme alle kantene fra lav vekt til høy og fortsetter å legge til de laveste kantene, og ignorerer de kantene som skaper en syklus.

Prim's Algorithm Complexity

Tidskompleksiteten til Prims algoritme er O(E log V).

Prims algoritmeapplikasjon

  • Legge kabler av elektriske ledninger
  • I nettverksdesignet
  • Å lage protokoller i nettverkssykluser

Interessante artikler...