¿Cuál es el número mínimo de bits necesarios para almacenar un rompecabezas de sudoku?

28

Nota: se trata del rompecabezas sudoku estándar de 9x9. La solución solo tiene que soportar acertijos legales resueltos . Por lo tanto, una solución no necesita admitir celdas vacías y puede confiar en las propiedades de un rompecabezas de sudoku resuelto.

Me preguntaba esto, pero no podía pensar en una respuesta con la que estuviera contento. Una solución ingenua usaría un byte para cada celda (81 celdas), totalizando 648 bits. Una solución más sofisticada almacenaría todo el rompecabezas de sudoku en un número base 9 (un dígito por celda) y requeriría bits.log2(981))=257

Pero aún puede mejorarse, por ejemplo, si conoce 8 de los 9 números en una subcuadrícula 3x3, puede deducir trivialmente el noveno. Puede continuar con estos pensamientos hasta el punto en que esta pregunta se reduzca a ¿Cuál es la cantidad de sudokus resueltos únicos? Ahora puede usar una gran tabla de búsqueda que asigna cada número binario a un rompecabezas de sudoku, pero esa no sería una solución útil.

Entonces, mi pregunta:

Sin usar una tabla de búsqueda, ¿cuál es la cantidad mínima de bits requerida para almacenar un rompecabezas de sudoku y con qué algoritmo?

orlp
fuente
3
¿Existe realmente una diferencia cualitativa entre dejar fuera el noveno número en una fila o columna de 3x3 y simplemente almacenar el sudoku mínimo con espacios vacíos que tiene esa solución única? "no necesita admitir celdas vacías" es un poco raro si la solución óptima necesariamente lo necesita.
Wooble
19
Debido a que hay 6.67 × 10 ^ 21 sudoku resuelto ("QSCGZ" 2003; Felgenhauer y Jarvis 2005) y log_2 (6.67 × 10 ^ 21) = 72.4 ..., un límite inferior es de 73 bits (incluso si utiliza la búsqueda de tabla enorme) . Si no tiene que distinguir soluciones esencialmente idénticas en términos de simetría, este límite inferior no se aplica.
Tsuyoshi Ito
99
Esta pregunta sería un buen concurso de programación.
Peter Shor
1
El límite inferior análogo para soluciones esencialmente idénticas es de 33 bits.
Charles
3
¿Por qué necesitas una mesa de consulta? Puede enumerar las soluciones de Sudoku una por una hasta llegar al número deseado.
Zirui Wang

Respuestas:

19

En la misma línea que la respuesta de Ratchet Freak, si completa las celdas no destacadas en la siguiente matriz, un cuadro de 3x3 a la vez, siempre elige el siguiente cuadro para completar para compartir filas o columnas con un cuadro Ya ha completado, obtiene un patrón como el siguiente para el número de opciones por paso (llenando primero el cuadro del medio superior, el siguiente cuadro superior derecho, etc.).

En cada cuadro de 3x3 después del primero, una vez que haya completado una fila o columna del cuadro, tres de los seis dígitos restantes se localizan en una sola fila. Elija sus ubicaciones primero y luego complete las tres celdas restantes. (Por lo tanto, el orden real de qué celdas completar puede variar dependiendo de lo que ya sabe, pero el número de opciones nunca es más de lo que he mostrado).

Después de completar estas celdas, todas las estrellas están determinadas.

* * * 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 * * *

Si he calculado correctamente, esto da 87 bits. Hay algunos ahorros adicionales en el último bloque de 3x3, según el comentario de Peter Shor: cada valor se localiza en una de cuatro celdas, y cada fila contiene al menos una celda con solo cuatro valores posibles, por lo que sin duda los factores en ese El bloque debería comenzar con 4, no con 6, pero no entiendo los factores restantes en la respuesta de Shor.

David Eppstein
fuente
44
También puede reducir el número de opciones cuando completa el sexto cuadro 3x3. Este cuadro se convierte en 4,3,2 / 3,2,1 / 2,1,1 para un total de 83 bits, si lo calculé correctamente.
Peter Shor
@Peter - no. Los 3 números a la derecha podrían ser los mismos que los números anteriores. No sabes que todos ellos son distintos. Los números únicos más seguros son 3, por lo que el primer cuadro es una selección de seis elementos. (Esta ubicación es un ejemplo. Es cierto para los demás también.)
Hogan
@David: según mi comentario a Peter, no creo que tus números estén equivocados. En el segundo cuadro que tienes 6 5 4 4 3 2 3 2 1, creo que debe ser 6 5 4 6 5 4 3 2 1para el peor de los casos.
Hogan
Hogan, no, mira la parte de mi respuesta sobre "una vez que hayas completado una fila o columna del cuadro, siempre puedes elegir la siguiente fila o columna para completar, en la que haya como máximo cuatro valores posibles "
David Eppstein
@David: permite etiquetar los 3 x 3s 1,1 1,2 1,3 yendo de izquierda a derecha de arriba a abajo. Deje etiquetado los cuadrados A - voy de izquierda a derecha de arriba a abajo. La ubicación D en 1,3 conoce 3 números en el 3x3 en el que está (A, B, C) y conoce 3 números en 1,2 (D, E, F) pero no sabe que esos 6 números son diferentes. Podrían ser los mismos 3 números de la casilla 3,1 y 2,1, por lo tanto, hay MAX 6 opciones.
Hogan
13

Continuando con la respuesta de @Peter, aquí hay una lista de posibilidades de peores casos para cada celda, ya que la está completando comenzando desde la parte superior izquierda

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

esto hace 4,24559E + 29 posibilidades o 99 bits

editar: olvidé que el último cuadrado está completamente determinado por todos los demás

monstruo de trinquete
fuente
¡¡Muy agradable!! Permítanme agregar que no está claro para mí que alguna vez puedan lograr estas peores posibilidades para una solución de Sudoku real (especialmente si usan un algoritmo sofisticado que usa algunas técnicas de Sudoku para reducir las posibilidades de que los números puedan ir en una celda )
Peter Shor
@peter pero necesita agregar los que se reducen en y decodificar y me di cuenta de que si tiene que elegir uno y no arregla el orden (la forma más fácil pero no óptima realmente), también debe agregar eso a la codificación
monstruo de trinquete
No, si usa el mismo algoritmo para descubrir la mejor celda en el procedimiento de decodificación y en-, dará la misma celda (ya que está trabajando en los mismos datos), por lo que los procedimientos de decodificación y en- se sincronizarán, y no tiene que agregar el orden a la codificación. Esta idea también hace que el algoritmo de compresión de datos LZW funcione.
Peter Shor
Creo que los bits mínimos necesarios para almacenar un rompecabezas sudoku válido no es una función computable (Kolmogorov). Sin embargo, los 103 bits de Peter / ratchet parecen un buen límite.
Marzio De Biasi
2
@Vor: Técnicamente, la máquina de Turing que genera el número correcto de bits cuando se le da un rompecabezas sudoku ya que la entrada es finita porque el conjunto de entrada es finito, por lo que "cuántos bits se necesitan para describir este rompecabezas" es "trivialmente" computable. Estoy diciendo que en realidad podríamos encontrar una máquina de Turing de manera explícita (en principio, los cálculos tomarían demasiado tiempo), porque no puede ser más difícil que calcular un prefijo finito de un número Omega.
Aaron Sterling
5

No necesita una tabla de búsqueda completa para lograr una compresibilidad óptima. Creo que las computadoras modernas que usan una tabla de búsqueda muy razonable pueden contar el número de Sudokus restringidos , que son Sudokus con algunos dígitos ya establecidos. Usando esto, así es como codifica (la decodificación es similar).

Arreglar un orden de los cuadrados. Supongamos que el número en el primer cuadrado es . Pon N 1 como el número de Sudokus cuyo primer cuadrado es menor que d 1 . Sea ahora d 2 el número del segundo cuadrado. Pon N 2 para ser el número de Sudokus cuyo primer cuadrado es d 1 y cuyo segundo cuadrado es menor que d 2 . Y así. El número codificado es N = i N i .d1N1d1d2N2d1d2N=iNi

Este método de codificación se conoce como codificación binomial en la literatura. Debería permitirle calcular de manera efectiva (en un sentido del mundo real) el índice de cualquier Sudoku, y viceversa. Luego requerirá solo bits, como se mencionó anteriormente (esto significa que podría codificar varios de ellos con ese número promedio de bits).72.4

