J'ai un graphe cyclique orienté et connecté. La tâche consiste à découvrir chaque noeud du graphe sans tomber dans une boucle infinie, comme le fera un algorithme de traversée d'arbres.Algorithmes pour la traversée de graphe cyclique dirigée (JavaScript)
Vous pouvez supposer que je sais déjà à quel nœud commencer pour atteindre tous les points dans le graphe orienté, et que pour chaque nœud j'ai une fonction qui retournera les nœuds qu'il dirige vers. Existe-t-il un algorithme connu pour trouver tous les nœuds?
Le problème principal est vraiment d'éviter les cycles, et j'adorerais qu'il y ait un moyen de le faire sans garder trace de chaque nœud et de le comparer avec une liste de nœuds qui ont déjà été traversés.
Si vous avez besoin de plus de détails, la tâche actuelle consiste à obtenir une liste de toutes les fonctions nommées en JavaScript, y compris les fonctions qui sont des propriétés d'autres objets. J'ai donc essayé quelque chose comme ce qui suit, que je pensais que les références des objets JS à l'autre fait un arbre (mais bien sûr, il ne fonctionne pas):
function __findFunctions(obj){
for (var f in obj){
// for special case of edge with self
if (obj === obj[f]){
continue
}
if (typeof obj[f] === 'function' &&
obj.hasOwnProperty(f) &&
// exclude native functions, we only want user-defined ones
!(/\[(native\scode|object\sfunction)\]/i).test(obj[f].toString()) &&
// exclude functions with __ prefix
!(/^\s*function\s*__/).test(obj[f].toString())
){
document.write(f + "<br/>" + obj[f].toString() + "<hr/>");
}
//alert(typeof obj[f] + "\n" + obj + "\n" + obj[f] + "\n" + f)
__findFunctions(obj[f]);
}
}
__findFunctions(window);
Le problème avec ce code est qu'il se coince dans cycles.
S'il vous plaît ignorer l'expression rationnelle, pas trop important dans le contexte de cette question. Bien que j'aimerais savoir s'il y avait une meilleure façon de dire des fonctions définies par l'utilisateur en dehors des fonctions natives. – ehsanul