Mã hóa hiệu quả các câu đố sudoku


16

Việc chỉ định bất kỳ lưới 9x9 tùy ý yêu cầu đưa ra vị trí và giá trị của mỗi ô vuông. Một mã hóa ngây thơ cho điều này có thể cung cấp bộ ba 81 (x, y, value), yêu cầu 4 bit cho mỗi x, y và giá trị (1-9 = 9 giá trị = 4 bit) cho tổng số 81x4x3 = 972 bit. Bằng cách đánh số cho mỗi ô vuông, người ta có thể giảm thông tin vị trí xuống còn 7 bit, giảm một bit cho mỗi ô vuông và tổng cộng 891 bit. Bằng cách chỉ định một thứ tự được xác định trước, người ta có thể giảm mạnh hơn chỉ còn 4 bit cho mỗi giá trị cho tổng số 324 bit. Tuy nhiên, một sudoku có thể thiếu số. Điều này cung cấp tiềm năng để giảm số lượng số phải được chỉ định, nhưng có thể yêu cầu các bit bổ sung để chỉ vị trí. Sử dụng mã hóa 11 bit của chúng tôi (vị trí, giá trị), chúng tôi có thể chỉ định một câu đố với manh mối với11 nn11n bit, ví dụ: câu đố tối thiểu (17) yêu cầu 187 bit. Mã hóa tốt nhất mà tôi nghĩ đến cho đến nay là sử dụng một bit cho mỗi không gian để cho biết liệu nó có được điền hay không và nếu có thì 4 bit sau đây sẽ mã hóa số. Điều này đòi hỏi bit, 149 cho một câu đố tối thiểu ( ). Có một mã hóa hiệu quả hơn, tốt nhất là không có cơ sở dữ liệu của mỗi thiết lập sudoku hợp lệ? (Điểm thưởng khi giải quyết một chung từ câu đố)n = 17 n N × N81+4nn=17nN×N

Nó chỉ xảy ra với tôi rằng nhiều câu đố sẽ là một phép quay của một câu đố khác, hoặc có một hoán vị đơn giản của các chữ số. Có lẽ điều đó có thể giúp giảm các bit cần thiết.

Theo Wikipedia ,

Số lượng lưới giải pháp Sudoku 9 × 9 cổ điển là 6.670,903,752,021,072,936,960 (chuỗi A107739 trong OEIS), hoặc khoảng .6.67×1021

Nếu tôi thực hiện đúng phép toán của mình ( ), điều đó xuất hiện tới 73 (72.498) bit thông tin cho bảng tra cứu.ln(6,670,903,752,021,072,936,960)ln(2)

Nhưng:

Số lượng các giải pháp cơ bản khác nhau, khi các đối xứng như xoay, phản xạ, hoán vị và tái định vị được tính đến, được chỉ ra là 5,472,730,538 [15] (trình tự A109741 trong OEIS).

Điều đó mang lại 33 (32,35) bit, do đó, có thể là một phương pháp thông minh để chỉ ra hoán vị nào được sử dụng có thể nhận được dưới 73 bit đầy đủ.


1
Ha, ban đầu tôi đã đăng một số thứ mà không nghĩ về vấn đề đủ khó. Tôi đã xóa nó. Câu hỏi tuyệt vời!
Patrick87

Bạn có thể nhắc chúng tôi có bao nhiêu câu đố Sudoku không, vì vậy chúng tôi biết khoảng cách giữa các bảng mã dễ giải mã này và một bảng liệt kê lực lượng vũ phu?
Gilles 'SO- ngừng trở thành ác quỷ'

Bạn cần có khả năng mã hóa tất cả các lưới , do đó bạn cần 73 bit (giả sử mã hóa có độ dài cố định). Không có phương pháp thông minh nào trong việc chỉ ra hoán vị sử dụng nào sẽ giúp bạn làm điều đó. 6.67×1021
Svick

@sick Từ quan điểm lý thuyết thông tin, tôi nghĩ bạn phải đúng, nhưng tôi không thể tìm ra nơi mà các bit bổ sung đến từ đâu. Có hoán vị, là 19 bit, cộng với 3 cho gương và xoay, vì vậy 22 cộng với 33 cho các câu đố độc đáo, tạo ra 55; 18 người kia đến từ đâu? 9!
Kevin