Editar: La página de Wikipedia sobre las matemáticas del Sudoku nos ayuda a aclarar la imagen. También es útil una tabla compilada por Ed Russell .

Resulta que si considera solo las tres primeras filas, entonces esencialmente solo hay 44 configuraciones diferentes para considerar. En la tabla, puede encontrar el número total de configuraciones equivalentes a una determinada (suponiendo que la fila superior sea 123456789) y el número total de finalizaciones de cada una. Dado un Sudoku, así es como calcularíamos su número ordinal:

  1. Normalice la configuración para que su fila superior sea 123456789.
  2. Descubra a cuál de las 44 configuraciones diferentes pertenece. El artículo de Wikipedia ofrece un algoritmo para eso. La tabla enumera el número de clases de equivalencia para cada configuración, así como el número de finalizaciones.
  3. Determine el número ordinal de la configuración de las tres filas superiores dentro de su clase de equivalencia. Esto se puede hacer de dos maneras: usando una lista de todas las clases de equivalencia (hay 36288 en total en todas las clases de equivalencia), o encontrando una manera de enumerarlas rápidamente.
  4. Normalice las filas restantes ordenando las filas 4-6 y 7-9 por su primera columna, y luego clasifique estos dos bloques de filas de alguna manera arbitraria. Esto reduce el número de terminaciones en un factor de 72.
  5. Enumere todas las terminaciones que tengan la misma primera columna. Hay alrededor de de ellos para cada clase de equivalencia, por lo que no debería tomar mucho tiempo. Algunas compensaciones son posibles aquí también.220
  6. Sea la clase de equivalencia, j sea ​​el número ordinal de la configuración de las tres filas superiores dentro de la clase de equivalencia, k sea ​​el número ordinal de la finalización. Hay dos matrices C i , D i (que se pueden calcular a partir de la tabla de Ed Russell) de modo que C i + j D i + k es el número ordinal del Soduko hasta el 9 . 72 simetrías consideradas. A partir de eso, puede calcular el número ordinal real.ijkCi,DiCi+jDi+k9!72

Este procedimiento es reversible y generará un Sudoku a partir de un número ordinal. Tenga en cuenta que la enumeración de Sudoku se ha reducido a unos minutos (en 2006; vea la página de discusión del artículo de Wikipedia) o menos, por lo que espero que en una computadora moderna este enfoque sea muy práctico y demore unos segundos o menos.

Yuval Filmus
fuente
2
¿Es posible contar las soluciones para sudoku restringido de manera eficiente? Es # P-completo si generaliza el tamaño y permite espacios en blanco en lugares arbitrarios.
Tsuyoshi Ito
2
Como mencioné en mi respuesta, la codificación aritmética logrará una compresión casi óptima para este escenario.
Peter Shor
1
Puede que tenga razón, pero su afirmación implica que la cantidad de cuadrículas de sudoku (6.67 × 10 ^ 21) es fácil de calcular en una computadora moderna. De hecho, es posible calcular, pero ¿es fácil?
Tsuyoshi Ito
2
Tuve esa impresión de uno de los documentos que describe cómo hacer el cálculo. Incluso podría calcular algunos de los datos "más pesados" en el preprocesamiento y almacenarlos en una tabla de tamaño razonable; las ganancias de velocidad pueden ser espectaculares. Por lo que recuerdo, les tomó solo unas pocas horas, y eso hace algunos años. Ahora suponga que usa una tabla para hacerlo 1000 veces más rápido. Además, en cada etapa los números disminuyen exponencialmente, por lo que la mayor parte del trabajo probablemente se concentra en la primera etapa.
Yuval Filmus
1
@tsuyoshi Creo que hay alguna versión / extensión de BDD que hace que el cálculo sea relativamente sencillo: tendría que investigar un poco, pero sé que se han utilizado para algunos problemas de conteo combinatorio bastante complicados.
Steven Stadnicki
4

Aquí hay un algoritmo que sospecho que producirá una codificación bastante buena. Tiene el sudoku terminado que desea comprimir, y digamos que ya ha codificado algunas celdas, por lo que hay un sudoku parcial (no necesariamente con una solución única) con algunas celdas rellenas.

