繁体   English   中英

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

[英]Algorithm Complexity (Big-O) of sudoku solver

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

我使用Java编写了一个sudoku求解器,但没有考虑到效率(我想尝试使其递归工作,我成功了!)

一些背景:

我的策略是利用回溯来确定给定Sudoku拼图的拼图是否只有一种独特的解决方案。 所以我基本上读了一个给定的谜题,并解决了。 一旦找到一个解决方案,就不一定要做,需要继续探索进一步的解决方案。 最后,发生以下三种可能的结果之一:难题根本无法解决,难题具有独特的解决方案,或者难题具有多种解决方案。

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

执行:

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

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

任何帮助表示赞赏

O( n ^ m )其中n是每个正方形的可能性数(即,经典Sudoku中为9), m是空白的数目。

这可以通过仅从单个空白向后工作来看到。 如果只有一个空白,那么在最坏的情况下您就必须解决所有n种可能性。 如果有两个空格,则必须到n准备工作,为每一个为第一空白准备第二空白的第一个空白和n的可能性。 如果有三个空白,则必须为第一个空白处理n种可能性。 这些可能性中的每一个都会产生一个拼图,其中两个空白的n ^ 2个可能性。

该算法通过可能的解决方案执行深度优先搜索。 图的每个级别代表单个正方形的选择。 图形的深度是需要填充的正方形数。 在分支因子为n且深度为m的情况下,在图中找到解决方案的性能为O( n ^ m )。

在许多数独游戏中,会有一些数字可以直接考虑一下。 通过在第一个空单元格中放置数字,您将放弃很多机会来减少可能性。 如果前十个空单元格有很多可能性,您将得到指数增长。 我会问一些问题:

数字1可以在第一行到哪里?

2可以在第一行到哪里?

...

数字9可以在最后一行到哪里?

一样,但是有九列?

一样,但是有九个盒子?

哪个号码可以进入第一个单元格?

哪个数字可以进入第81个单元?

那是324个问题。 如果任何问题都只有一个答案,则选择该答案。 如果有任何问题根本没有答案,那您就回头了。 如果每个问题都有两个或多个答案,则选择一个答案最少的问题。

可能会得到成倍的增长,但仅限于确实很难解决的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM