Berapa jumlah minimum bit yang diperlukan untuk menyimpan puzzle sudoku?

28

Catatan: Ini tentang puzzle sudoku 9x9 standar. Solusinya hanya harus mendukung teka-teki hukum yang diselesaikan . Jadi solusi tidak perlu mendukung sel kosong dan dapat mengandalkan properti dari teka-teki sudoku yang terpecahkan.

Saya bertanya-tanya tentang hal ini, tetapi saya tidak dapat menemukan jawaban yang puas. Solusi naif akan menggunakan satu byte untuk setiap sel (81 sel), dengan total 648 bit. Solusi yang lebih canggih akan menyimpan seluruh teka-teki sudoku dalam angka basis-9 (satu digit per sel) dan membutuhkan bit.log2(981))=257

Tetapi masih bisa ditingkatkan, misalnya, jika Anda tahu 8 dari 9 angka dalam subgrid 3x3 Anda dapat dengan mudah menyimpulkan yang ke-9. Anda dapat melanjutkan pemikiran ini ke titik di mana pertanyaan ini bermuara pada Berapa jumlah sudokus terpecahkan yang unik? Sekarang Anda dapat menggunakan tabel pencarian besar yang memetakan setiap nomor biner ke teka-teki sudoku, tetapi itu tidak akan menjadi solusi yang dapat digunakan.

Jadi, pertanyaan saya:

Tanpa menggunakan tabel pencarian, berapakah jumlah bit minimum yang diperlukan untuk menyimpan puzzle sudoku dan dengan algoritma apa?

orlp
sumber
3
Apakah benar-benar ada perbedaan kualitatif antara meninggalkan nomor 9 dalam 3x3, baris, atau kolom dan hanya menyimpan sudoku minimal dengan ruang kosong yang memiliki solusi unik? "tidak perlu mendukung sel-sel kosong" adalah herring merah jika solusi optimal memang perlu.
Wooble
19
Karena ada 6.67 × 10 ^ 21 dipecahkan sudoku ("QSCGZ" 2003; Felgenhauer dan Jarvis 2005) dan log_2 (6,67 × 10 ^ 21) = 72,4 ..., batas bawah adalah 73 bit (bahkan jika Anda menggunakan pencarian tabel besar) . Jika Anda tidak harus membedakan solusi yang pada dasarnya identik dalam hal simetri, batas bawah ini tidak berlaku.
Tsuyoshi Ito
9
Pertanyaan ini akan membuat kontes pemrograman yang bagus.
Peter Shor
1
Batas bawah analog untuk solusi dasarnya identik adalah 33 bit.
Charles
3
Mengapa Anda perlu melihat ke atas meja? Anda bisa menghitung satu per satu solusi Sudoku satu per satu hingga mencapai nomor yang diinginkan.
Zirui Wang

Jawaban:

19

Sepanjang baris yang sama dengan jawaban ratchet freak, jika Anda mengisi sel-sel non-bintang di matriks berikut, kotak 3x3 sekaligus, selalu memilih kotak berikutnya untuk diisi menjadi kotak yang berbagi baris atau kolom dengan kotak yang Anda Sudah diisi, Anda mendapatkan pola seperti berikut untuk jumlah pilihan per langkah (mengisi kotak tengah atas pertama, kotak kanan atas berikutnya, dll).

Di setiap kotak 3x3 setelah yang pertama, setelah Anda mengisi satu baris atau kolom kotak, tiga dari enam digit yang tersisa dilokalkan ke satu baris. Pilih lokasi mereka terlebih dahulu, lalu isi tiga sel yang tersisa. (Jadi urutan aktual sel mana yang akan diisi mungkin bervariasi tergantung pada apa yang sudah Anda ketahui, tetapi jumlah pilihan tidak pernah lebih dari apa yang saya tunjukkan.)

Setelah Anda mengisi sel-sel ini, semua bintang ditentukan.

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

Jika saya menghitung dengan benar, ini menghasilkan 87 bit. Ada beberapa penghematan tambahan yang bisa didapat di blok 3x3 terakhir, per komentar oleh Peter Shor: setiap nilai dilokalkan ke satu dari empat sel, dan setiap baris mengandung setidaknya satu sel dengan hanya empat nilai yang mungkin, jadi tentu saja faktor-faktor di dalamnya blok harus dimulai dengan 4 bukan 6, tapi saya tidak mengerti faktor yang tersisa dalam jawaban Shor.

