Qual è il numero minimo di bit necessari per memorizzare un puzzle di sudoku?


28

Nota: si tratta del puzzle sudoku standard 9x9. La soluzione deve supportare solo enigmi legali risolti . Quindi una soluzione non ha bisogno di supportare celle vuote e può fare affidamento sulle proprietà di un puzzle di sudoku risolto.

Me lo stavo chiedendo, ma non riuscivo a pensare a una risposta di cui ero contento. Una soluzione ingenua userebbe un byte per ogni cella (81 celle), per un totale di 648 bit. Una soluzione più sofisticata memorizzerebbe l'intero sudoku in un numero di base 9 (una cifra per cella) e richiederebbe bit.log2(981))=257

Ma può ancora essere migliorato, ad esempio, se conosci 8 dei 9 numeri in una subgrid 3x3 puoi dedurre banalmente il nono. Puoi continuare questi pensieri fino al punto in cui questa domanda si riduce a Qual è la quantità di sudoku risolti unici? Ora puoi usare un'enorme tabella di ricerca che associa ogni numero binario a un puzzle di sudoku, ma non sarebbe una soluzione utilizzabile.

Quindi, la mia domanda:

Senza utilizzare una tabella di ricerca, qual è la quantità minima di bit richiesta per memorizzare un puzzle di sudoku e con quale algoritmo?


3
C'è davvero una differenza qualitativa tra tralasciare il nono numero in un 3x3, una riga o una colonna e archiviare il sudoku minimo con spazi vuoti con quella soluzione unica? "Non è necessario supportare celle vuote" è un po 'un'aringa rossa se la soluzione ottimale deve necessariamente.
Wooble,

