Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 有向图中的圈检测_Node.js_Algorithm_Directed Acyclic Graphs_Directed Graph - Fatal编程技术网

Node.js 有向图中的圈检测

Node.js 有向图中的圈检测,node.js,algorithm,directed-acyclic-graphs,directed-graph,Node.js,Algorithm,Directed Acyclic Graphs,Directed Graph,最近,我们不得不在代码逻辑的有向图中检测递归。我的nodejs实现感觉很复杂,我现在想知道: 代码有什么问题吗 我们能简化它/使它更具可读性吗 const checkCyclic=(图)=>{ const nodes=新集合(Object.keys(图形)); const searchCycle=(跟踪,节点)=>{ const cycleStartIdx=trace.indexOf(节点); 如果(cycleStartIdx!=-1){ 抛出新错误(`Cycle detected:${tr

最近,我们不得不在代码逻辑的有向图中检测递归。我的nodejs实现感觉很复杂,我现在想知道:

  • 代码有什么问题吗
  • 我们能简化它/使它更具可读性吗
const checkCyclic=(图)=>{
const nodes=新集合(Object.keys(图形));
const searchCycle=(跟踪,节点)=>{
const cycleStartIdx=trace.indexOf(节点);
如果(cycleStartIdx!=-1){
抛出新错误(`Cycle detected:${trace

.slice(cycleStartIdx).concat(node).join(“我们可以将其缩短一点:

函数getCycle(G,n,path){ if(路径包括(n)){
抛出'cycle${path.slice(path.indexOf(n)).concat(n).join('一个选项是编写此迭代。但是我不确定这是否会使其更易于阅读您想要路径还是只想知道您是否有一个循环(循环是术语,而不是“递归”)在您的图中?@grodzi感谢您对命名的澄清。出于调试目的,返回循环非常重要。我喜欢第一个实现,因为它干净简单。是的,从性能角度来看,保留对访问节点的引用非常有意义。但是代码开始看起来很难看。我继续添加了一个对上述问题的迭代实现。更可怕的是,我不确定它是否可以挽救。等待一段时间,但是,如果没有其他人想尝试,可能会接受你的问题!刚刚做了一个性能测试,看起来你的第二个实现仍然比我的两个实现慢约10倍。我的迭代比我的递归慢正如预期的那样,我的寿命缩短了一点。时间不够,无法进行更多的调查,但这里是测试设置:消除冷启动偏差我得到>>>循环:16.032ms grodzi1:891.510ms grodzi2:3165.083ms grodziNoCopy:1001.035ms grodziStopVisit:22.204ms该死的我确实忘了更换。看看我的手,我已经得出结论,我可以“没有比你的算法做得更好的了。一个接一个地弹出一个孩子似乎是最快的。如果没有人提议更好,你可能应该回答并接受你自己的答案@vincent。”