Số bit tối thiểu cần thiết để lưu trữ câu đố sudoku là bao nhiêu?


28

Lưu ý: Đây là về câu đố sudoku 9x9 tiêu chuẩn. Các giải pháp chỉ phải hỗ trợ giải quyết, câu đố pháp lý . Vì vậy, một giải pháp không cần phải hỗ trợ các ô trống và có thể dựa vào các thuộc tính của câu đố sudoku đã giải.

Tôi đã tự hỏi điều này, nhưng tôi không thể nghĩ ra câu trả lời mà tôi hài lòng. Một giải pháp ngây thơ sẽ sử dụng một byte cho mỗi ô (81 ô), tổng cộng 648 bit. Một giải pháp phức tạp hơn sẽ lưu trữ toàn bộ câu đố sudoku trong một số cơ bản 9 (một chữ số trên mỗi ô) và yêu cầu bit.log2(981))=257

Nhưng nó vẫn có thể được cải thiện, ví dụ, nếu bạn biết 8 trong số 9 số trong một subgrid 3x3, bạn có thể suy ra một cách tầm thường số 9. Bạn có thể tiếp tục những suy nghĩ này đến mức câu hỏi này sôi nổi với số lượng sudokus được giải quyết duy nhất là bao nhiêu? Bây giờ bạn có thể sử dụng một bảng tra cứu khổng lồ ánh xạ từng số nhị phân vào câu đố sudoku, nhưng đó sẽ không phải là một giải pháp có thể sử dụng được.

Vì vậy, câu hỏi của tôi:

Không sử dụng bảng tra cứu, số lượng bit tối thiểu cần thiết để lưu trữ câu đố sudoku là bao nhiêu và với thuật toán gì?


3
Có thực sự có một sự khác biệt về chất giữa việc bỏ đi số thứ 9 trong 3x3, hàng hoặc cột và chỉ lưu trữ sudoku tối thiểu với các khoảng trống có giải pháp duy nhất đó không? "Không cần hỗ trợ các ô trống" là một chút cá trích đỏ nếu giải pháp tối ưu nhất thiết phải có.
Wooble

19
Bởi vì có sudoku đã giải được 6,67 × 10 ^ 21 (Hồi QSCGZật 2003; Felgenhauer và Jarvis 2005) và log_2 (6,67 × 10 ^ 21) = 72,4, giới hạn dưới là 73 bit (ngay cả khi bạn sử dụng tra cứu bảng lớn) . Nếu bạn không phải phân biệt các giải pháp cơ bản giống hệt nhau về mặt đối xứng, thì giới hạn dưới này không áp dụng.
Tsuyoshi Ito

9
Câu hỏi này sẽ làm cho một cuộc thi lập trình tốt.
Peter Shor

1
Giới hạn dưới tương tự cho các giải pháp cơ bản giống hệt nhau là 33 bit.
Charles

3
Tại sao bạn cần một bảng tra cứu? Bạn chỉ có thể liệt kê từng giải pháp Sudoku cho đến khi đạt được số lượng mong muốn.
Zirui Wang

Câu trả lời:


19

Dọc theo cùng dòng với câu trả lời của ratchet freak, nếu bạn điền vào các ô không được gắn dấu sao trong ma trận sau, một hộp 3x3 tại một thời điểm, luôn chọn hộp tiếp theo để điền vào một ô chia sẻ các hàng hoặc cột với một hộp bạn Bạn đã điền, bạn nhận được một mẫu như sau cho số lượng lựa chọn cho mỗi bước (điền vào ô giữa trên cùng trước, hộp trên cùng bên phải tiếp theo, v.v.).

Trong mỗi hộp 3x3 sau hộp đầu tiên, khi bạn đã điền vào một hàng hoặc cột của hộp, ba trong số sáu chữ số còn lại được định vị thành một hàng. Chọn vị trí của họ trước, và sau đó điền vào ba ô còn lại. (Vì vậy, thứ tự thực tế của các ô cần điền có thể khác nhau tùy thuộc vào những gì bạn đã biết, nhưng số lượng lựa chọn không bao giờ nhiều hơn những gì tôi đã hiển thị.)

