我做了一个算法,使用回溯计算N * M网格上的随机路径。 它从[N / 2] [0]开始,并在[N / 2] [M - 1]处结束。 每次迭代,他选择一个随机方向(左,右,前)并继续递归。选定的方向保留在内存中,以便每个节点不会使用相同的两次。 当节点遇到已经使用的节点或网格的边界并且每个方向都已经过测试时,它会向上拉回堆栈。
它完美无缺,但我想知道如何根据网格的大小来计算问题的复杂性。
我很抱歉我的英语不好,如果我忘了说些什么,请告诉我你需要的信息。
非常感谢!
答案 0 :(得分:1)
我有一种感觉,你不能在这里谈论确定性的运行时间,因为理论上,一旦陷入循环(例如你遇到一个你已经访问过的节点),随机可以永远保持同样的方向(虽然发生这种情况的概率非常小)。换句话说,您正在描述我们称之为randomized algorithm的内容(大致上任何使用随机位来指导其执行的算法;这意味着运行时间是随机变量)。
相反,您可以在算法返回随机路径之前讨论expected running time,即预期的操作次数。
请考虑为算法提供工作代码,以便我们提供更具体的答案。
答案 1 :(得分:1)
这听起来像没有路径长度的Dijkstra算法。从这个角度来看,您的问题不是一般图表,因此您可以利用其结构。
具体来说,由于您要标记节点以使其不重复,并且每个节点不超过4条边,因此最坏的情况与节点数成正比:O(MN)。另一方面,最好的情况(不太可能)会随机选择最短路径,即O(M)。
由于您随机选择方向,对于任何给定的M和N,应该有明确定义的执行时间分布。不幸的是,精确的分析似乎很难:容易分析的情况,例如随机游走,这里不适用,因为标记节点会改变每一步的统计数据,因为从分析的角度来看,你的矩形竞技场是一个复杂的形状。 p>
我会挥手告诉你,你可以预期你的大部分发行应该更接近于O(MN),因为你可以预期奇数self-avoiding walk结果通常不会朝着正确的方向前进;这会将您的预期执行时间也放在O(MN)上。将会有少数情况下它朝着正确的方向前进,并在检查所有节点的很大一部分之前遇到目标;我希望这些幸运案例的比例应该是总分布的1 / M,并且应该采取类似O(M ^ p)步骤的步骤,其中p是1到2之间的一些小数指数。运行时间接近最佳情况将从这个区域向下指数下降。
如果N <&lt; M,那么幸运案例可能更像是总分布的1 / N;如果MN <&lt; M ^ p指数尾部将是&#34;幸运&#34;情况下...
然而,这只是猜测,而不是正确的分析。