Câu trả lời:


5

Có một mã hóa hiệu quả hơn, tốt nhất là không có cơ sở dữ liệu của mỗi thiết lập sudoku hợp lệ?

Đúng. Tôi có thể nghĩ về một mã hóa cải thiện mã hóa 149 bit của bạn cho câu đố 9 × tối thiểu trong 6 hoặc 9 bit, tùy thuộc vào một điều kiện. Điều này là không có cơ sở dữ liệu hoặc bất kỳ đăng ký của các giải pháp khác hoặc bảng một phần. Nó đi từ đây:9×9

Đầu tiên, bạn sử dụng bit để mã hóa một số m với số lần xuất hiện tối thiểu trong bảng. 4 bit tiếp theo mã hóa số thực tế lần m xuất hiện. 7 bit tiếp theo mã hóa từng vị trí trong đó m xuất hiện.4m4m7m

Sau đây bit là cờ chỉ ra liệu còn lại các vị trí có một số hay không (bạn chỉ cần bỏ qua các vị trí trong đó m là). Bất cứ khi nào một trong số các bit này xuất hiện , thì 3 bit tiếp theo sẽ chỉ ra số đó là gì (trong tập hợp thứ tự { 1 , Lít , 9 } không có m ). Ví dụ: nếu m = 4 và 3 bit là , thì số ở vị trí tương ứng trên bảng là số 5 (tính từ 0) trong tập { 1 , 2 , 3 ,81m1{1,,9}mm=4101 , vì vậy nó là 6 . Các số j < m sẽ được mã hóa dưới dạng nhị phân là j - 1 , trong khi các số j > m sẽ được mã hóa thành j - 2 . Vì chúng ta đã viết vị trí, chỉ 3 bit ( n - ) sẽ được thêm vào để mã hóa phần còn lại của bảng trong bước này.{1,2,3,5,6,7,8,9}6j<mj1j>mj23(n)

Do đó, tổng số bit cần thiết để mã hóa bảng bằng thủ tục này là

B= =4+4+7+(81-)+3(n-)= =89+3+3n.

Đối với , chúng tôi lưu ý rằng có thể là 0 hoặc 1 (nói chung, n / 9 ). Do đó, B có thể là 140 hoặc 143 tùy thuộc vào việc có một số không xuất hiện trên bảng hay không.n= =17n/9B

Thật đáng để chỉ ra rằng giải pháp của Kevin là cách tốt hơn trong trường hợp chung. Đây mã hóa sử dụng nhiều nhất là 149 bit chỉ cho , hoặc cho n = 20 với điều kiện là = 0 . Ít nhất nó cho thấy một ý tưởng chung về cách tận dụng thực tế là N = 9 là rất gần với 2 log 2 N (có nghĩa là chúng ta có xu hướng "bộ nhớ mất" bằng cách sử dụng 4 bit cho mỗi giá trị, kể từ 4 bit cho phép chúng tôi cũng thể hiện N = 16 số.n{17,18,19}n= =20= =0N= =92đăng nhập2NN= =16


n= =17

.  .  .   .  .  .   .  1  .
4  .  .   .  .  .   .  .  .
.  2  .   .  .  .   .  .  .

.  .  .   .  5  .   4  .  7
.  .  8   .  .  .   3  .  .
.  .  1   .  9  .   .  .  .

3  .  .   4  .  .   2  .  .
.  5  .   1  .  .   .  .  .
.  .  .   8  .  6   .  .  .

m= =70111= =10001m360100100011100010100100

0110140000000100101100m= =71101,2,3,4,5,6,số 8,9111

// m=7, l=1 and its position on the board.
011100010100100
// Numbers 1 and 4 at the beginning. Note that 1 is encoded 000, and 4 is 011.
0000000100001011
// Numbers 2 and 5.
0000000001001000000000001100
// Numbers 4 and 8. We skip the appearance of 7 and encode 8 as 110.
010110001110
// 3, 1 and 9. 9 is encoded as 111.
00010100000100001111
// 3, 4, 2, 5, 1, 8, 6 and the last empty cells.
0000101000101100100100011000100000000000111001101000

Mã hóa hoàn chỉnh là 01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000và người đọc có thể kiểm tra độ dài của chuỗi đó thực sự là 143 :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.