使用回溯的随机遍历 N * M 网格的复杂性

标签 c algorithm grid complexity-theory backtracking

我制作了一个算法,使用回溯计算 N*M 网格中的随机路径。 它从 [N/2][0] 开始,并应在 [N/2][M - 1] 结束。 每次迭代他都选择一个随机方向(左、右、前)并继续递归。选定的方向保存在内存中,这样每个节点就不会使用相同的方向两次。 当节点遇到一个已使用的节点或网格的边界并且每个方向都经过测试时,它会拉回堆栈。

它工作得很好,但我想知道如何根据网格的大小计算问题的复杂性。

很抱歉我的英语不好,如果我忘了说什么,请问我你需要的信息。

非常感谢!

最佳答案

我觉得你不能在这里谈论确定性运行时间,因为理论上,一旦陷入循环(例如,你遇到一个你已经访问过的节点),随机数可能会永远返回相同的方向(尽管发生这种情况的可能性很小)。换句话说,您描述的是我们所说的 randomized algorithm。 (大致上任何使用随机位来指导其执行的算法;这意味着运行时间是一个随机变量)。

相反,您可以谈论 expected running time ,即算法返回随机路径前的预期操作次数。

请考虑为算法提供工作代码,以便我们给出更具体的答案。

关于使用回溯的随机遍历 N * M 网格的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337142/

相关文章:

在 C 中从二进制转换为 char

algorithm - 关于算法设计手册-字典数据结构的问题

c++ - 如何检查一个范围内的值是否是另一个范围内的值的倍数?

html - 以特殊顺序制作网格元素列表。 (例如,使用 flex-box 等)

c# - 动态行定义高度

html - 将文本对齐到 div 的底部 : am I confused about CSS or about blueprint?

c - 使用 truss 调试 open() 命令调用

objective-c - 如何创建一个c数组?

c - 如何在 Windows 中从内核模式查找进程使用的内存

c++ - c++中的k排列