У меня есть связный ориентированный циклический граф. Задача состоит в том, чтобы обнаружить каждый отдельный узел в графе, не попадая в бесконечный цикл, как это делает обычный алгоритм обхода дерева.
Вы можете предположить, что я уже знаю, с какого узла начать, чтобы достичь всех точек ориентированного графа, и что для каждого узла у меня есть функция, которая будет возвращать узлы, на которые он направляет. Есть ли известный алгоритм поиска всех узлов?
Основная проблема заключается в том, чтобы действительно избежать циклов, и мне бы очень понравилось, если бы был способ сделать это, не отслеживая каждый отдельный узел и не сравнивая его со списком узлов, которые уже были пройдены.
Если вам нужны дополнительные сведения, актуальная задача состоит в том, чтобы получить список каждой именованной функции в JavaScript, включая функции, которые являются свойствами других объектов. Поэтому я попробовал что-то вроде следующего, так как думал, что ссылки объектов JS друг на друга образуют дерево (но, конечно, это не так):
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);
Проблема с этим кодом в том, что он зацикливается.