[英]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.