19
Poiché ci sono 6,67 × 10 ^ 21 risolti sudoku ("QSCGZ" 2003; Felgenhauer e Jarvis 2005) e log_2 (6,67 × 10 ^ 21) = 72,4 ..., un limite inferiore è di 73 bit (anche se si utilizza l'enorme ricerca della tabella) . Se non è necessario distinguere soluzioni sostanzialmente identiche in termini di simmetria, questo limite inferiore non si applica.
Tsuyoshi Ito,

9
Questa domanda costituirebbe un buon concorso di programmazione.
Peter Shor,

1
Il limite inferiore analogo per soluzioni sostanzialmente identiche è di 33 bit.
Charles,

3
Perché hai bisogno di una tabella di ricerca? Puoi semplicemente enumerare le soluzioni di Sudoku una ad una fino a raggiungere il numero desiderato.
Zirui Wang,

Risposte:


19

Sulla stessa linea della risposta di maniaco del cricchetto, se si riempiono le celle non speciali nella seguente matrice, una casella 3x3 alla volta, scegliendo sempre la casella successiva da compilare per essere quella che condivide righe o colonne con una casella hai già compilato, ottieni uno schema come il seguente per il numero di scelte per passaggio (compilando prima il riquadro in alto in alto, il riquadro in alto a destra in seguito, ecc.).

In ciascuna casella 3x3 dopo la prima, dopo aver compilato una riga o colonna della casella, tre delle sei cifre rimanenti sono localizzate in una singola riga. Scegli prima le loro posizioni, quindi compila le restanti tre celle. (Quindi l'ordine effettivo delle celle da compilare potrebbe variare in base a ciò che già sai, ma il numero di scelte non è mai superiore a quello che ho mostrato.)

Dopo aver riempito queste celle, le stelle sono tutte determinate.

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

Se ho calcolato correttamente, questo dà 87 bit. Ci sono alcuni risparmi aggiuntivi da ottenere nell'ultimo blocco 3x3, secondo il commento di Peter Shor: ogni valore è localizzato in una delle quattro celle e ogni riga contiene almeno una cella con solo quattro possibili valori, quindi sicuramente i fattori in ciò Il blocco dovrebbe iniziare con 4 non con 6, ma non capisco i restanti fattori nella risposta di Shor.


4
Puoi anche ridurre il numero di scelte quando compili la sesta casella 3x3. Questa casella diventa 4,3,2 / 3,2,1 / 2,1,1 per un totale di 83 bit, se l'ho calcolata correttamente.
Peter Shor,

@Peter - no. I 3 numeri a destra potrebbero essere gli stessi dei numeri sopra. Non sai che sono tutti distinti. I numeri univoci più sicuri sono 3, quindi la prima casella è una scelta tra sei elementi. (Questa posizione è un esempio. È vera anche per le altre.)
Hogan,

@ David - passando il mio commento a Peter non credo che i tuoi numeri siano sbagliati. Nel secondo riquadro hai 6 5 4 4 3 2 3 2 1credo che debba essere 6 5 4 6 5 4 3 2 1il caso peggiore.
Hogan,

Hogan, no, vedi la parte nella mia risposta su "una volta che hai compilato una riga o colonna della casella, puoi sempre scegliere la riga o colonna successiva da compilare per essere quella in cui ci sono al massimo quattro possibili valori "
David Eppstein,

@David - Consente di etichettare 3 x 3s 1,1 1,2 1,3 andando da sinistra a destra dall'alto verso il basso. Lascia che etichetta i quadrati A - Vado da sinistra a destra dall'alto verso il basso. La posizione D in 1,3 conosce 3 numeri nel 3x3 è in (A, B, C) e conosce 3 numeri in 1,2 (D, E, F) ma non sa che quei 6 numeri sono diversi. Potrebbero essere gli stessi 3 numeri dalle caselle 3,1 e 2,1, quindi ci sono MAX 6 scelte.
Hogan,

13

continuando con la risposta di @ peter ecco un elenco delle possibilità peggiori per ogni cella mentre la riempi iniziando da in alto a sinistra

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

ciò comporta 4.24559E + 29 possibilità o 99 bit

modifica: dimenticato che l'ultimo quadrato è completamente determinato da tutti gli altri


Molto bella!! Consentitemi di aggiungere che non mi è chiaro che potresti mai raggiungere queste possibilità nel peggiore dei casi per una vera soluzione di Sudoku (specialmente se usi un algoritmo sofisticato che utilizza alcune tecniche di Sudoku per restringere le possibilità per cui i numeri possono andare in una cella ).
Peter Shor,

@peter ma devi aggiungere quelli restringenti in en e decodifica e mi sono reso conto che se devi sceglierne uno e non correggere l'ordine (il modo più semplice ma non ottimale in realtà), devi aggiungerlo anche alla codifica
maniaco del cricchetto,

No, se usi lo stesso algoritmo per capire la cella migliore nella procedura di en e decodifica, fornirà la stessa cella (poiché sta lavorando sugli stessi dati), quindi le procedure di en e decodifica saranno sincronizzate, e non è necessario aggiungere l'ordine alla codifica. Questa idea fa funzionare anche l'algoritmo di compressione dei dati LZW.
Peter Shor,

Penso che i bit minimi richiesti per memorizzare un puzzle di sudoku valido non siano una funzione calcolabile (Kolmogorov). Tuttavia, i 103 bit di Peter / Ratchet sembrano un buon limite.
Marzio De Biasi,

2
@Vor: Tecnicamente la macchina di Turing che emette il numero corretto di bit quando viene dato un puzzle di sudoku come input è finito perché l'input set è finito, quindi "quanti bit sono necessari per descrivere questo puzzle" è "banalmente" calcolabile. Sto dicendo che potremmo effettivamente trovare una macchina di Turing esplicitamente (in linea di principio, i calcoli richiederebbero troppo tempo), perché non può essere più difficile che calcolare un prefisso finito di un numero Omega.
Aaron Sterling,

5

Non è necessaria una tabella di ricerca completa per ottenere una compressibilità ottimale. Credo che i computer moderni che utilizzano una tabella di ricerca molto ragionevole siano in grado di contare il numero di Sudokus vincolati , che sono Sudokus con alcune cifre già in atto. Usando questo, ecco come si codifica (la decodifica è simile).

d1N1d1d2N2d1d2N=iNi

72.4

Modifica: la pagina di Wikipedia sulla matematica del Sudoku ci aiuta a chiarire il quadro. Utile anche una tabella compilata da Ed Russell .

Si scopre che se si considerano solo le prime tre righe, allora ci sono essenzialmente solo 44 diverse configurazioni da considerare. Nella tabella è possibile trovare il numero totale di configurazioni equivalenti a una determinata (supponendo che la riga superiore sia 123456789) e il numero totale di completamenti di ciascuna. Dato un Sudoku, ecco come calcoleremo il suo numero ordinale:

  1. Normalizza la configurazione in modo che la sua riga superiore sia 123456789.
  2. Scopri a quale delle 44 diverse configurazioni appartiene. L'articolo di Wikipedia fornisce un algoritmo per questo. La tabella elenca il numero di classi di equivalenza per ciascuna configurazione, nonché il numero di completamenti.
  3. Determina il numero ordinale della configurazione delle prime tre righe all'interno della sua classe di equivalenza. Questo può essere fatto in due modi: o usando un elenco di tutte le classi di equivalenza (ce ne sono 36288 in totale in tutte le classi di equivalenza) o trovando un modo per elencarle rapidamente tutte.
  4. Normalizza le restanti righe ordinando le righe 4-6 e 7-9 in base alla loro prima colonna, quindi ordinando questi due blocchi di righe in modo arbitrario. Ciò riduce il numero di completamenti di un fattore 72.
  5. 220
  6. ijkCi,DiCi+jDi+k9!72

Questa procedura è reversibile e genererà un Sudoku da un numero ordinale. Nota che l'enumerazione del Sudoku è stata ridotta a pochi minuti (nel 2006; vedi la pagina di discussione dell'articolo di Wikipedia) o meno, quindi mi aspetto che su un computer moderno questo approccio sarebbe molto pratico e richiederebbe qualche secondo o meno.


2
È possibile contare in modo efficiente le soluzioni al sudoku vincolato? È # P-completo se generalizzi le dimensioni e consenti spazi vuoti in luoghi arbitrari.
Tsuyoshi Ito,

2
Come ho accennato nella mia risposta, la codifica aritmetica raggiungerà una compressione quasi ottimale per questo scenario.
Peter Shor,

1
Potresti avere ragione, ma la tua affermazione implica che il numero di griglie del sudoku (6,67 × 10 ^ 21) è facile da calcolare su un computer moderno. È davvero possibile calcolare, ma è facile?
Tsuyoshi Ito,

2
Ho avuto quell'impressione da uno dei documenti che descrivono come fare il calcolo. Potresti persino calcolare alcuni dei dati "più pesanti" nella preelaborazione e archiviarli in una tabella di dimensioni ragionevoli: i guadagni di velocità possono essere drammatici. Per quanto mi ricordo, ci sono volute solo poche ore, e questo alcuni anni fa. Supponiamo ora di usare una tabella per renderla 1000 volte più veloce. Inoltre, in ogni fase i numeri diminuiscono in modo esponenziale, quindi la maggior parte del lavoro è probabilmente concentrata nella prima fase.
Yuval Filmus,

1
@tsuyoshi Credo che ci sia una versione / estensione dei BDD che renda il calcolo relativamente semplice - avrei bisogno di fare un po 'di ricerca, ma so che sono stati usati per alcuni complicati problemi di conteggio combinatorio.
Steven Stadnicki,

4

Ecco un algoritmo che sospetto produrrà una codifica abbastanza buona. Hai il sudoku finito che vuoi comprimere e diciamo che ne hai già codificato alcune celle, quindi c'è un sudoku parziale (non necessariamente con una soluzione unica) con alcune celle riempite.

Utilizzare un algoritmo fisso per contare quanti numeri possono essere inseriti in ogni cella vuota. Trova la prima cella lessicografa in cui può essere inserito il numero più piccolo di numeri diversi e codifica quale di questi numeri entra in essa (quindi se una cella può contenere solo un 3, 7 o 9, il 3 è codificato da "0 ", il 7 per" 1 "e il 9 per" 2 "). Codifica la sequenza risultante usando la codifica aritmetica (che tiene conto del numero di possibili numeri che una cella può contenere).

Non so per quanto tempo sarà la sequenza binaria risultante, ma sospetto che sia piuttosto breve, specialmente se il tuo algoritmo per contare quanti numeri possono essere inseriti in una cella è ragionevolmente sofisticato.

Se avessi un buon algoritmo che stimasse la probabilità di ogni cella contenente un dato numero, potresti fare ancora meglio.


3

Eventuali commenti e critiche sono ben accetti

69.96171.72

1.) La memorizzazione del puzzle implica la memorizzazione della soluzione (informazioni teoricamente).

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

