存储数独谜题所需的最少位数是多少?


28

注意:这是关于标准的9x9数独谜题的。该解决方案只需支持已解决的法律难题。因此,解决方案不需要支持空单元格,而可以依赖于已解决的数独难题的属性。

我想知道,但是我想不出一个我满意的答案。天真的解决方案将为每个单元(81个单元)使用一个字节,共648位。更复杂的解决方案是将整个数独谜题存储在以9为底的数字(每个单元格一位)中,并要求位。log2(981))=257

但是它仍然可以改进,例如,如果您知道3x3子网格中9个数字中的8个,则可以轻松推论第9个数字。您可以将这些想法继续下去,直到这个问题归结为:独有的数独解决方案的数量是多少?现在,您可以使用一个巨大的查找表,该表将每个二进制数映射到一个数独难题,但这将不是一个可用的解决方案。

所以,我的问题是:

在不使用查找表的情况下,存储数独谜题所需的最小位数是多少?使用哪种算法?


3
在第3个数字,第3行或第3列中遗漏第9个数字,并仅存储具有唯一空间的最小数独和空白空间之间,确实存在质的区别吗?如果最佳解决方案确实需要,那么“不需要支持空单元格”有点麻烦。
Wooble 2011年

19
因为有6.67×10 ^ 21个已解决的数独(“ QSCGZ” 2003; Felgenhauer和Jarvis 2005)和log_2(6.67×10 ^ 21)= 72.4…,所以下限是73位(即使您使用大表查找) 。如果不必在对称性上区分本质上相同的解决方案,则此下限不适用。
伊藤刚(Tsuyoshi Ito)

9
这个问题将使一个好的编程竞赛成为可能。
彼得·索尔

1
基本相同的解决方案的相似下限为33位。
查尔斯

3
为什么需要查表?您可以逐一枚举Sudoku解决方案,直到达到所需的数量。
Zirui Wang

Answers:


19

与棘轮怪胎的回答一样,如果您在以下矩阵中填写非加星标的单元格,则一次填充一个3x3的框,请始终选择要填充的下一个框,使其与一个框共享行或列已经填写完毕,您将获得如下图所示的每步选择数量的模式(首先在顶部中间的方框中填写,然后在右上方的方框中填写,依此类推)。

在第一个3x3框之后,一旦您填充了该框的一行或一列,其余的六位数字中的三位就被定位为一行。首先选择它们的位置,然后填写其余三个单元格。(因此,实际填写单元的顺序可能会有所不同,具体取决于您已经知道的内容,但是选择的数量永远不会超过我所显示的。)

填写完这些单元格后,就确定了星星。

* * * 9 8 7 6 5 4
* * * 6 5 4 3 3 2
* * * 3 2 1 3 2 1

6 5 4 * * * 6 3 3
3 3 2 * * * 5 3 2
3 2 1 * * * 4 2 1

6 3 3 6 5 4 * * *
5 3 2 3 3 2 * * *
4 2 1 3 2 1 * * *

如果我计算正确,这将提供87位。根据彼得·索尔(Peter Shor)的评论,在最后的3x3块中还有一些额外的节省:每个值都定位在四个单元格之一中,并且每一行至少包含一个只有四个可能值的单元格,因此肯定是其中的因素块应该以4而不是6开头,但是我不明白Shor答案中的其余因素。


4
您也可以在填写第六个3x3框时减少选择的数量。如果我正确计算的话,这个盒子变成4,3,2 / 3,2,1 / 2,1,1,总共83位。
彼得·索尔

@Peter-不。右边的3个数字可能与上面的数字相同。您不知道它们都是不同的。最有保证的唯一数字是3,因此第一个方框是从六个项目中选择的。(此位置为一个示例。其他位置也是如此。)
Hogan

@David-根据我对Peter的评论,我认为您的电话号码没有错。在第二框中,6 5 4 4 3 2 3 2 1我相信它需要6 5 4 6 5 4 3 2 1在最坏的情况下使用。
霍根

霍根(Hogan),不,请参阅我的回答中有关“一旦您填写了框的一行或一列,您始终可以选择要填充的下一行或一列,使其最多为四个可能的值“
David Eppstein

