我想问一下是否可以在一个非常大的有向图中列出所有循环。图表的大小约为600个节点,大约有7000个边缘。
我尝试过天真的dfs算法,并使用python进程多线程化。我将它设置为使用10个进程。问题是,我仍然无法完成该计划。这需要太长时间。我注意到它列出了许多重复周期。例如,我发现一个循环由200个节点组成。这意味着它计算相同的周期200 * 200倍!我认为它没用,因为它是完全相同的循环。
我尝试过Johnson算法但我的64GB RAM无法处理它。它说它内存不足。
我所做的其他事情是列出一个循环是否在2个节点之间进行。
我检测到节点A是否可以到达节点C而节点C是否可以到达节点A,这意味着至少有一个涉及A和C的循环。这个算法非常快,我可以列出大约有600,000种可能性,尽管我知道也有很多重复。例如,如果A可以达到B,B可以达到C,C可以达到A,这意味着A和C以及B和C之间存在一个循环。
我该怎么办?
答案 0 :(得分:0)
当然,您的问题会有完美的算法,但您可以通过查找图形的强连接组件来修剪某些处理。 SCC的节点不可能与另一个SCC的节点形成循环。因此,您可以分别为不同的SCC运行当前算法,这可以节省大量处理和遍历。