Questo per segnalare un'implementazione della codifica compatta sudoku completata (simile al suggerimento di Zurui Wang del 14/09/11).

L'input è la riga superiore e le prime 3 cifre della seconda riga. Questi sono ridotti a 1-9! e 1-120 e combinati con <= 4.4x10 ^ 7. Questi sono usati come dati per contare lessicograficamente tutti i sukokus parziali di 30 cifre fino alla sequenza corrispondente. Quindi il conteggio finale fino a tutte le 81 cifre viene eseguito allo stesso modo. Queste 3 sequenze sono memorizzate come numeri interi a 32 bit di max 26 bit, quindi possono essere ulteriormente compresse. L'intero processo dura circa 3 minuti, con le prime 30 cifre che impiegano la maggior parte del tempo. La decodifica è simile, ad eccezione dei conteggi corrispondenti anziché del sudoku.

Prossimamente - La revisione include le prime 3 cifre della seconda riga nell'enumerazione dei completamenti di 30 cifre (secondo codice a 32 bit), confronti con l'enumerazione Jarvis (Jscott, 3/1615)


1
Cordiali saluti: Se hai creato due account e desideri unirli, consulta cstheory.stackexchange.com/help/merging-accounts
DW

0

Vorrei andare con la seguente semplice analisi:

