Яка мінімальна кількість біт, необхідна для зберігання головоломки судоку?


28

Примітка. Йдеться про стандартну головоломку судоку 9х9. Рішення має підтримувати лише вирішені головоломки . Таким чином, для рішення не потрібно підтримувати порожні клітинки і може покладатися на властивості вирішеної головоломки судоку.

Мені це було цікаво, але я не міг придумати відповіді, якою задоволений. Наївне рішення використовувало б один байт для кожної комірки (81 осередок), загальною кількістю 648 біт. Більш складне рішення дозволило б зберегти всю головоломку судоку в базовій кількості 9 (одна цифра на комірку) і вимагати біт.log2(981))=257

Але це все ще можна вдосконалити, наприклад, якщо ви знаєте 8 з 9 чисел у підмережі 3х3, ви можете тривіально вивести 9-е. Ви можете продовжити ці думки до того моменту, коли це питання зводиться до Яка кількість унікального вирішеного судокусу? Тепер ви можете використовувати величезну таблицю пошуку, яка відображає кожне двійкове число у головоломці судоку, але це не буде корисним рішенням.

Отже, моє запитання:

Без використання таблиці пошуку, яка мінімальна кількість бітів, необхідна для зберігання головоломки судоку та за допомогою якого алгоритму?


3
Чи дійсно є якісна різниця між тим, як залишити 9-е число у 3х3, рядку чи стовпчику та просто зберігати мінімальний судоку з порожніми пробілами, який має це унікальне рішення? "не потрібно підтримувати порожні клітини" - це трохи червона оселедець, якщо оптимальне рішення обов'язково потрібно.
Wooble

19
Оскільки 6,6 × 10 ^ 21 вирішених судоку ("QSCGZ" 2003; Felgenhauer і Jarvis 2005) та log_2 (6,67 × 10 ^ 21) = 72,4 ..., нижня межа становить 73 біти (навіть якщо ви використовуєте величезний пошук таблиці) . Якщо вам не доведеться розрізняти по суті однакові рішення з точки зору симетрії, ця нижня межа не застосовується.
Tsuyoshi Ito

9
Це питання може стати хорошим конкурсом програмування.
Пітер Шор

1
Аналогічна нижня межа для по суті однакових рішень - 33 біт.
Чарльз

3
Для чого потрібен оглядовий стіл? Ви можете просто перераховувати рішення судоку по одному, поки не досягнете потрібного числа.
Zirui Wang

Відповіді:


19

У відповідності з тими ж рядками, що і у відповіді на виродка храповика, якщо ви заповнюєте незіркові клітинки в наступній матриці, 3x3 вікно за один раз, завжди вибираючи наступне поле для заповнення, щоб воно було таким, яке розділяє рядки або стовпці з полем, яке ви Ви вже заповнили, ви отримуєте такий зразок, як наступний, для кількості варіантів за крок (спочатку заповнюючи верхнє середнє поле, наступне верхнє праворучне поле тощо).

У кожному полі 3х3 після першого, після того, як ви заповнили один рядок або стовпець поля, три з решти шести цифр локалізовані в одному рядку. Спершу виберіть їх місцеположення, а потім заповніть інші три комірки. (Отже, фактичний порядок заповнення комірок може змінюватися залежно від того, що ви вже знаєте, але кількість варіантів ніколи не перевищує те, що я показав.)

Після того, як ви заповнили ці клітини, всі зірки визначаються.

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

Якщо я обчислив правильно, це дає 87 біт. В останньому блоці 3x3, згідно з коментарем Пітера Шор, слід отримати додаткові заощадження: кожне значення локалізується на одній з чотирьох комірок, і кожен рядок містить щонайменше одну клітинку із лише чотирма можливими значеннями, тому, безумовно, фактори в цьому блок повинен починатися з 4, а не з 6, але я не розумію решти факторів у відповіді Шор.


4
Ви можете також зменшити кількість варіантів, коли ви заповните шосте поле 3х3. Це поле стає 4,3,2 / 3,2,1 / 2,1,1 для загальної кількості 83 біт, якщо я правильно його обчислив.
Пітер Шор

@ Петер - ніпе. 3 числа праворуч можуть бути такими ж, як і цифри вище. Ви не знаєте, що всі вони відрізняються. Найбезпечніші унікальні номери - 3, тому перше поле - це вибір із шести предметів. (Це одне місце є прикладом. Це стосується і інших.)
Хоган

@David - переходячи за своїм коментарем до Петра, я не думаю, що ваші номери неправильні. 6 5 4 4 3 2 3 2 1Я вважаю, що у 2-му полі це має бути 6 5 4 6 5 4 3 2 1в гіршому випадку.
Хоган

Хоган, ні, дивіться частину моєї відповіді про "щойно ви заповнили один рядок або стовпець поля, ви завжди можете вибрати наступний рядок або стовпець, який потрібно заповнити, таким, у якому є щонайбільше чотири можливі значення "
Девід Еппштейн

