Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Algorithme de Prim — Wikipédia
Algorithme de Prim — Wikipédia 👆 Click Here! Read More..
Un article de Wikipédia, l'encyclopédie libre.
Page d’aide sur l’homonymie

Pour les articles homonymes, voir Prim.

Arbre couvrant de poids minimum

L'algorithme de Prim est un algorithme glouton qui calcule un arbre couvrant minimal dans un graphe connexe pondéré et non orienté. En d'autres termes, cet algorithme trouve un sous-ensemble d'arêtes formant un arbre sur l'ensemble des sommets du graphe initial et tel que la somme des poids de ces arêtes soit minimale. Si le graphe n'est pas connexe, alors l'algorithme détermine un arbre couvrant minimal d'une composante connexe du graphe.

Historique

[modifier | modifier le code]

L'algorithme a été développé en 1930 par le mathématicien tchèque Vojtech Jarnik[1], puis a été redécouvert et republié par Robert C. Prim[2] et Edsger W. Dijkstra en 1959. Ainsi, il est parfois appelé DJP algorithm[3], Jarník's algorithm[4], Prim–Jarník algorithm[5], ou Prim–Dijkstra algorithm[6].

Principe

[modifier | modifier le code]

L'algorithme[7] consiste à faire croître un arbre depuis un sommet. On part d'un sous-ensemble contenant un sommet unique. À chaque itération, on agrandit ce sous-ensemble en prenant l'arête incidente à ce sous-ensemble de coût minimum. En effet, si l'on prend une arête dont les deux extrémités appartiennent déjà à l'arbre, l'ajout de cette arête créerait un deuxième chemin entre les deux sommets dans l'arbre en cours de construction et le résultat contiendrait un cycle.

Exemple

[modifier | modifier le code]
Exécution de l'algorithme de Prim depuis le sommet A.

À droite, on donne un exemple d'exécution de l'algorithme de Prim.

Pseudo-code

[modifier | modifier le code]

Le pseudo-code[7] de l'algorithme de Prim est similaire à celui de l'algorithme de Dijkstra et utilise le type abstrait file de priorité.

 fonction prim(G, s)
       pour tout sommet t
              cout[t] := +∞
              pred[t] := null
       cout[s] := 0
       F := file de priorité contenant les sommets de G avec cout[.] comme priorité 
       tant que F ≠ vide
            t := F.defiler
            pour toute arête t--u avec u appartenant à F
                si cout[u] >= poids de l'arête entre les sommets t et u
                       pred[u] := t
                       cout[u] := poids de l'arête entre les sommets t et u
                       F.notifierDiminution(u)
                        
       retourner pred

Au début tous les sommets sont dans la file de priorité. La priorité est donnée par cout[.]. Autrement dit, le sommet possédant la plus faible valeur dans le tableau cout[.] sortira en premier de la file. On retire un à un les sommets de la file de priorité. Le tableau pred[.] contient le prédécesseur d'un sommet dans l'arbre en construction. L'algorithme retourne le tableau pred qui représente l'arbre couvrant de poids minimum.

Analyse de la complexité

[modifier | modifier le code]
Article connexe : Analyse de la complexité des algorithmes.

Soit G = ( S , A ) {\displaystyle G=(S,A)} {\displaystyle G=(S,A)} le graphe en entrée, où | S | {\displaystyle |S|} {\displaystyle |S|} est le nombre de sommets dans le graphe et | A | {\displaystyle |A|} {\displaystyle |A|} est le nombre d'arcs dans le graphe, on effectue | S | {\displaystyle |S|} {\displaystyle |S|} opérations défiler-min et 2 × | A | {\displaystyle 2\times |A|} {\displaystyle 2\times |A|} opérations réduire-priorité donc C P r i m ∈ O ( | S | × C d e f i l e r m i n ( S ) + | A | × C r e d u i r e p r i o r i t e ( S ) + C i t e r e r g r a p h e ( S , A ) ) {\displaystyle C_{Prim}\in O(|S|\times C_{defilermin}(S)+|A|\times C_{reduirepriorite}(S)+C_{iterergraphe}(S,A))} {\displaystyle C_{Prim}\in O(|S|\times C_{defilermin}(S)+|A|\times C_{reduirepriorite}(S)+C_{iterergraphe}(S,A))}.

Le cout de l'itération du graphe C i t e r e r g r a p h e ( S , A ) {\displaystyle C_{iterergraphe}(S,A)} {\displaystyle C_{iterergraphe}(S,A)} est le cout total d'itération des voisins de la boucle interne durant l'exécution de l'algorithme. Pour une implémentation d'un graphe sous forme de matrice d'adjacence, C i t e r e r g r a p h e ( S , A ) ∈ O ( | S | 2 ) {\displaystyle C_{iterergraphe}(S,A)\in O(|S|^{2})} {\displaystyle C_{iterergraphe}(S,A)\in O(|S|^{2})} alors que lors d'une implémentation sous forme de liste d'adjacence, C i t e r e r g r a p h e ( S , A ) ∈ O ( | A | ) {\displaystyle C_{iterergraphe}(S,A)\in O(|A|)} {\displaystyle C_{iterergraphe}(S,A)\in O(|A|)}[8].

Si l'on regarde la complexité de ces deux opérations avec trois possibilités de files de priorités, on obtient les complexités ci-dessous :

File de priorité Graphe C d e f i l e r m i n {\displaystyle C_{defilermin}} {\displaystyle C_{defilermin}} C r e d u i r e p r i o r i t e {\displaystyle C_{reduirepriorite}} {\displaystyle C_{reduirepriorite}} C P r i m {\displaystyle C_{Prim}} {\displaystyle C_{Prim}}
Liste (informatique) matrice d'adjacence O ( S ) {\displaystyle O(S)} {\displaystyle O(S)} O ( 1 ) {\displaystyle O(1)} {\displaystyle O(1)} O ( | S | 2 ) {\displaystyle O(|S|^{2})} {\displaystyle O(|S|^{2})}
tas min binaire liste d'adjacence O ( l o g ( S ) ) {\displaystyle O(log(S))} {\displaystyle O(log(S))}[9] O ( l o g ( S ) ) {\displaystyle O(log(S))} {\displaystyle O(log(S))}[9] O ( | A | log ⁡ | S | ) {\displaystyle O(|A|\log |S|)} {\displaystyle O(|A|\log |S|)}
tas de Fibonacci liste d'adjacence O ( l o g ( S ) ) {\displaystyle O(log(S))} {\displaystyle O(log(S))} am. O ( 1 ) {\displaystyle O(1)} {\displaystyle O(1)} am.[9] O ( | A | + | S | log ⁡ | S | ) {\displaystyle O(|A|+|S|\log |S|)} {\displaystyle O(|A|+|S|\log |S|)}[source insuffisante]

am. : Complexité amortie

Preuve de correction

[modifier | modifier le code]

Soit G un graphe connexe pondéré. À chaque itération de l'algorithme de Prim, on trouve une arête qui connecte un sommet dans un sous-graphe à un sommet à l'extérieur du sous-graphe. Puisque G est connexe, il y aura toujours un chemin vers tous les sommets. La sortie Y de l'algorithme de Prim est un arbre, parce que chaque sommet (sauf le premier) est relié à exactement un prédécesseur.

Soit Ai l'ensemble des i premières arêtes ajoutées à l'arbre Y par l'algorithme de Prim et A0 = {}. On va montrer que, pour chacun des Ai, il existe un arbre couvrant minimal de G contenant Ai. Alors il existera un arbre couvrant minimum qui contiendra Y et sera donc Y. Pour ce faire, supposons qu'il existe un premier ensemble Ak tel qu'aucun arbre couvrant minimal ne contient Ak. Soit e l'arête qui appartient à Ak mais n'appartient pas à Ak-1, soit Y1 un arbre couvrant minimum du graphe G qui contient toutes les arêtes d' Ak-1 et soit S l'ensemble de sommets reliés par les arêtes d' Ak-1. Une extrémité de l'arête e est dans l'ensemble S et l'autre n'est pas. Puisque l'arbre Y1 est un arbre couvrant du graphe G, il y a un chemin dans l'arbre Y1 joignant les deux extrémités de e. Lorsque l'on se déplace le long du chemin, on doit rencontrer une arête f qui joint un sommet de S à un sommet qui n'est pas dans l'ensemble S. Alors, à l'itération où l'arête e a été ajoutée à l'arbre Y, l'arête f pourrait aussi avoir été ajoutée et elle serait ajoutée au lieu de e si son poids était moins que celui de e, et puisque l'arête f n'a pas été ajoutée, nous concluons que

w ( f ) ≥ w ( e ) . {\displaystyle w(f)\geq w(e).} {\displaystyle w(f)\geq w(e).}

Soit Y2 l'arbre obtenu en enlevant l'arête f et en ajoutant l'arête e à l'arbre Y1. Il est facile de montrer que l'arbre Y2 est un arbre couvrant et le poids total de ses arêtes n'est pas supérieur à celui de l'arbre Y1 et que Y2 contient toutes les arêtes d' Ak. On arrive à une contradiction, car on a supposé qu'il existe un ensemble Ak tel qu'aucun arbre couvrant de poids minimum ne contient les arêtes d' Ak. C'est donc que l'hypothèse faite est fausse.

Notes et références

[modifier | modifier le code]
  1. ↑ « O jistém problému minimálním. (Z dopisu panu O. Borůvkovi) », sur dml.cz (consulté le 26 décembre 2015)
  2. ↑ R.C. Prim, « Shortest connection networks and some generalizations », Bell System Technical Journal, The, vol. 36,‎ 1er novembre 1957, p. 1389-1401 (ISSN 0005-8580, DOI 10.1002/j.1538-7305.1957.tb01515.x, lire en ligne, consulté le 26 décembre 2015)
  3. ↑ Seth Pettie et Vijaya Ramachandran, « An Optimal Minimum Spanning Tree Algorithm », J. ACM, vol. 49,‎ 1er janvier 2002, p. 16–34 (ISSN 0004-5411, DOI 10.1145/505241.505243, lire en ligne, consulté le 26 décembre 2015)
  4. ↑ (en) Robert Sedgewick et Kevin Daniel Wayne, Algorithms, Upper Saddle River, Addison-Wesley Professional, 1er janvier 2011, 955 p. (ISBN 978-0-321-57351-3, BNF 44524965, présentation en ligne)
  5. ↑ (en) Kenneth Rosen, Discrete Mathematics and Its Applications 7th edition, McGraw-Hill Science, 14 juin 2011 (lire en ligne)
  6. ↑ D. Cheriton et R. Tarjan, « Finding Minimum Spanning Trees », SIAM Journal on Computing, vol. 5,‎ 1er décembre 1976, p. 724-742 (ISSN 0097-5397, DOI 10.1137/0205051, lire en ligne, consulté le 26 décembre 2015)
  7. ↑ a et b (en) S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani, Algorithms
  8. ↑ Informatique: MP2I, MPI cours et exercices corrigés, Ellipses, 2022 (ISBN 978-2-340-07034-9), Coûts de la fonction `succ` chapitre 8.2.1 et 8.2.2.
  9. ↑ a b et c Thomas H. Cormen, Charles Eric Leiserson et Ronald L. Rivest, Introduction to algorithms, MIT Press ; McGraw-Hill, coll. « The MIT electrical engineering and computer science series », 1990 (ISBN 978-0-262-03141-7 et 978-0-07-013143-9)

Voir aussi

[modifier | modifier le code]

Bibliographie

[modifier | modifier le code]
  • J.-F. Hêche, ROSO-EPFL, Cours SC de recherche opérationnelle : Quelques problèmes classiques en théorie des graphes
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction à l'algorithmique, Dunod, 2002 [détail de l’édition]

Liens internes

[modifier | modifier le code]
  • Algorithme de Kruskal
  • Algorithme de Borůvka
v · m
Algorithmes sur les graphes
Recherche
  • A*
  • D*
  • parcours en largeur
  • parcours en largeur lexicographique
  • parcours en profondeur
  • recherche arborescente Monte-Carlo
  • recherche best-first
  • recherche en faisceau
  • recherche jump point
Plus court chemin
  • Bellman-Ford
  • Dijkstra
  • Floyd-Warshall
  • Johnson
Arbre couvrant minimum
  • Borůvka
  • Kruskal
  • Prim
  • reverse-delete
Flot maximum
  • Dinic
  • Edmonds-Karp
  • Ford-Fulkerson
  • Goldberg-Tarjan
Coupe minimum
  • Karger
  • Stoer-Wagner
Composantes fortement connexes
  • Kosaraju
  • Tarjan
Coloration
  • DSATUR
  • Wigderson
  • icône décorative Portail des mathématiques
  • icône décorative Portail de l'informatique théorique
Ce document provient de « https://fr.teknopedia.teknokrat.ac.id/w/index.php?title=Algorithme_de_Prim&oldid=225237949 ».
Catégorie :
  • Algorithme de la théorie des graphes
Catégories cachées :
  • Article à référence insuffisante
  • Portail:Mathématiques/Articles liés
  • Portail:Sciences/Articles liés
  • Portail:Informatique théorique/Articles liés
  • Portail:Informatique/Articles liés

  • indonesia
  • Polski
  • الرية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصر
  • Nederlands
  • 本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українска
  • Tiếng Việt
  • Winaray
  • 中文
  • Русски
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id