我目前正在进行一些修改,特别是翻过Big-O表示法。我问过一个类似的问题(处理不同的算法),但我仍然不确定我是否采用了正确的方法。
我正在研究的算法是穷举搜索(又名蛮力,我相信),看起来像这样:
Input: G- the graph
n- the current node
p– the path so far
1) For every edge nm (from n to m) in G do
2) If m ∉ p then
3) p = p ∪ {m}
4) Exhaustive(G, m, p)
5) End If
6) End For
到目前为止,我已经得出这个算法是O(n)
的结果 - 这是正确的吗?我怀疑它是,并且很想知道如何去解决它;要找什么,我每次都算什么呢?等等。我明白发生的操作数量需要计算,但是我需要注意的是/计数吗?
编辑:我已经知道这个算法实际上是O((n-1)!)
- 这是正确的,如果是这样的话,这个解决方案是如何实现的,因为我无法解决这个问题?
答案 0 :(得分:1)
通常(但不总是)使用图表,输入大小n
是图表中的节点数。很容易向自己证明函数(更不用说运行时)被调用至少n
次 - 通过图形的单个路径(假设它已连接,也就是说,每个节点都可以通过其他节点到达一些路径)将接听'n'个电话。
要计算递归函数的运行时间,运行时间的上限将是在单个调用中调用递归函数乘以函数运行时的次数。
要查看最坏情况运行时为O((n-1)!)
,请考虑完全连接图中的路径数 - 您可以直接从任何节点访问任何节点。另一种表达方式是,您可以按任何顺序访问节点,保存起始状态。这与(n-1)个元素的排列数相同。我相信它实际上将是O(n!)
,因为我们遍历所有边缘,对于路径上的每个状态(O(n)
)需要n*(n-1)!
。 编辑 :更确切地说,我们可以说它是big-omega(N!)
。有关详细信息,请参阅注释
有时,查看算法计算的内容比实际代码更容易 - 也就是说,所有状态的基数(这里更具特异性,路径)。