Алгоритъм на Прим

В този урок ще научите как работи алгоритъмът на Prim. Също така ще намерите работни примери за алгоритъма на Prim в C, C ++, Java и Python.

Алгоритъмът на Prim е минимален обхващащ дърво алгоритъм, който взема графика като вход и намира подмножеството на ръбовете на тази графика, която

  • образуват дърво, което включва всеки връх
  • има минималната сума от тегла между всички дървета, които могат да се формират от графиката

Как работи алгоритъмът на Prim

Той попада в клас алгоритми, наречени алчни алгоритми, които намират локалния оптимум с надеждата да намерят глобален оптимум.

Започваме от един връх и продължаваме да добавяме ръбове с най-ниско тегло, докато достигнем целта си.

Стъпките за внедряване на алгоритъма на Prim са както следва:

  1. Инициализирайте минималното обхващащо дърво с произволно избран връх.
  2. Намерете всички ръбове, които свързват дървото с нови върхове, намерете минимума и го добавете към дървото
  3. Продължавайте да повтаряте стъпка 2, докато не получим минимално обхващащо дърво

Пример за алгоритъма на Prim

Започнете с претеглена графика Изберете връх Изберете най-краткия ръб от този връх и го добавете Изберете най-близкия връх, който все още не е в решението Изберете най-близкия ръб, който все още не е в решението, ако има множество възможности за избор, изберете такъв на случаен принцип Повторете, докато не имат дърво, което се простира

Псевдокодът на Prim's Algorithm

Псевдокодът за алгоритъма на prim показва как създаваме два набора от върхове U и VU. U съдържа списъка на върховете, които са били посетени, а VU списъка на върховете, които не са били. Един по един преместваме върховете от набор VU към задание U, като свързваме ръба с най-малко тегло.

 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 и C / C ++

Въпреки че се използва матрично представяне на графика на съседство, този алгоритъм може да бъде реализиран и с помощта на Adjacency List за подобряване на неговата ефективност.

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 срещу Kruskal

Алгоритъмът на Крускал е друг популярен алгоритъм с минимално обхващащо дърво, който използва различна логика за намиране на MST на графика. Вместо да започне от връх, алгоритъмът на Крускал сортира всички ръбове от ниско тегло към високо и продължава да добавя най-ниските ръбове, игнорирайки онези ръбове, които създават цикъл.

Сложността на алгоритъма на Prim

Сложността във времето на алгоритъма на Prim е O(E log V).

Приложението за алгоритъм на Prim

  • Полагане на кабели на електрически кабели
  • В мрежа проектирана
  • Да се ​​правят протоколи в мрежови цикли

Интересни статии...