Use un algoritmo fijo para contar cuántos números se pueden colocar en cada celda vacía. Encuentre la primera celda lexicográfica en la que se puede colocar el número más pequeño de números diferentes, y codifique cuál de estos números va dentro (por lo tanto, si una celda solo puede contener un 3, 7 o 9, el 3 se codifica con "0 ", el 7 por" 1 "y el 9 por" 2 "). Codifique la secuencia resultante utilizando la codificación aritmética (que tiene en cuenta la cantidad de números posibles que puede contener una celda).

No sé cuánto tiempo durará la secuencia binaria resultante, pero sospecho que es bastante corta, especialmente si su algoritmo para contar cuántos números se pueden colocar en una celda es razonablemente sofisticado.

Si tuviera un buen algoritmo que estimara la probabilidad de que cada celda contenga un número dado, podría hacerlo aún mejor.

Peter Shor
fuente
3

Cualquier comentario y crítica bienvenida

Un enfoque de detección comprimida parece proporcionar un rango de bits a 171.72 bits:69.96171.72

1.) Almacenar el rompecabezas implica almacenar la solución (información teóricamente).

2.) El sudoku más difícil parece tener entradas de para algunas t ( α ) que dependen de α (por ejemplo, t ( 3 ) = 2.44444 a 3 ). http://www.usatoday.com/news/offbeat/2006-11-06-sudoku_x.htmt(α)α2t(α)αt(3) =2.444443

Por lo tanto, tenemos un vector de longitud α 4 que tiene al menos t ( α ) α 2 entradas distintas de cero.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

vs
fuente
1

Esto es para informar una implementación de codificación compacta de sudoku completado (similar a la sugerencia de Zurui Wang 14/09/11).

La entrada es la fila superior y los primeros 3 dígitos de la segunda fila. ¡Estos se reducen a 1-9! y 1-120 y combinados a <= 4.4x10 ^ 7. Estos se utilizan como datos para contar lexicográficamente todos los suculentos parciales de 30 dígitos hasta la secuencia correspondiente. Luego, el conteo final hasta los 81 dígitos completos se realiza de la misma manera. Estas 3 secuencias se almacenan como enteros de 32 bits de un máximo de 26 bits, por lo que se pueden comprimir aún más. El proceso completo dura aproximadamente 3 minutos, y los primeros 30 dígitos toman la mayor parte del tiempo. La decodificación es similar, excepto recuentos coincidentes en lugar de sudokus.

Próximamente: la revisión incluye los primeros 3 dígitos de la segunda fila en la enumeración de las terminaciones de 30 dígitos (segundo código de 32 bits), las comparaciones con la enumeración de Jarvis (Jscott, 3/1615)

jscott
fuente
1
FYI: Si creó dos cuentas y desea fusionarlas, consulte cstheory.stackexchange.com/help/merging-accounts
DW
0

Me gustaría ir con el siguiente análisis simple:

Cada valor podría almacenarse en 4 bits (rangos de 1-9, estos tres bits incluso permiten 0-16)

9×9=81

8×8

Supongo que podría reducirlo a:

b=log2(v)(n1)

dónde

v

n

Editar: Neo Estilo: Sé Latex.

Alfa
fuente
-2

Ese número es diferente para cada Sudoku. Una de las reglas para el Sudoku es que tiene exactamente una solución.

Entonces, si observa un ejemplo, esa es la cantidad mínima de datos que debe almacenar.

Si trabaja desde el lado opuesto, puede eliminar dígito por dígito y ejecutar un solucionador en el resultado para ver si todavía tiene exactamente una solución. Si es así, puede eliminar otro dígito. Si no, debe restaurar este dígito e intentar con otro. Si no puede, ha encontrado un mínimo.

Dado que la mayoría de los rompecabezas comienzan en su mayoría vacíos, una codificación de longitud de ejecución probablemente arrojará buenos resultados.

Aaron Digulla
fuente
Este enfoque codicioso no necesariamente alcanza el mínimo, quizás deba seleccionar cuidadosamente qué dígito eliminar en cada paso.
Diego de Estrada
Es solo un ejemplo. Google para "generadores de rompecabezas sudoku" para obtener más sofisticados.
Aaron Digulla
55
Realmente no veo por qué esperarías que esto funcione particularmente bien. Esto parece ser una sensación instintiva en lugar de una respuesta.
Joe Fitzsimons