David Eppstein
sumber
4
Anda dapat mengurangi jumlah pilihan saat Anda mengisi kotak 3x3 keenam juga. Kotak ini menjadi 4,3,2 / 3,2,1 / 2,1,1 dengan total 83 bit, jika saya menghitungnya dengan benar.
Peter Shor
@ Peter - tidak 3 angka di sebelah kanan bisa sama dengan angka di atas. Anda tidak tahu semuanya berbeda. Angka unik yang paling terjamin adalah 3 sehingga kotak pertama adalah pilihan dari enam item. (Lokasi yang satu ini adalah contoh. Itu juga berlaku untuk yang lain.)
Hogan
@ David - pergi dengan komentar saya kepada Peter Saya tidak berpikir nomor Anda salah. Di kotak ke-2 Anda memilikinya, 6 5 4 4 3 2 3 2 1saya percaya itu harus 6 5 4 6 5 4 3 2 1untuk kasus terburuk.
Hogan
Hogan, tidak, lihat bagian dalam jawaban saya tentang "setelah Anda mengisi satu baris atau kolom kotak, Anda selalu dapat memilih baris atau kolom berikutnya untuk diisi menjadi satu di mana terdapat paling banyak empat nilai yang mungkin "
David Eppstein
@ David - Mari beri label 3 x 3s 1,1 1,2 1,3 dari kiri ke kanan atas ke bawah. Biarkan label Squares A - saya ke kiri ke kanan atas ke bawah. Lokasi D dalam 1,3 tahu 3 angka dalam 3x3 itu dalam (A, B, C) dan ia tahu 3 angka dalam 1,2 (D, E, F) tetapi tidak tahu 6 angka itu berbeda. Mereka bisa menjadi 3 angka yang sama dari kotak 3,1 dan 2,1 sehingga ada MAX 6 pilihan.
Hogan
13

terjadi dengan jawaban @ peter berikut daftar kemungkinan terburuk untuk setiap sel saat Anda mengisinya mulai dari kiri atas

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

ini membuat untuk 4.24559E + 29 kemungkinan atau 99 bit

sunting: lupa bahwa kotak terakhir sepenuhnya ditentukan oleh semua yang lain

ratchet freak
sumber
Sangat bagus!! Izinkan saya menambahkan bahwa tidak jelas bagi saya bahwa Anda dapat mencapai kemungkinan terburuk ini untuk solusi Sudoku nyata (terutama jika Anda menggunakan algoritma canggih yang menggunakan beberapa teknik Sudoku untuk mempersempit kemungkinan yang jumlahnya dapat masuk dalam sel ).
Peter Shor
@ Peter tetapi Anda perlu menambahkan yang mempersempit dalam en dan decoding dan saya menyadari bahwa jika Anda harus memilih satu dan tidak memperbaiki urutan (cara termudah tetapi tidak benar-benar optimal), Anda perlu menambahkan itu ke pengkodean juga
ratchet freak
Tidak, jika Anda menggunakan algoritma yang sama untuk mencari tahu sel terbaik dalam prosedur en dan decoding, itu akan memberikan sel yang sama (karena itu bekerja pada data yang sama), sehingga prosedur en dan decoding akan disinkronkan, dan Anda tidak perlu menambahkan urutan ke enkode. Gagasan ini juga membuat algoritma kompresi data LZW bekerja.
Peter Shor
Saya pikir bit minimum yang diperlukan untuk menyimpan puzzle sudoku yang valid bukanlah fungsi yang dapat dihitung (Kolmogorov). Namun 103 bit oleh Peter / ratchet tampaknya terikat dengan baik.
Marzio De Biasi
2
@Vor: Secara teknis mesin Turing yang menghasilkan jumlah bit yang benar ketika diberi teka-teki sudoku sebagai input terbatas karena set input terbatas, jadi "berapa banyak bit yang diperlukan untuk menggambarkan puzzle ini" adalah "sepele" dapat dihitung. Saya mengatakan bahwa kami benar-benar dapat menemukan mesin Turing secara eksplisit (pada prinsipnya, perhitungannya akan memakan waktu terlalu lama), karena tidak bisa lebih sulit daripada menghitung awalan terbatas nomor Omega.
Aaron Sterling
5

Anda tidak perlu tabel pencarian lengkap untuk mencapai kompresibilitas optimal. Saya percaya bahwa komputer modern yang menggunakan tabel look-up yang sangat masuk akal dapat menghitung jumlah Sudokus yang dibatasi , yaitu Sudokus dengan beberapa digit yang sudah ada. Menggunakan ini, inilah cara Anda menyandikan (decoding mirip).