@David-让我们将3 x 3s 1,1 1,2 1,3标记为从左到右从上到下。让正方形A-我从上到下从左到右。1,3中的位置D在(A,B,C)的3x3中知道3个数字,在1,2(D,E,F)的3x3中知道3个数字,但不知道这6个数字是否不同。它们可能与方框3,1和2,1中的3个数字相同,因此有MAX 6个选择。
霍根

13

继续@peter的答案,这是每个单元格的最坏情况可能性列表,因为您是从左上角开始填写的

9   8   7       6   5   4       3   2   1
6   5   4       6   5   4       3   2   1
3   2   1       3   2   1       3   2   1

6   6   3       6   5   4       3   2   1
5   5   2       5   5   3       3   2   1
4   4   1       4   2   1       3   2   1

3   3   3       3   3   3       1   1   1
2   2   2       2   2   2       1   1   1
1   1   1       1   1   1       1   1   1

这使得4,24559E + 29位或99位

编辑:忘记最后一个平方完全由其他所有人确定


非常好!!让我补充一点,我不清楚您是否可以实现真正的数独解决方案的这些最坏情况(特别是如果您使用使用某些数独技术的复杂算法来缩小可在单元格中输入数字的可能性) )。
Peter Shor

@peter,但是您需要在en和解码中添加那些缩小的范围,我意识到,如果您必须选择一个并且不固定顺序(最简单的方法,但实际上不是最优的),则也需要将其添加到编码中
棘手怪胎

不,如果您使用相同的算法找出en-和解码过程中的最佳像元,它将给出相同的像元(因为它处理的是相同数据),因此en-和解码过程将同步,而且您不必将订单添加到编码中。这个想法也使LZW数据压缩算法起作用。
Peter Shor

我认为存储有效的数独谜题所需的最低位不是可计算函数(Kolmogorov)。但是,Peter / ratchet的103位似乎是一个不错的选择。
Marzio De Biasi

2
@Vor:从技术上讲,当输入数独谜题作为输入时,输出正确位数的图灵机是有限的,因为输入集是有限的,因此“描述这个谜题需要多少位”是“平凡的”可计算的。我是说,我们实际上可以明确找到这样的图灵机(原则上,计算会花费很长时间),因为它比计算Omega数字的有限前缀更难。
亚伦·斯特林

5

您不需要完整的查找表即可获得最佳可压缩性。我相信,使用非常合理的查询表的现代计算机能够计算受约束的数独的数量,即数位已经存在的数独。使用此方法,这里是编码方式(解码类似)。

d1N1d1d2N2d1d2N=iNi

72.4

编辑:Sudoku数学上的Wikipedia页面可帮助我们阐明图片。埃德·罗素Ed Russell)编制的表格也很有用。

事实证明,如果只考虑前三行,那么实际上只需要考虑44种不同的配置。在该表中,您可以找到与任何给定配置等效的配置总数(假设第一行是123456789),以及每个配置的完成总数。给定数独,这是我们如何计算其序数:

  1. 标准化配置,使其最上一行为123456789。
  2. 找出它属于44种不同配置中的哪一种。维基百科文章为此提供了一种算法。该表列出了每种配置的等效类的数量,以及完成的数量。
  3. 确定等效类内前三行的配置序号。这可以通过两种方式完成:要么使用所有等效类的列表(所有等效类中总共36288个),要么找到一种快速枚举所有等效类的方法。
  4. 通过对第4-6行和第7-9行的第一列进行排序,然后对它们进行任意归一化的排序,从而对其余行进行规范化。这样可以将完成次数减少72倍。
  5. 220
  6. ijkCi,DiCi+jDi+k9!72

此过程是可逆的,并将根据序数生成数独。请注意,Sudoku枚举已减少到几分钟(在2006年;请参阅Wikipedia文章的讨论页)上,所以我希望在现代计算机上,这种方法非常实用,并且只需几秒钟或更短的时间。


2
是否可以有效地计算约束数独的解决方案?如果将尺寸概括化并且允许在任意位置使用空格,则它是#P完整的。
伊藤刚(Tsuyoshi Ito)

2
正如我在答案中提到的那样,对于这种情况,算术编码将实现接近最佳的压缩。
彼得·索尔

1
您可能是对的,但您的主张暗示着数独网格的数量(6.67×10 ^ 21)可以在现代计算机上轻松计算。确实可以计算,但是容易吗?
伊藤刚(Tsuyoshi Ito)

