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.
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:
Respuestas:
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.
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.
fuente
6 5 4 4 3 2 3 2 1
, creo que debe ser6 5 4 6 5 4 3 2 1
para el peor de los casos.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
esto hace 4,24559E + 29 posibilidades o 99 bits
editar: olvidé que el último cuadrado está completamente determinado por todos los demás
fuente
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 .d1 N1 d1 d2 N2 d1 d2 N=∑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:
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.
fuente
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.
fuente
Cualquier comentario y crítica bienvenida
Un enfoque de detección comprimida parece proporcionar un rango de bits a 171.72 bits:69.96 171.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(α)α2 t(α) α t(3) =2.44444 3
Por lo tanto, tenemos un vector de longitud α 4 que tiene al menos t ( α ) α 2 entradas distintas de cero.P α4 t(α)α2
fuente
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)
fuente
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)
Supongo que podría reducirlo a:
dónde
Editar: Neo Estilo: Sé Latex.
fuente
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.
fuente