d1N1d1d2N2d1d2N=iNi

72.4

Sunting: Halaman Wikipedia tentang matematika Sudoku membantu kami mengklarifikasi gambar. Juga membantu adalah tabel yang disusun oleh Ed Russell .

Ternyata jika Anda hanya mempertimbangkan tiga baris teratas, maka pada dasarnya hanya ada 44 konfigurasi yang berbeda untuk dipertimbangkan. Dalam tabel, Anda dapat menemukan jumlah total konfigurasi yang setara dengan yang diberikan (dengan asumsi bahwa baris teratas adalah 123456789), dan jumlah total penyelesaian masing-masing. Diberikan Sudoku, berikut ini cara menghitung angka ordinalnya:

  1. Normalisasikan konfigurasi sehingga baris teratasnya adalah 123456789.
  2. Cari tahu dari 44 konfigurasi berbeda yang dimiliki. Artikel Wikipedia memberikan algoritma untuk itu. Tabel ini mencantumkan jumlah kelas ekivalensi untuk setiap konfigurasi, serta jumlah penyelesaian.
  3. Tentukan nomor urut konfigurasi dari tiga baris teratas di dalam kelas ekivalennya. Ini dapat dilakukan dengan dua cara: baik menggunakan daftar semua kelas kesetaraan (ada total 36288 di semua kelas kesetaraan), atau dengan menemukan cara untuk dengan cepat menyebutkan semuanya.
  4. Normalisasi baris yang tersisa dengan mengurutkan baris 4-6 dan 7-9 dengan kolom pertama mereka, dan kemudian mengurutkan dua blok baris ini dengan cara yang sewenang-wenang. Ini mengurangi jumlah penyelesaian dengan faktor 72.
  5. 220
  6. ijkCi,DiCi+jDi+k9!72

Prosedur ini dapat dibalik, dan akan menghasilkan Sudoku dari nomor urut. Perhatikan bahwa pencacahan Sudoku telah dikurangi menjadi beberapa menit (pada tahun 2006; lihat halaman pembicaraan artikel Wikipedia) atau kurang, jadi saya berharap bahwa pada komputer modern pendekatan ini akan sangat praktis dan membutuhkan waktu beberapa detik atau kurang.

Yuval Filmus
sumber
2
Apakah mungkin menghitung solusi untuk membatasi sudoku secara efisien? Ini # P-selesai jika Anda menggeneralisasi ukuran dan Anda membiarkan kosong di tempat sewenang-wenang.
Tsuyoshi Ito
2
Seperti yang saya singgung dalam jawaban saya, pengkodean aritmatika akan mencapai kompresi yang hampir optimal untuk skenario ini.
Peter Shor
1
Anda mungkin benar, tetapi klaim Anda menyiratkan bahwa jumlah grid sudoku (6,67 × 10 ^ 21) mudah untuk dihitung pada komputer modern. Memang mungkin untuk menghitung, tetapi apakah itu mudah?
Tsuyoshi Ito
2
Saya mendapat kesan itu dari salah satu makalah yang menjelaskan cara melakukan perhitungan. Anda bahkan bisa menghitung beberapa data "lebih berat" dalam preprocessing dan menyimpannya dalam tabel berukuran cukup besar - peningkatan kecepatan bisa dramatis. Sejauh yang saya ingat, hanya butuh beberapa jam, dan itu beberapa tahun yang lalu. Sekarang anggaplah Anda menggunakan tabel untuk membuatnya 1000 kali lebih cepat. Terlebih lagi, pada setiap tahap jumlahnya berkurang secara eksponensial, sehingga sebagian besar pekerjaan mungkin terkonsentrasi pada tahap pertama.
Yuval Filmus
1
@tsuyoshi Saya percaya bahwa ada beberapa versi / ekstensi BDD yang membuat komputasinya relatif mudah - saya perlu melakukan sedikit penggalian untuk itu, tetapi saya tahu bahwa mereka telah digunakan untuk beberapa masalah penghitungan kombinatorial yang cukup rumit.
Steven Stadnicki
4

Berikut ini adalah algoritma yang saya duga akan menghasilkan pengkodean yang cukup bagus. Anda telah menyelesaikan sudoku yang ingin Anda kompres, dan katakanlah Anda telah menyandikan beberapa selnya, jadi ada sebagian sudoku (tidak harus dengan solusi unik) dengan beberapa sel terisi.