2
我从描述如何进行计算的一篇论文中获得了这种印象。您甚至可以在预处理中计算一些“较重”的数据,并将其存储在合理大小的表中-速度的提升会非常明显。据我记得,几年前,他们只花了几个小时。现在,假设您使用一张表使其速度提高了1000倍。而且,在每个阶段,数字都呈指数下降,因此大部分工作可能都集中在第一阶段。
Yuval Filmus

1
@tsuyoshi我相信 BDD的某些版本/扩展使计算相对简单-我需要为此做一点挖掘,但是我知道它们已经用于一些相当复杂的组合计数问题。
史蒂文·斯塔德尼基

4

我怀疑这是一个算法,可以产生很好的编码。您已经完成了要压缩的数独,并且假设您已经对其进行了编码,因此存在部分数独(不一定具有唯一的解决方案),其中填充了一些单元。

使用固定算法计算可以在每个空单元格中放置多少个数字。在字典上找到可以放置最少数量的不同数字的第一个单元,并编码其中要插入的数字之一(因此,如果一个单元只能包含3、7或9,则3编码为“ 0” ”,7乘“ 1”和9乘“ 2”)。使用算术编码(考虑到单元格可以包含的可能数字的数量)对结果序列进行编码。

我不知道生成的二进制序列会持续多长时间,但是我怀疑它会很短,特别是如果您计算一个单元格中可以放置多少个数字的算法相当复杂。

如果您有一个好的算法可以估算每个单元格包含给定数字的概率,那么您可以做得更好。


3

欢迎任何评论和批评

69.96171.72

1.)存储难题意味着存储解决方案(理论上的信息)。

t(α)α2t(α)αt(3) =2.444443

Pα4t(α)α2

Mβ×α4β2t(α)α22t(α)α2{0,±1}β=kt(α)α2k

V=MPβ|α2|M{0,±1}

Vβlogα2=2kt(α)α2logα

α=3t(α) =32kt(α)α2logα=69.96k85.86kk=2139.92171.72bits

MP

A.)k2t(α)1

B.)t(α)t(α)kt(α)α4Ct(α)α2α4(3α21)Ct(α)α23t(α)

t(α)α2

C.)k

D.) VVO((Vmax))=O(|α2|)2βlogα2=2kt(α)α2logα

2k2A.)B.)C.)D.)8973


1

这是为了报告完整数独紧凑编码的实现(类似于Zurui Wang 9/14/11的建议)。

输入是第一行和第二行的前三位。这些减少到1-9!和1-120并合并为<= 4.4x10 ^ 7。这些都用作给定词法,按字典顺序对所有30位数字的部分sukokus进行计数,直到匹配序列为止。然后,以相同的方式对整个81位数字进行最终计数。这3个序列存储为最大26位的32位整数,因此可以进一步压缩。整个过程大约需要3分钟,而前30位数字则需要花费大部分时间。解码是类似的-除了匹配计数而不是数独之外。

即将推出-修订版包括第二行的第1 3位数字和30位数的补全枚举(第二个32位代码),与Jarvis枚举的比较(Jscott,3/1615)


1
仅供参考:如果您创建了两个帐户并希望合并,请参见cstheory.stackexchange.com/help/merging-accounts
DW

0

我将进行以下简单分析:

每个值可以存储在4位中(范围从1-9,这三位甚至允许0-16)

9×9=81

8×8

我想我可以将其简化为:

b=log2(v)(n1)

哪里

v

n

编辑: 新风格:我知道乳胶。


-2

每个数独的数字都不相同。Sudoku的规则之一是它只有一种解决方案。

因此,如果您看一个示例,那就是必须存储的最少数据量。

如果从另一侧进行操作,则可以逐位删除,然后对结果运行求解器以查看其是否仍然只有一个解。如果是这样,您可以删除另一个数字。如果不是,则必须恢复该数字并尝试另一个。如果不能,您已经找到了最低要求。

由于大多数难题开始时几乎都是空的,因此游程编码可能会产生良好的结果。


这种贪婪的方法不一定能达到最低要求,也许您需要在每个步骤中仔细选择要删除的数字。
迭戈·德·埃斯特拉达

这只是一个例子。Google为“数独谜题生成器”提供了更复杂的工具。
亚伦·迪古拉

5
我真的不明白为什么您会期望它表现得特别好。这似乎只是直觉而不是答案。
Joe Fitzsimons
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.