J'essaye d'écrire du code qui traversera un graphe non-orienté non-pondéré. Essentiellement, la méthode passera un nœud (qui connaît tous ses voisins). La méthode doit alors construire un modèle du graphe aussi efficacement * en allant de nœud en nœud et en collectant des informations que les nœuds lient les uns aux autres. À la fin, la méthode aura une liste complète de tous les nœuds et de tous les sommets qui les relient.Traverser un graphe non-orienté non-pondéré avec une torsion: visites minimales sur chaque noeud
* Le nœud du problème réside dans le mot efficacement et ce que je veux dire par là. Permettez-moi de diriger votre attention sur ce petit graphique:
Disons que je commence au niveau du noeud G. Je peux soit visiter C, B, F, D, H, J ou E. Je veux minimiser la Nombre de fois que je visite un nœud et que je dois visiter un nœud, je dois traverser tous les nœuds sur le chemin de ce nœud. Exemple: disons que je décide de visiter le nœud C. Le prochain nœud à visiter pourrait être A, B, F, D, H, J ou E. Cependant, pour visiter n'importe quel nœud sauf A, j'aurais passer à nouveau par G qui est considéré comme inefficace. Et pour visiter A, je devrais à nouveau visiter G et C, puis passer par C puis G pour revenir au reste du graphique. Donc je décide de visiter A. Cela signifie que je dois à nouveau passer par C pour atteindre G. Donc, d'un point de vue logique, il est logique de visiter la branche C en dernier. Cependant, le programme, lorsqu'il démarre au nœud G, ne sait pas que la branche C conduit à une impasse. Au moment où j'écris ceci, je pense que c'est impossible, mais je le demande quand même: est-il possible de parcourir ce graphique le plus efficacement possible (comme je l'ai précédemment défini) en utilisant uniquement les informations fournies? les nœuds ses visités et les bords émanant de ces nœuds? Ou devrais-je aller juste avec l'algorithme de variation Dijkstra afin d'assurer que je visite chaque nœud?
tout cela sera écrit en Java si cette matière.
Un DFS serait-il plus efficace en prenant en compte les nombreux cycles? Je suppose que je peux écrire les deux et découvrir expérimentalement en utilisant un certain nombre d'ensembles de données. Je ne peux pas croire que j'ai oublié ça, mais c'est probablement la meilleure réponse. Merci! – Smipims
@Smipims, Breadth First Search ou Djikstra ne sera pas mieux ou pire cycle que la récursivité. Afin de visiter tous les nœuds, vous devez visiter tous les nœuds.Il peut être avantageux d'utiliser une solution non récursive pour éviter une pile d'appels trop profonde (pour les grands graphiques). –
Je suppose que tout dépend de la ressource que vous avez et que vous appréciez davantage: le temps et/ou l'espace mémoire: considérez que vous devez garder une trace des nœuds développés mais à visiter dans le BFS. Si votre graphe peut rester en mémoire je suppose que cela n'a pas d'importance (mais imaginez un graphe implicite que vous explorerez seulement noeud par noeud) – rano