Sau khi bạn điền vào các ô này, các ngôi sao đều được xác định.

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

Nếu tôi đã tính toán chính xác, điều này mang lại 87 bit. Có một số khoản tiết kiệm bổ sung cần có trong khối 3x3 cuối cùng, theo nhận xét của Peter Shor: mọi giá trị được định vị ở một trong bốn ô và mỗi hàng chứa ít nhất một ô chỉ có bốn giá trị có thể, vì vậy chắc chắn các yếu tố trong đó khối nên bắt đầu bằng 4 chứ không phải 6, nhưng tôi không hiểu các yếu tố còn lại trong câu trả lời của Shor.


4
Bạn cũng có thể giảm số lượng lựa chọn khi bạn điền vào ô 3x3 thứ sáu. Hộp này trở thành 4,3,2 / 3,2,1 / 2,1,1 cho tổng số 83 bit, nếu tôi tính toán chính xác.
Peter Shor

@Peter - không. 3 số bên phải có thể giống như các số trên. Bạn không biết tất cả chúng là khác biệt. Các số duy nhất được đảm bảo nhất là 3 vì vậy hộp đầu tiên là một lựa chọn trong số sáu mặt hàng. (Một địa điểm này là một ví dụ. Điều này cũng đúng với những người khác.)
Hogan

@David - theo nhận xét của tôi cho Peter Tôi không nghĩ số của bạn sai. Trong hộp thứ 2 bạn có 6 5 4 4 3 2 3 2 1tôi tin rằng nó cần phải 6 5 4 6 5 4 3 2 1dành cho trường hợp xấu nhất.
Hogan

Hogan, không, hãy xem phần trong câu trả lời của tôi về "một khi bạn đã điền vào một hàng hoặc cột của hộp, bạn luôn có thể chọn hàng hoặc cột tiếp theo để điền vào một trong đó có nhiều nhất bốn giá trị có thể "
David Eppstein

@David - Cho phép gắn nhãn 3 x 3s 1,1 1,2 1,3 từ trái sang phải từ trên xuống dưới. Hãy để các Squares A - Tôi đi từ trái sang phải từ trên xuống dưới. Vị trí D trong 1,3 biết 3 số trong 3x3 nằm ở (A, B, C) và nó biết 3 số trong 1,2 (D, E, F) nhưng không biết 6 số đó khác nhau. Chúng có thể là 3 số giống nhau từ hộp 3,1 và 2,1 do đó có MAX 6 lựa chọn.
Hogan

13

tiếp tục với câu trả lời của @ peter đây là danh sách trường hợp xấu nhất cho mỗi ô khi bạn điền từ đầu vào bên trái từ trên cùng bên trái

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

điều này làm cho 4,24559E + 29 độ ổn định hoặc 99 bit

chỉnh sửa: quên rằng hình vuông cuối cùng được xác định đầy đủ bởi tất cả những người khác


Rất đẹp!! Hãy để tôi nói thêm rằng tôi không rõ ràng rằng bạn có thể đạt được những khả năng tồi tệ nhất này cho một giải pháp Sudoku thực sự (đặc biệt là nếu bạn sử dụng một thuật toán tinh vi sử dụng một số kỹ thuật Sudoku để thu hẹp các khả năng mà các số có thể đi trong một ô ).
Peter Shor

@peter nhưng bạn cần thêm các thu hẹp trong en và giải mã và tôi nhận ra rằng nếu bạn phải chọn một và không sửa thứ tự (cách dễ nhất nhưng thực sự không tối ưu), bạn cũng cần thêm nó vào mã hóa
ratchet freak