Ogni valore può essere memorizzato in 4 bit (intervalli da 1-9, questi tre bit consentono anche 0-16)

9×9=81

8×8

Immagino di poterlo ridurre a:

b=log2(v)(n1)

dove

v

n

Modifica: Neo Style: Conosco il lattice.


-2

Quel numero è diverso per ogni Sudoku. Una delle regole per il Sudoku è che ha esattamente una soluzione.

Quindi, se guardi un esempio, questa è la quantità minima di dati che devi archiviare.

Se lavori dalla parte opposta, puoi rimuovere cifra per cifra ed eseguire un solutore sul risultato per vedere se ha ancora esattamente una soluzione. In tal caso, puoi eliminare un'altra cifra. In caso contrario, è necessario ripristinare questa cifra e provarne un'altra. Se non ci riesci, hai trovato un minimo.

Poiché la maggior parte dei puzzle inizia per lo più vuota, una codifica della lunghezza della corsa probabilmente porterà a buoni risultati.


Questo approccio avido non raggiunge necessariamente il minimo, forse è necessario selezionare attentamente quale cifra rimuovere in ogni passaggio.
Diego de Estrada,

È solo un esempio. Google per "generatori di puzzle di sudoku" per ottenere quelli più sofisticati.
Aaron Digulla,

5
Davvero non capisco perché ti aspetti che funzioni particolarmente bene. Questo sembra essere solo un istinto piuttosto che una risposta.
Joe Fitzsimons,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.