Javascript 如何忽略拓扑排序中的循环?

Javascript 如何忽略拓扑排序中的循环?,javascript,algorithm,sorting,graph,Javascript,Algorithm,Sorting,Graph,我正在使用JS对图形执行拓扑排序。问题是,在某些罕见的情况下,图形将包含循环。这些都是结构的一小部分,因此删除一些边缘不会对最终结果产生很大影响。然而,当它们出现时,算法就中断了。更新它的最有效方法是什么,这样它在一两个周期内不会崩溃?根据维基百科: 拓扑序是可能的,当且仅当图没有有向圈,即,如果它是有向无环图(DAG) 因此,如果图形包含循环,则无法找到有效的上排序。我猜您使用的库对输入图形有一个要求,即DAG。因此,该算法因该要求而中断 但是,如果仍要查找某个topsort,可以对图形进行以

我正在使用JS对图形执行拓扑排序。问题是,在某些罕见的情况下,图形将包含循环。这些都是结构的一小部分,因此删除一些边缘不会对最终结果产生很大影响。然而,当它们出现时,算法就中断了。更新它的最有效方法是什么,这样它在一两个周期内不会崩溃?

根据维基百科:

拓扑序是可能的,当且仅当图没有有向圈,即,如果它是有向无环图(DAG)

因此,如果图形包含循环,则无法找到有效的上排序。我猜您使用的库对输入图形有一个要求,即DAG。因此,该算法因该要求而中断

但是,如果仍要查找某个topsort,可以对图形进行以下修改之一: 1) 构造图的随机生成树。通过这种方式,您可以将图形修改为DAG,并且可以在新图形上运行topsort算法

2) 找到图的强连通分量(使用Tarjan的强连通分量算法)。新图形是DAG,因此可以在其上运行topsort算法

我建议您选择这两个选项,因为至少有两个JavaScript库具有这些算法(对于1,您可以使用一个库来构造图的最小生成树(MST))。通过优化实现,两种算法都具有线性复杂度


此外,您可以运行自己的修改后的DFS算法,该算法将删除找到的每个图形周期的一条边

根据维基百科:

拓扑序是可能的,当且仅当图没有有向圈,即,如果它是有向无环图(DAG)

因此,如果图形包含循环,则无法找到有效的上排序。我猜您使用的库对输入图形有一个要求,即DAG。因此,该算法因该要求而中断

但是,如果仍要查找某个topsort,可以对图形进行以下修改之一: 1) 构造图的随机生成树。通过这种方式,您可以将图形修改为DAG,并且可以在新图形上运行topsort算法

2) 找到图的强连通分量(使用Tarjan的强连通分量算法)。新图形是DAG,因此可以在其上运行topsort算法

我建议您选择这两个选项,因为至少有两个JavaScript库具有这些算法(对于1,您可以使用一个库来构造图的最小生成树(MST))。通过优化实现,两种算法都具有线性复杂度


此外,您可以运行自己的修改后的DFS算法,该算法将删除找到的每个图形周期的一条边

最小化为保留非循环图而删除的弧数的问题称为。链接到的拓扑排序使用一种算法,该算法重复查找阶数为0的顶点并将其删除。对于反馈弧集,EADS-Lin-Smyth启发式算法不远,可概括如下。如果存在阶数为0的顶点v,则将其移除,在剩余图上递归,并将v前置到阶数。如果有一个顶点v的阶数为0,则将其移除,在残差图上递归,并将v追加到顺序中。否则,让v的最大输出次数减去输入次数,删除其所有传入弧,然后继续。

最小化删除弧的数量以留下无环图的问题被称为。链接到的拓扑排序使用一种算法,该算法重复查找阶数为0的顶点并将其删除。反馈弧集的Eades–Lin–Smyth启发式算法并不遥远,可以总结如下。如果存在阶数为0的顶点v,则将其移除,在剩余图上递归,并将v前置到阶数。如果有一个顶点v的阶数为0,则将其移除,在残差图上递归,并将v追加到顺序中。否则,让v的最大输出度数减去输入度数,删除所有传入弧,然后继续。

虽然这是一个投票结果良好的答案,但仍然没有解决我的问题,因为我找不到任何javascript算法,寻找实现它的方法会让我看到一些冗长的论文,如果不放下一两天的工作,我就看不懂,所以自己动手似乎不是个好主意。有什么想法吗?虽然这是一个经过投票表决的答案,但仍然没有解决我的问题,因为我找不到javascript的任何算法,而寻找实现它的方法会导致我写一些冗长的论文,如果不花一两天的时间,我就无法理解,所以我自己做这件事似乎不是一个好主意。有什么想法吗?