@David - Дозволяє позначити 3 x 3s 1,1 1,2 1,3, що йде зліва направо зверху вниз. Нехай позначає квадрати А - я рухаюся зліва направо зверху вниз. Розташування D в 1,3 знає 3 числа в 3x3 воно знаходиться в (A, B, C), і воно знає 3 числа в 1,2 (D, E, F), але воно не знає, що ці 6 чисел відрізняються. Вони можуть бути однаковими 3 числами з поля 3,1 та 2,1, тому є варіанти MAX 6.
Хоган

13

продовжується відповідь @ peter ось список найгірших випадків для кожної комірки, коли ви заповнюєте її, починаючи з верхнього лівого кута

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

це робить для 424559E + 29 можливостей або 99 біт

редагувати: забув, що останній квадрат повністю визначається всіма іншими


Дуже хороша!! Дозвольте додати, що мені незрозуміло, що ви могли б досягти цих найгірших можливостей для справжнього рішення судоку (особливо, якщо ви використовуєте складний алгоритм, який використовує деякі методи судоку, щоб звузити можливості, за якими числа може йти в клітинку ).
Пітер Шор

@peter, але вам потрібно додати ті звуження в en та розшифровку, і я зрозумів, що якщо вам доведеться вибрати один і не виправити порядок (найпростіший спосіб, але насправді не оптимальний), вам потрібно додати це до кодування
ratchet freak

Ні, якщо ви використовуєте той самий алгоритм для визначення найкращої комірки в процедурі en- та декодування, вона дасть ту саму клітинку (оскільки вона працює над тими ж даними), тому процедури en- та декодування будуть синхронізовані, і вам не доведеться додавати замовлення до кодування. Ця ідея також змушує алгоритм стиснення даних LZW працювати.
Пітер Шор

Я думаю, що мінімальні біти, необхідні для зберігання дійсної головоломки судоку, не є обчислювальною функцією (Колмогоров). Однак 103 біта Пітера / храповика здаються гарною межею.
Marzio De Biasi

2
@ Vor: Технічно машина Тьюрінга, яка видає правильну кількість бітів, коли задана головоломка судоку, оскільки вхід кінцевий, оскільки набір вводу кінцевий, тому "скільки бітів потрібно для опису цієї головоломки", можна обчислити "тривіально". Я кажу, що ми могли насправді знайти таку машину Тьюрінга явно (в принципі, обчислення забиратимуться занадто довго), тому що це не може бути складніше, ніж обчислення кінцевого префіксу числа Omega.
Аарон Стерлінг

5

Вам не потрібна повна таблиця огляду для досягнення оптимальної стисливості. Я вважаю, що сучасні комп’ютери, що використовують дуже розумну таблицю огляду, здатні підрахувати кількість обмежених Sudokus, які є Sudokus з деякими цифрами. Використовуючи це, ось як кодувати (декодування схоже).

d1N1d1d2N2d1d2N=iNi

72.4

Редагувати: Сторінка Вікіпедії з математики Судоку допомагає нам з’ясувати картину. Також корисною є таблиця, складена Едом Расселом .

Виявляється, якщо розглядати лише перші три ряди, то по суті є лише 44 різні конфігурації. У таблиці ви можете знайти загальну кількість конфігурацій, еквівалентну будь-якій заданій (якщо припустити, що верхній рядок - 123456789), та загальну кількість доповнень кожного. Враховуючи судоку, ось як ми обчислимо його порядковий номер:

  1. Нормалізуйте конфігурацію так, щоб її верхній ряд був 123456789.
  2. Дізнайтеся, до якої з 44 різних конфігурацій вона належить. Стаття у Вікіпедії дає алгоритм для цього. У таблиці наведено кількість класів еквівалентності для кожної конфігурації, а також кількість доповнень.
  3. Визначте порядковий номер конфігурації трьох верхніх рядків всередині його класу еквівалентності. Це можна зробити двома способами: або за допомогою списку всіх класів еквівалентності (всього 36288 у всіх класах еквівалентності), або шляхом пошуку способу швидкого їх перерахування.
  4. Нормалізуйте решта рядків, сортувавши рядки 4-6 та 7-9 за першим стовпцем, а потім сортуючи ці два блоки рядків якимось довільним способом. Це зменшує кількість доповнень в 72 рази.
  5. 220
  6. ijkCi,DiCi+jDi+k9!72

Ця процедура є оборотною і призведе до отримання судоку з порядкового числа. Зауважте, що перерахування судоку було скорочено до декількох хвилин (у 2006 році; див. Сторінку розмов у статті Вікіпедії) або менше, тому я очікую, що на сучасному комп’ютері такий підхід був би дуже практичним і зайняв би кілька секунд або менше.


2
Чи можна ефективно підрахувати рішення обмеженого судоку? Він є # P-завершеним, якщо ви узагальнюєте розмір і допускаєте пробіли у довільних місцях.
Tsuyoshi Ito

2
Як я нагадав у своїй відповіді, арифметичне кодування дозволить досягти майже оптимальної компресії для цього сценарію.
Пітер Шор

