repérage des cycles du graphique - explication simple

9

certains pourraient-ils m'aider à comprendre comment trouver des cycles dans des graphiques en termes simples?

J'ai lu d'autres questions, comme celle- ci et aussi certaines des pages wikipedia, mais elles semblent descendre assez rapidement dans le jargon mathématique.

J'ai un modèle du graphique en java, modélisant les nœuds et les arêtes 'in' et 'out' - et le modèle ne connaît les nœuds connectés que dans une seule direction, cela me permet de trouver les nœuds feuilles comme point de départ, mon plan était pour remonter le graphique de chacun de ces nœuds feuilles, pour chaque "marche", en gardant une liste de tous les autres nœuds que j'ai trouvés sur mon itinéraire. Si je vois quelque chose déjà dans la liste à un moment donné, je saurai que j'ai trouvé un cycle dans le graphique. Cela semble cependant un peu simpliste.

Je suis sûr que c'est un problème résolu, ce serait bien de pouvoir l'expliquer en termes simples.

-ace

phatmanace
la source

Réponses:

6

La façon la plus simple à laquelle je peux penser pour expliquer les cycles des graphiques de repérage en termes simples est quelque chose comme ceci:

  • Tout d'abord, je suppose que vous connaissez les bases de ce qu'est un graphique, et ce que sont les nœuds et les arêtes. Cet exemple suppose que vous disposez d'un graphique dans lequel toutes les arêtes sont à sens unique.
  • Créez votre graphique et sélectionnez un nœud comme point de départ.
  • Créez un objet conteneur d'une sorte (une liste ou un hachage fonctionnerait mieux). Appelez-le "Visité".
  • Créez un deuxième objet conteneur (une file d'attente serait idéale ici) et appelez-le "Open".
  • Ajoutez le nœud de départ à la liste Ouvrir.
  • Répétez l'opération alors que la liste ouverte n'est pas vide:
    • Supprimez le premier élément d'Open et appelez-le Current
    • Si Current existe dans Visited, vous avez un cycle.
    • Sinon, ajoutez Current à Visited, puis ajoutez à Open tous les nœuds que Current peut atteindre à partir de ses bords sortants.
  • Si Open finit vide et qu'aucun cycle n'a été détecté, alors vous n'avez aucun cycle. (Du moins pas dans l'ensemble accessible à partir du point de départ, qui n'est pas nécessairement l'intégralité de votre graphique si vous avez des îles dans votre graphique.)
Mason Wheeler
la source
0

Fondamentalement, vous effectuez une première recherche étendue sur le graphique et gardez une trace des nœuds que vous avez visités à l'aide d'une table de hachage.

À tout moment, si vous rencontrez un nœud qui a déjà été visité (présent dans hashmap), alors vous savez qu'il y a un cycle dans le graphique.

agent13
la source