Không, nếu bạn sử dụng cùng một thuật toán để tìm ra ô tốt nhất trong quy trình giải mã và giải mã, nó sẽ cung cấp cho cùng một ô (vì nó hoạt động trên cùng một dữ liệu), vì vậy các quy trình giải mã và giải mã sẽ được đồng bộ hóa, và bạn không phải thêm thứ tự vào bảng mã. Ý tưởng này cũng làm cho thuật toán nén dữ liệu LZW hoạt động.
Peter Shor

Tôi nghĩ rằng các bit tối thiểu cần thiết để lưu trữ một câu đố sudoku hợp lệ không phải là một hàm tính toán (Kolmogorov). Tuy nhiên, 103 bit của Peter / ratchet có vẻ là một ràng buộc tốt.
Marzio De Biasi

2
@Vor: Về mặt kỹ thuật, máy Turing tạo ra số bit chính xác khi đưa ra câu đố sudoku vì đầu vào là hữu hạn vì tập hợp đầu vào là hữu hạn, do đó "cần bao nhiêu bit để mô tả câu đố này" có thể tính toán được "tầm thường". Tôi đang nói rằng chúng ta thực sự có thể tìm thấy một máy Turing như vậy một cách rõ ràng (về nguyên tắc, việc tính toán sẽ mất quá nhiều thời gian), bởi vì nó không thể khó hơn việc tính tiền tố hữu hạn của số Omega.
Aaron Sterling

5

Bạn không cần một bảng tra cứu đầy đủ để đạt được độ nén tối ưu. Tôi tin rằng các máy tính hiện đại sử dụng bảng tra cứu rất hợp lý có thể đếm số lượng Sudokus bị ràng buộc , đó là Sudokus với một số chữ số đã có. Sử dụng cái này, đây là cách bạn mã hóa (giải mã tương tự).

Sửa một thứ tự của các hình vuông. Giả sử số trên hình vuông đầu tiên là . Đặt N 1 là số Sudokus có hình vuông đầu tiên nhỏ hơn d 1 . Gọi bây giờ d 2 là số của hình vuông thứ hai. Đặt N 2 là số Sudokus có hình vuông thứ nhất là d 1 và hình vuông thứ hai nhỏ hơn d 2 . Và như vậy. Số mã hóa là N = Σ i N i .d1N1d1d2N2d1d2N=iNi

Phương pháp mã hóa này được gọi là mã hóa nhị thức trong tài liệu. Nó sẽ cho phép bạn tính toán một cách hiệu quả (theo nghĩa thực tế) tính toán chỉ số của bất kỳ Sudoku cụ thể nào và ngược lại. Sau đó, bạn sẽ chỉ yêu cầu bit, như đã nói ở trên (điều này có nghĩa là bạn có thể mã hóa một vài trong số chúng với số bit trung bình đó).72.4

Chỉnh sửa: Trang Wikipedia về toán học của Sudoku giúp chúng ta làm rõ bức tranh. Cũng hữu ích là một bảng được biên soạn bởi Ed Russell .

Nó chỉ ra rằng nếu bạn chỉ xem xét ba hàng trên cùng, thì về cơ bản chỉ có 44 cấu hình khác nhau để xem xét. Trong bảng, bạn có thể tìm thấy tổng số cấu hình tương đương với bất kỳ cấu hình nào (giả sử rằng hàng trên cùng là 123456789) và tổng số lần hoàn thành của mỗi cấu hình. Đưa ra một Sudoku, đây là cách chúng ta sẽ tính số thứ tự của nó:

  1. Bình thường hóa cấu hình để hàng trên cùng của nó là 123456789.
  2. Tìm ra cấu hình nào trong số 44 cấu hình khác nhau. Bài viết Wikipedia đưa ra một thuật toán cho điều đó. Bảng liệt kê số lượng các lớp tương đương cho mỗi cấu hình, cũng như số lần hoàn thành.
  3. Xác định số thứ tự của cấu hình của ba hàng trên cùng trong lớp tương đương của nó. Điều này có thể được thực hiện theo hai cách: hoặc sử dụng danh sách tất cả các lớp tương đương (có tổng cộng 36288 trong tất cả các lớp tương đương) hoặc bằng cách tìm cách liệt kê nhanh tất cả chúng.
  4. Bình thường hóa các hàng còn lại bằng cách sắp xếp các hàng 4-6 và 7-9 theo cột đầu tiên của chúng, sau đó sắp xếp hai khối hàng này theo một cách tùy ý. Điều này làm giảm số lần hoàn thành theo hệ số 72.
  5. 220
  6. ijkCi,DiCi+jDi+k9!72