Gunakan algoritma tetap untuk menghitung berapa banyak angka yang dapat ditempatkan ke setiap sel kosong. Temukan sel pertama secara leksikografis ke mana jumlah terkecil dari nomor yang berbeda dapat ditempatkan, dan mengkodekan salah satu dari angka-angka ini masuk ke dalamnya (jadi jika sel hanya dapat berisi 3, 7, atau 9, 3 dikodekan oleh "0 ", 7 oleh" 1 "dan 9 oleh" 2 "). Encode urutan yang dihasilkan dengan menggunakan pengkodean aritmatika (yang memperhitungkan jumlah angka yang mungkin dimiliki sel).

Saya tidak tahu berapa lama urutan biner yang dihasilkan, tetapi saya menduga itu cukup singkat, terutama jika algoritma Anda untuk menghitung berapa banyak angka yang dapat ditempatkan ke dalam sel cukup canggih.

Jika Anda memiliki algoritme yang baik yang memperkirakan probabilitas setiap sel yang berisi angka tertentu, Anda bisa melakukannya lebih baik lagi.

Peter Shor
sumber
3

Setiap komentar dan kritik diterima

69.96171.72

1.) Menyimpan puzzle berarti menyimpan solusi (informasi secara teoritis).

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

vs.
sumber
1

Ini untuk melaporkan implementasi pengkodean sudoku yang lengkap (mirip dengan saran oleh Zurui Wang 9/14/11).

Inputnya adalah baris teratas dan 3 digit pertama dari baris kedua. Ini dikurangi menjadi 1-9! dan 1-120 dan digabungkan menjadi <= 4.4x10 ^ 7. Ini digunakan sebagai givens untuk menghitung secara leksikografis semua sukokus parsial dari 30 digit hingga urutan yang cocok. Kemudian penghitungan akhir hingga seluruh 81 digit dilakukan dengan cara yang sama. 3 sekuens ini disimpan sebagai bilangan bulat 32-bit dari maks 26 bit, sehingga dapat dikompresi lebih lanjut. Seluruh proses memakan waktu sekitar 3 menit, dengan 30 digit pertama menghabiskan sebagian besar waktu. Penguraiannya mirip - kecuali pencocokan jumlah alih-alih sudokus.

Segera hadir - Revisi mencakup 3 digit pertama baris kedua dalam enumerasi 30 digit penyelesaian (kode 32-bit kedua), perbandingan dengan enumerasi Jarvis (Jscott, 3/1615)

jscott
sumber
1
FYI: Jika Anda membuat dua akun dan ingin menggabungkannya, lihat cstheory.stackexchange.com/help/merging-accounts
DW
0

Saya akan pergi dengan analisis sederhana berikut:

Setiap nilai dapat disimpan dalam 4 bit (berkisar 1-9, tiga bit ini bahkan memungkinkan untuk 0-16)

9×9=81

8×8

Saya kira saya bisa menguranginya menjadi:

b=log2(v)(n1)

dimana

v

n

Sunting: Neo Style: Saya tahu Lateks.

Alfa
sumber
-2

Angka itu berbeda untuk setiap Sudoku. Salah satu aturan untuk Sudoku adalah memiliki satu solusi.

Jadi jika Anda melihat contoh, itu adalah jumlah minimum data yang harus Anda simpan.

Jika Anda bekerja dari sisi yang berlawanan, Anda dapat menghapus digit demi digit dan menjalankan solver pada hasilnya untuk melihat apakah masih memiliki satu solusi. Jika demikian, Anda dapat menghapus digit lainnya. Jika tidak, Anda harus mengembalikan digit ini dan coba yang lain. Jika Anda tidak bisa, Anda telah menemukan minimum.

Karena sebagian besar teka-teki mulai kosong, enkode panjang run mungkin akan menghasilkan hasil yang baik.

Aaron Digulla
sumber
Pendekatan serakah ini belum tentu mencapai minimum, mungkin Anda harus memilih dengan hati-hati digit mana yang harus dihapus di setiap langkah.
Diego de Estrada
Itu hanya sebuah contoh. Google untuk "generator teka-teki sudoku" untuk mendapatkan yang lebih canggih.
Aaron Digulla
5
Saya benar-benar tidak mengerti mengapa Anda mengharapkan ini bekerja dengan sangat baik. Ini sepertinya lebih merupakan perasaan daripada jawaban.
Joe Fitzsimons