1
Ви можете мати рацію, але ваше твердження передбачає, що кількість сучасних сіток судоку (6,67 × 10 ^ 21) легко обчислити на сучасному комп’ютері. Це справді можливо прорахувати, але чи легко це?
Tsuyoshi Ito

2
Я склав таке враження в одній з робіт, де описано, як зробити розрахунок. Ви можете навіть обчислити деякі "важчі" дані при попередній обробці та зберігати їх у таблиці з розумним розміром - збільшення швидкості може бути значним. Наскільки я пам’ятаю, це пройшло у них лише кілька годин, і це кілька років тому. Тепер припустимо, що ви використовуєте таблицю, щоб зробити її в 1000 разів швидшою. Більше того, на кожному етапі чисельність зменшується експоненціально, тому більша частина роботи, ймовірно, зосереджена на першому етапі.
Yuval Filmus

1
@tsuyoshi Я вважаю, що існує деяка версія / розширення BDD, що робить обчислення досить простими - мені потрібно було б трохи викопати для цього, але я знаю, що вони використовувалися для деяких досить складних проблем комбінаторного підрахунку.
Стівен Стадницький

4

Ось алгоритм, який я підозрюю, що створить досить хороше кодування. У вас є готовий судоку, який ви хочете стиснути, і скажімо, ви вже закодували деякі клітини його, тому є часткова судоку (не обов'язково унікальним рішенням), де кілька клітин заповнені.

За допомогою фіксованого алгоритму підрахуйте, скільки цифр можна розмістити в кожній порожній комірці. Знайдіть першу лексикографічно клітинку, в яку можна розмістити найменшу кількість різних чисел, і кодуйте, яке з цих чисел переходить до неї (так що, якщо комірка може містити лише 3, 7 або 9, 3 кодується символом "0 ", 7 за" 1 "і 9 за" 2 "). Кодуйте отриману послідовність за допомогою арифметичного кодування (яке враховує кількість можливих чисел, які може містити комірка).

Я не знаю, як довго триватиме отримана двійкова послідовність, але я підозрюю, що вона досить коротка, особливо якщо ваш алгоритм підрахунку кількості чисел може бути розміщений у комірці досить складний.

Якби у вас був хороший алгоритм, який оцінював вірогідність кожної комірки, що містить задане число, ви могли б зробити ще краще.


3

Будь-які зауваження та зауваження вітаються

69.96171.72

1.) Зберігання головоломки передбачає збереження розв’язання (інформація теоретично).

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

Це стосується повідомлення про реалізацію завершеного судоку компактного кодування (схоже на пропозицію Zurui Wang 9/14/11).

Вхід - це верхній рядок і 1-й 3 цифри 2-го ряду. Вони знижуються до 1-9! і 1-120 і об'єднані до <= 4,4x10 ^ 7. Вони використовуються як дані, щоб підрахувати лексикографічно всі часткові сукуліси з 30 цифр до відповідної послідовності. Тоді остаточне підрахунок до 81 цифри робиться так само. Ці 3 послідовності зберігаються у вигляді 32-бітових цілих чисел максимумом 26 біт, тому їх можна стиснути далі. Весь процес займає близько 3 хвилин, причому перші 30 цифр займають більшу частину часу. Розшифровка схожа - за винятком відповідних підрахунків замість sudokus.

Незабаром - Редакція включає 1-й 3 цифри 2-го рядка при перерахуванні 30-значного завершення (2-й 32-розрядний код), порівняння з перерахуванням Джарвіса (Jscott, 3/1615)


1
FYI: Якщо ви створили два облікові записи і хотіли б їх об’єднати, див. Cstheory.stackexchange.com/help/merging-accounts
DW

0

Я б пішов із таким простим аналізом:

Кожне значення може бути збережене в 4 бітах (від 1 до 9, ці три біти дозволяють отримати навіть 0-16)

9×9=81

8×8

Я думаю, я міг би зменшити його до:

b=log2(v)(n1)

де

v

n

Редагувати: Нео Стиль: Я знаю латекс.


-2

Це число різне для кожного судоку. Одне з правил Судоку полягає в тому, що він має рівно одне рішення.

Отже, якщо ви подивитесь на приклад, це мінімальний обсяг даних, який ви повинні зберігати.

Якщо ви працюєте з протилежної сторони, ви можете вийняти цифру за цифрою і запустити розв'язувач на результат, щоб побачити, чи все ще є рівно одне рішення. Якщо так, ви можете видалити іншу цифру. Якщо ні, потрібно відновити цю цифру і спробувати іншу. Якщо ви не можете, ви знайшли мінімум.

Оскільки більшість головоломок починаються здебільшого порожніми, кодування довжини пробігу, ймовірно, дасть хороші результати.


Цей жадібний підхід не обов'язково досягає мінімуму, можливо, вам потрібно ретельно вибрати, яку цифру потрібно видалити на кожному кроці.
Дієго де Естрада

Це просто приклад. Google для "генераторів головоломок судоку", щоб отримати більш складні.
Аарон Дігулла

5
Я дійсно не розумію, чому ви очікуєте, що це буде особливо добре. Це просто здається почуттям кишки, а не відповіддю.
Джо Фіцсімонс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.