Quy trình này có thể đảo ngược và sẽ tạo ra Sudoku từ một số thứ tự. Lưu ý rằng phép liệt kê Sudoku đã giảm xuống một vài phút (năm 2006; xem trang thảo luận của bài viết Wikipedia) hoặc ít hơn, vì vậy tôi hy vọng rằng trên một máy tính hiện đại, cách tiếp cận này sẽ rất thực tế và mất vài giây hoặc ít hơn.


2
Có thể đếm các giải pháp cho sudoku bị ràng buộc một cách hiệu quả? Nó hoàn thành # P nếu bạn khái quát kích thước và bạn cho phép khoảng trống ở những nơi tùy ý.
Tsuyoshi Ito

2
Như tôi đã đề cập trong câu trả lời của mình, mã hóa số học sẽ đạt được mức nén gần như tối ưu cho kịch bản này.
Peter Shor

1
Bạn có thể đúng, nhưng yêu cầu của bạn ngụ ý rằng số lưới sudoku (6,67 × 10 ^ 21) rất dễ tính toán trên một máy tính hiện đại. Nó thực sự có thể tính toán, nhưng nó có dễ không?
Tsuyoshi Ito

2
Tôi đã có ấn tượng đó từ một trong những bài báo mô tả cách thực hiện phép tính. Bạn thậm chí có thể tính toán một số dữ liệu "nặng hơn" trong quá trình tiền xử lý và lưu trữ nó trong một bảng có kích thước hợp lý - tốc độ tăng có thể rất lớn. Theo tôi nhớ, họ chỉ mất vài giờ, và vài năm trước. Bây giờ giả sử bạn sử dụng một bảng để làm cho nó nhanh gấp 1000 lần. Hơn nữa, ở mỗi giai đoạn, số lượng giảm theo cấp số nhân, vì vậy hầu hết các công việc có lẽ tập trung ở giai đoạn đầu tiên.
Yuval Filmus

1
@tsuyoshi Tôi tin rằng có một số phiên bản / phần mở rộng của BDD làm cho việc tính toán tương đối đơn giản - Tôi cần thực hiện một chút đào bới cho nó, nhưng tôi biết rằng chúng đã được sử dụng cho một số vấn đề đếm kết hợp khá phức tạp.
Steven Stadnicki

4

Đây là một thuật toán mà tôi nghi ngờ sẽ tạo ra một mã hóa khá tốt. Bạn có sudoku đã hoàn thành mà bạn muốn nén và giả sử bạn đã mã hóa một số ô của nó, do đó, có một sudoku một phần (không nhất thiết phải có một giải pháp duy nhất) với một số ô được điền vào.

Sử dụng một thuật toán cố định để đếm số lượng có thể được đặt vào mỗi ô trống. Tìm ô đầu tiên theo từ vựng, trong đó có thể đặt số lượng nhỏ nhất của các số khác nhau và mã hóa một trong những số này vào trong đó (vì vậy nếu một ô chỉ có thể chứa 3, 7 hoặc 9, thì 3 được mã hóa bằng "0 ", 7 bằng" 1 "và 9 bằng" 2 "). Mã hóa chuỗi kết quả bằng cách sử dụng mã hóa số học (có tính đến số lượng số có thể có mà một ô có thể chứa).

