我想在有向循环图中找到所有可能的路径。我编写了一个程序来执行此操作,但我注意到如果节点数超过 40 或 50 个,它就会开始花费无限时间。
从理论上讲, N个节点的有向循环图可能有多少条路径。它像阶乘(N)还是什么?你能给我猜一下下面这个有 119 个节点的例子吗?当然,我只会遍历一次循环,因此您可以忽略循环路径。
我想在有向循环图中找到所有可能的路径。我编写了一个程序来执行此操作,但我注意到如果节点数超过 40 或 50 个,它就会开始花费无限时间。
从理论上讲, N个节点的有向循环图可能有多少条路径。它像阶乘(N)还是什么?你能给我猜一下下面这个有 119 个节点的例子吗?当然,我只会遍历一次循环,因此您可以忽略循环路径。
让我们采用图表中显示的这种常见模式:
A ---> B
| /|
| / v
| / C
| / |
| / |
vv /
D <---
请原谅 ASCII 艺术。所以你在这里有三个路径:A -> D
、A -> B -> D
和A -> B -> C -> D
。
现在说你有完全相同的数字从D
另一个节点发出G
:
D ---> E
| /|
| / v
| / F
| / |
| / |
vv /
G <---
您有与以前相同的三个类似路径:D -> G
、D -> E -> G
和D -> E -> F -> G
。
A
现在,从到有多少条路径G
?
要从A
到G
,你必须从A
到D
。您可以通过以下三种方式之一执行此操作。然后你必须从D
到G
。您可以通过以下三种方式之一执行此操作。这两个选择(A
toD
和D
to G
)是相互独立的。因此,您有3
* 3
=从到9
的可能路径。A
G
如果您不断重复该图,则将可能路径的数量乘以3
每次重复。所以用三个数字,27条路径;四个数字,81条路径;等等
这就是指数增长。换句话说:如果你想提高效率,你必须找到另一种方法来做你正在做的事情。
编辑:粗略估计:只计算这些数字,甚至不看中间的复杂混乱,我得到3 * 3 * 3 * 3 * (2^8) * (4^8) * 3 * 3 * 2 * 3
=73383542784
可能的路径,只通过那些简单的节点。
编辑:你似乎在做代码分析。在不确切知道您想要做什么的情况下,我建议您将沿着必须到达的那些节点(例如节点A
、D
和G
在我的示例图中)收集的任何信息整合起来。然后进行搜索,直到您到达必须到达的下一个节点,并在那里收集您的信息。这将防止指数爆炸。
您可以尝试以下方法: