java - 数独求解器的算法复杂度 (Big-O)

标签 java recursion multidimensional-array sudoku

我正在寻找“你如何找到它”,因为我不知道如何找到我的程序的算法复杂性。

我用 java 写了一个数独求解器,没有考虑效率(我想尝试让它递归工作,我成功了!)

一些背景:

我的策略采用回溯来确定,对于给定的数独谜题,该谜题是否只有一个唯一的解决方案。所以我基本上读了一个给定的谜题,然后解决它。一旦找到一种解决方案,我不一定完成,需要继续探索进一步的解决方案。最后,会出现以下三种可能结果之一:谜题根本无法解决、谜题有唯一解或谜题有多种解法。

我的程序从一个文件中读取拼图坐标,该文件中每个给定的数字都有一行,由行、列和数字组成。按照我自己的习惯,7的左上角写成007。

实现:

我从文件中加载值,并将它们存储在二维数组中 我沿着数组向下走,直到找到一个空白(未填充的值),并将其设置为 1。并检查是否存在任何冲突(我输入的值是否有效)。 如果是,我将转到下一个值。 如果不是,我将值增加 1,直到找到一个有效的数字,或者如果它们都无效(1 到 9),我返回 1 步到我调整的最后一个值并增加那个值(使用递归). 当所有 81 个元素都已填满且没有冲突时,我就完成了求解。 如果找到任何解决方案,我将它们打印到终端。 否则,如果我尝试在最初修改的 FIRST 元素上“返回一步”,则意味着没有解决方案。

我的程序算法复杂度如何?我认为它可能是线性的 [O(n)],但我多次访问数组,所以我不确定 :(

感谢任何帮助

最佳答案

O(n ^ m) 其中 n 是每个正方形的可能性数(即经典数独中的 9)和 < em>m 是空格的数量。

这可以通过仅从一个空白向后计算看出。如果只有一个空白,那么在最坏的情况下,您必须解决 n 种可能性。如果有两个空格,那么您必须为第一个空格计算 n 种可能性,为第一个空格的每种可能性计算第二个空格的 n 种可能性。如果有三个空格,那么您必须为第一个空格解决 n 种可能性。这些可能性中的每一种都会产生一个包含两个空格的谜题,其中有 n^2 种可能性。

该算法对可能的解决方案执行深度优先搜索。图表的每个级别代表单个方 block 的选择。图的深度是需要填充的方 block 的数量。使用 n 的分支因子和 m 的深度,在图中找到解决方案的最坏情况性能为 O(n ^ m)。

关于java - 数独求解器的算法复杂度 (Big-O),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327376/

相关文章:

java - FuseESB 的奇怪输出

java - 我的教授在 setter 中跳过了一个变量,他在编写的代码中是否犯了错误?

java - 用逻辑填充 int[2000][2000] 时发生 StackOverflow 错误

javascript - NodeJS - 递归函数中的异步结果求和

python-3.x - 递归导入所有文件夹中的所有 .py 文件

algorithm - 在具有一组连续 1 的二维数组中查找所有可能的位排列

c - 为什么在二维数组中 a 和 *a 指向相同的地址?

java - 使用 Ant builder 运行所有单元测试

java - StringBuilder 和 StringBuffer 的区别

arrays - 具有可变内容类型和长度的元组数组?