Tôi không biết chuỗi nhị phân kết quả sẽ kéo dài bao lâu, nhưng tôi nghi ngờ nó khá ngắn, đặc biệt là nếu thuật toán của bạn để đếm có bao nhiêu số có thể được đặt vào một ô là khá phức tạp.

Nếu bạn có một thuật toán tốt ước tính xác suất của mỗi ô chứa một số đã cho, bạn có thể làm tốt hơn nữa.


3

Mọi ý kiến ​​và phê bình đều được chào đón

69.96171.72

1.) Lưu trữ câu đố ngụ ý lưu trữ giải pháp (thông tin về mặt lý thuyết).

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

Điều này là để báo cáo việc thực hiện mã hóa nhỏ gọn sudoku đã hoàn thành (tương tự như đề xuất của Zurui Wang 9/14/11).

Đầu vào là hàng trên cùng và 3 chữ số đầu tiên của hàng thứ 2. Những thứ này được giảm xuống còn 1-9! và 1-120 và kết hợp thành <= 4.4x10 ^ 7. Chúng được sử dụng như các givens để đếm từ vựng tất cả các sukokus một phần gồm 30 chữ số cho đến chuỗi phù hợp. Sau đó, số cuối cùng lên đến toàn bộ 81 chữ số được thực hiện theo cách tương tự. 3 chuỗi này được lưu trữ dưới dạng số nguyên 32 bit tối đa 26 bit, do đó có thể được nén thêm. Toàn bộ quá trình mất khoảng 3 phút, với 30 chữ số đầu tiên chiếm phần lớn thời gian. Việc giải mã là tương tự - ngoại trừ số lượng phù hợp thay vì sudokus.

Sắp có - Sửa đổi bao gồm 3 chữ số đầu tiên của hàng thứ 2 với số lần hoàn thành 30 chữ số (mã 32 bit thứ 2), so sánh với bảng liệt kê Jarvis (Jscott, 3/1615)


1
FYI: Nếu bạn đã tạo hai tài khoản và muốn hợp nhất chúng, hãy xem cstheory.stackexchange.com/help/merging-accounts
DW

0

Tôi sẽ đi với phân tích đơn giản sau đây:

Mỗi giá trị có thể được lưu trữ trong 4 bit (trong khoảng từ 1-9, ba bit này thậm chí cho phép 0-16)

9×9=81

8×8

Tôi đoán tôi có thể giảm nó xuống:

b=log2(v)(n1)

Ở đâu

v

n

Chỉnh sửa: Neo Style: Tôi biết latex.


-2

Con số đó là khác nhau đối với mỗi Sudoku. Một trong những quy tắc cho Sudoku là nó có chính xác một giải pháp.

Vì vậy, nếu bạn nhìn vào một ví dụ, đó là lượng dữ liệu tối thiểu mà bạn phải lưu trữ.

Nếu bạn làm việc từ phía đối diện, bạn có thể xóa chữ số theo chữ số và chạy một bộ giải trên kết quả để xem liệu nó có còn đúng một giải pháp hay không. Nếu vậy, bạn có thể xóa một chữ số khác. Nếu không, bạn phải khôi phục chữ số này và thử số khác. Nếu bạn không thể, bạn đã tìm thấy một mức tối thiểu.

Vì hầu hết các câu đố bắt đầu trống rỗng, mã hóa chiều dài chạy có thể sẽ mang lại kết quả tốt.


Cách tiếp cận tham lam này không nhất thiết phải đạt được mức tối thiểu, có lẽ bạn cần phải chọn cẩn thận chữ số nào cần loại bỏ trong mỗi bước.
Diego de Estrada

Đó chỉ là một ví dụ. Google cho "trình tạo câu đố sudoku" để có được những cái tinh vi hơn.
Aaron Digulla

5
Tôi thực sự không thấy lý do tại sao bạn mong đợi điều này sẽ thực hiện tốt. Đây chỉ là cảm giác ruột chứ không phải là một câu trả lời.
Joe Fitzsimons
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.