我正在做一个问题,我已经找到了一个点,在那里快速了解路径的数量会有所帮助。 目前,我已经编写了一个递归函数(在c ++中),它可以找到所有这些函数,但它的复杂性增长很快,所以我的算法变得很慢。我的算法是~O(2 ^ n)。如果可能的话,我想要一个更快的。
我已经研究了这个主题,但我只能在有向和无向图中找到Euler Circuits的证明(对于NP完全或多项式)和算法。但同样,我正在寻找有向图中的Euler Paths。
我的图表只有两个节点,但是很多边缘应该只触摸一次,就像在欧拉路径中一样。
总结如下:
答案 0 :(得分:1)
如果你想生成所有可能的补丁,我认为不可能加快速度,因为你必须打印很多补丁。但是如果你只需要计算它们,你可以更快地完成它。
你有4种类型的边缘。 1)0-0; 2)1-1; 3)0-1; 4)1-0
首先,让我们计算一下我们有多少类型为3和4的边缘。
假设:
S1 - 类型1的边缘总数
S2 - 类型2的边数总计
S3 - 类型3的边缘总数
S4 - 类型4的边缘总数
如果| S3 - S4 | > 1路径不存在。
对于你的图表,S3 = 1,S4 = 2.假设我们有一条路径。让我们修复类型3和4的边缘。
然后路径将如下:
(1-1)*, 1-0, (0-0)*, 0-1, (1-1)*, 1-0, (0-0)*
(1-1)*
- 表示重复边1-1的0次或更多次。
现在算法显而易见:
步骤1-4将采用O(S1!* S2!* S3!* S4!)时间(S1 + S2 + S3 + S4 = n)。
所以算法会很慢。
我们可以使用产品规则找到总计数。
步骤1-4给我们S1! * S2! * S3! * S4!组合
可以在O(N)时间内计算步骤5的组合。只需在本文中计算前缀总和:https://en.wikipedia.org/wiki/Composition_(combinatorics)