matrice d'incidence,matrice d'adjacence,graphe
bonjour
veux-tu reinventer la roue a propos de la representation d'un graphe.il n'y a pas sur le plan des recherches mathematiques theoriques d'autres representation efficiente que matrice d'incidence noeud/noeud ou(exclusif) matrice d'adjacence arcs/noeuds .
Elles contiennent si je puis dire la "quintessence,la moelle " pour decrire d'une maniere complete un graphe et meme un peu plus .
Entre autres suivant que l'on a choisi l'une de ces 2 representations on peut deduire ,à partir d'une liste des aretes ou arcs les informations suivantes :
1/graphe non oriente
- liste des noeuds voisins d'un noeud
- liste des arcs voisins d'un noeud
2/graphe oriente (arete oriente)
- liste des noeuds voisins incidents et sortants d'un noeud
- liste des arcs voisins incidents et sortants d'un noeud
De plus ces "structures" d'informations complementaires sont -indispensables- dans la quasi majorites des algo de graphes classiques (plus court chemin et ses variantes, coupe ,postier chinois, sac à dos .... ).
Maintenant il ne faut pas confondre l'implementation de ces representations dans un language bien specifique (c++,fortran,java ou cobol ...) et les 2 representations citees ci-dessus.
Je connais des implementations de graphe en fortran(ou il n'y a que des tableaux),en c++ avec des dictionnaires etc....
Implementation
---------------
Un premier point est remarquable dans l'implementation :
-la representation par une matrice d'incidence n'a pas la faveur des auteurs de code à cause qu'elle peut etre "sparse" (comporter des elements vide -graphe peu dense en nombre d'aretes) et gaspiller la memoire.
-aussi la matrice d'adjacence a-t-elle la faveur dans toutes les implementations quelque soit les languages utilises.
Un deuxieme point qui parait anodin mais de la plus haute importance en realite est que l'information "noeud" est deja contenu dans l'information "arete" mais l'inverse n'est pas vrai (un graphe ou tous les noeuds seraient "pendants ou dead nodes " ne repond pas à la definition d'un graphe).Ceci pour soulager ton martyr à propos de la redondance qui n'existe pas si ty reflechis un peu plus en profondeur.
Un troisieme point doit attirer l'attention est que les donnees d'un graphe sont disponibles ou peuvent etre toujours mises sous la forme d'une liste d'aretes jointes à d'autres informations.
Armes de ces remarques on peut concevoir :
-un dictionnaire graphe (un dictionnaire ou table de hashage à cle unique) contenant la liste des membres de la classe Arcs (cle=serait "startnode+endnode",numero d'arc=indice).
L'utilite du dictionnaire vient à propos pour eviter les erreurs dans les donnees ainsi que son indice qui servira heureusement à numeroter les arcs.
-toujours un 2eme dictionnaire(ou est deporte la fameuse adjacence arc-noeud) s'avere approprie pour la classe "Node" (cle="startnod",numero noeud =indice).Les membres de cette classe sont crees au fur et à mesure de l'insertion des aretes.
L'utilite du dictionnaire est qu'il permet de n'inserer que les noeuds des nouveaux arcs mais qui ne figurent pas encore dans le dictionnaire noeud (pas de "dead nodes ou bouts morts" suite à une duplication erronee).
Les autres structures complementaires citees en 1/ et 2/ sont egalement à implementer dans les classes de base.Ces structures sont construites egalement au fur à mesure de l'insertion des aretes et noeuds
La encore ne craignons pas d'abuser des dictionnaires pour les noeuds voisins et les arcs voisins d'un noeuds.
Entre autre utilite de la structure dictionnaire est qu'elle permet d'eviter le fameux test de connexite d'un graphe.
-Il faudrait implementer le tri evidement qui est utile dans la fonction de base des classes.
Classe Graphe
-------------
Autre question bien à propos c'est d'implementer la classe Graphe car il s'agit d'une question pratique bien à propos:
-distinguer un graphe oriente d'un graphe non-oriente
-appartenance d'un sous-graphe à un graphe (foret).
-un algo doit posseder en donnee d'entree une instance graphe (avec tous ses baguages cite ci-dessus) et se limiter à implementer uniquement ses propres structures et sa logique.
Algos structures et methodes communes
---------------------------------------
-table de marquage pour exploration ou tables de recherche avec des structures identiques (liste de noeuds ou arcs predecesseurs dans une exploration)peuvent etre communes à plusieurs algos ainsi que leur methodes (à mettre en pool =>methodes helper d'algo).
Algos structures specifiques
------------------------------
-les autres structures et mthodes specifiques à chaque algo sont à circoncire à l'algo en question.
Pour l'anecdote quand j'ai vu les structures utilisees dans la BCL et dans les fameux graphes de codeplex cela m'a rappele 2 anciens programmes en fortran (annee 70) qui utilisait une structure graphe et comment le probleme de "redondance" avait ete resolu remarquablement à l'epoque par une routine dont le seul role est de verifier au cours de la lecture de chaque arc pour la paire "starnode" et "endnode" que le "nom" de chaque node ne figure dans une table des noms de noeuds et auquel cas elle devait l'ajouter et renvoyer un numero de noeud .
Ce numero etait necessaire pour construitre les autres tables (noeuds voisins,arcs voisins) car les "noms" servait juste de mnemoniques pour l'impression et la comprehension humaine des choses par les utilisateurs en fait )
En esperant que mes humbles remarques auront contribues à eclaircir un peu mieux les choses....
bon code....grapheur...mais il ne faut lacher le morceau et avoir bonne prise...