我想在有向循环图中找到所有可能的路径。我已经编写了一个程序,但是我注意到如果节点数增加到40或50以上,它开始花费无限时间。
从理论上讲, N 节点的有向循环图可能有多少条路径。它是阶乘( N )还是什么?你可以用119个节点猜测下面的例子吗?当然,我只进行一次循环,所以你可以忽略循环路径。
答案 0 :(得分:3)
让我们采用图表中显示的这种常见模式:
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
到D
和D
到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
)。然后进行搜索,直到到达必须的下一个节点,并在那里收集您的信息。这将防止指数性爆炸。
答案 1 :(得分:0)
您可以尝试以下操作: