数独パズルを保存するのに必要な最小ビット数は?


28

注:これは、標準の9x9の数独パズルに関するものです。ソリューションは、解決された法的パズルをサポートするだけです。そのため、ソリューションは空のセルをサポートする必要がなく、解決された数独パズルのプロパティに依存できます。

私はこれを疑問に思っていましたが、満足している答えを考えることができませんでした。単純なソリューションでは、各セル(81セル)に1バイト、合計648ビットを使用します。より洗練された解決策は、ベース9数(セルあたり一桁)全体数独パズルを記憶し、必要とするlog2(981))=257ビット。

しかし、それでも改善できます。たとえば、3x3サブグリッドの9つの数字のうち8つを知っていれば、9番目の数字を簡単に推測できます。これらの考えを続けて、この質問が具体的な解決された数独の量に至るまで続けることができますか?これで、各バイナリ番号を数独パズルにマップする巨大なルックアップテーブルを使用できますが、それは使用可能なソリューションではありません。

だから、私の質問:

ルックアップテーブルを使用しない場合、数独パズルを格納するために必要なビットの最小量とアルゴリズムは何ですか?


3
3x3、行、または列の9番目の数字を除外し、そのユニークな解決策を持つ最小の数独を空のスペースで保存するだけで、本当に質的な違いがありますか?「空のセルをサポートする必要はありません」は、最適なソリューションが必然的に必要とする場合、ちょっとしたニシンです。
ウーブル

19
ので6.67×10 ^ 21の数独が解決される(「QSCGZ」2003; Felgenhauerとジャービス2005)とlog_2(6.67×10 ^ 21)= 72.4を...、下限(あなたは、巨大なテーブルルックアップを使用している場合でも)、73ビットであり、 。対称性に関して本質的に同一のソリューションを区別する必要がない場合、この下限は適用されません。
伊藤剛

9
この質問は良いプログラミングコンテストになります。
ピーターショー

1
本質的に同一のソリューションの類似した下限は33ビットです。
チャールズ

3
ルックアップテーブルが必要な理由 目的の数に達するまで、数独ソリューションを1つずつ列挙することができます。
ジルイ王

回答:


19

ラチェットフリークの答えと同じ行に沿って、次のマトリックスのスターなしのセルを一度に3x3のボックスに入力すると、入力するボックスと行または列を共有する次のボックスを常に選択します既に入力済みの場合、ステップごとの選択肢の数について次のようなパターンが得られます(最初に上部中央のボックスに入力し、次に右上のボックスに入力するなど)。

1行目以降の各3x3ボックスでは、ボックスの1行または1列を入力すると、残りの6桁のうち3桁が1行にローカライズされます。最初に場所を選択してから、残りの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ビットになります。Peter Shorのコメントによると、最後の3x3ブロックにはいくつかの追加の節約があります:すべての値は4つのセルの1つにローカライズされ、すべての行には4つの可能な値を持つ少なくとも1つのセルが含まれているため、その要因ブロックは6ではなく4から開始する必要がありますが、Shorの答えの残りの要因がわかりません。


4
6番目の3x3ボックスに入力するときに、選択肢の数を減らすこともできます。正しく計算すると、このボックスは合計83ビットで4,3,2 / 3,2,1 / 2,1,1になります。
ピーターショー

@ピーター-いいえ。右側の3つの数字は、上記の数字と同じである可能性があります。あなたはそれらのすべてが明確であることを知りません。最も確実な一意の番号は3なので、最初のボックスは6つのアイテムから選択されます。(この1つの場所は一例です。他の場所にも当てはまります。)
ホーガン

@David-ピーターへのコメントで、あなたの番号が間違っているとは思わない。2番目のボックスには、最悪の場合に6 5 4 4 3 2 3 2 1対応する必要があると思います6 5 4 6 5 4 3 2 1
ホーガン

ホーガン、いや、「ボックスの1行または1列に入力したら、次の行または列をいつでも選択して、最大4つの可能な値があるようにすることができます。 "
デビッドエップシュタイン

@David-左から右へ上から下へ行く3 x 3s 1,1 1,2 1,3にラベルを付けます。正方形Aをラベル付けしましょう-左から右へ上から下へ行きます。1,3のロケーションDは、3x3の3つの数字(A、B、C)を知っており、1,2(D、E、F)の3つの数字を知っていますが、これらの6つの数字が異なることはわかりません。ボックス3、1、および2からの同じ3つの数字である可能性があるため、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

これは、4,24559E + 29の可能性または99ビットになります

編集:最後の正方形が他のすべての人によって完全に決定されることを忘れた


非常に素晴らしい!!実際の数独ソリューションでこれらの最悪のケースの可能性を達成できるかどうかは明確ではないことを付け加えます(特に、数独の手法を使用してセルに入力できる可能性を絞り込む洗練されたアルゴリズムを使用する場合)。
ピーターショー

@peterしかし、enとデコードでこれらの絞り込みを追加する必要があります。1つを選択する必要があり、順序を修正しない場合(最も簡単な方法ですが、実際には最適ではない)、エンコードにも追加する必要があることに気付きました
ラチェットフリーク

いいえ、同じアルゴリズムを使用してen-およびデコード手順で最適なセルを決定すると、同じセルが得られます(同じデータを処理しているため)。したがって、en-およびデコード手順は同期されます。エンコードに順序を追加する必要はありません。この考え方により、LZWデータ圧縮アルゴリズムも機能します。
ピーターショー

有効な数独パズルを保存するために必要な最小ビットは、計算可能な関数ではないと思います(Kolmogorov)。しかし、Peter / ratchetによる103ビットは適切なようです。
マルツィオデビアシ

2
@Vor:技術的には、入力セットが有限であるため、数独パズルを入力として正しいビット数を出力するチューリングマシンは有限であるため、「このパズルを記述するのに必要なビット数」は「自明」に計算できます。Omega数の有限プレフィックスを計算するより難しくないため、実際にこのようなチューリングマシンを明示的に見つけることができると言っています(原則として、計算に時間がかかりすぎます)。
アーロンスターリング

5

最適な圧縮率を実現するために、完全なルックアップテーブルは必要ありません。非常に合理的なルックアップテーブルを使用する現代のコンピューターは、制約された数独の数を数えることができると信じています。これを使用して、エンコードの方法を次に示します(デコードも同様です)。

正方形の順序を修正します。最初の正方形の数値がます。置くN 1を第一平方未満である数独の数であるように、D 1。ここでd 2を2番目の正方形の数とします。入れN 2を最初の正方形である数独の数であるように、D 1及びその第二平方未満であるD 2。等々。エンコードされた数はN = i N iです。d1N1d1d2N2d1d2N=iNi

このエンコード方式は、文献では二項エンコードとして知られています。これにより、特定の数独のインデックスを(現実世界で)効果的に計算できるようになります(逆も同様)。上記のように、必要なのはビットのみです(これは、それらのいくつかをその平均ビット数でコーディングできることを意味します)。72.4

編集:数独数学のウィキペディアのページは、私たちが絵を明確にするのに役立ちます。Ed Russellによってコンパイルされたテーブルも役立ちます。

上位3行のみを考慮した場合、本質的に考慮すべき構成は44のみになります。表では、任意の構成(最上行が123456789であると仮定)に相当する構成の総数と、各構成の完了の総数を見つけることができます。数独を考えると、順序数を計算する方法は次のとおりです。

  1. 最上行が123456789になるように構成を正規化します。
  2. 44の異なる構成のどれが属しているかを調べます。ウィキペディアの記事には、そのためのアルゴリズムが記載されています。表には、各構成の同等クラスの数と完了数がリストされています。
  3. 等価クラス内の上位3行の構成の序数を決定します。これは、2つの方法で行うことができます。すべての等価クラスのリストを使用する(すべての等価クラスに合計36288あります)か、それらすべてをすばやく列挙する方法を見つけることです。
  4. 行4〜6および7〜9を最初の列で並べ替え、残りの行を正規化してから、これら2つの行ブロックを任意の方法で並べ替えます。これにより、完了数が72分の1に削減されます。
  5. 同じ最初の列を持つすべての補完を列挙します。各等価クラスには約ありますので、それほど時間はかかりません。ここでもいくつかのトレードオフが可能です。220
  6. してみましょう、同値クラスでjは、3行同値クラス内トップの構成の序数で、kは完了の序数とします。C i + j D i + k9までのSodukoの序数であるような2つの配列C iD i(エドラッセルのテーブルから計算可能)があります72の対称性を考慮する。それから、実際の序数を計算できます。ijkCi,DiCi+jDi+k9!72

この手順は可逆的であり、序数から数独を生成します。数独の列挙は数分(2006年、Wikipediaの記事のトークページを参照)以下に短縮されていることに注意してください。


2
制約された数独のソリューションを効率的に数えることは可能ですか?サイズを一般化し、任意の場所で空白を許可する場合は#P-completeです。
伊藤剛

2
私の答えでほのめかしたように、算術符号化はこのシナリオでほぼ最適な圧縮を実現します。
ピーターショー

1
あなたは正しいかもしれませんが、あなたの主張は、数独グリッドの数(6.67×10 ^ 21)が現代のコンピューターで簡単に計算できることを暗示しています。実際に計算することは可能ですが、簡単ですか?
伊藤剛

2
計算の方法を説明している論文の1つからその印象を受けました。前処理で「より重い」データの一部を計算して、適切なサイズのテーブルに保存することもできます。速度の向上は劇的です。私が覚えている限りでは、数時間しかかかりませんでした。ここで、テーブルを使用して1000倍の速度で作成するとします。さらに、各段階で数値は指数関数的に減少するため、ほとんどの作業はおそらく最初の段階に集中しています。
ユヴァルフィルマス

1
@tsuyoshi 計算を比較的簡単にするBDDのバージョン/拡張があると信じています-少し掘り下げる必要がありますが、かなり複雑な組み合わせカウントの問題に使用されていることは知っています。
スティーブンスタドニッキ

4

これは、かなり良いエンコーディングを生成すると思われるアルゴリズムです。圧縮する完成した数独があり、そのいくつかのセルをすでにエンコードしているとしましょう。そのため、いくつかのセルが埋められた部分的な数独(必ずしも一意のソリューションではない)があります。

固定アルゴリズムを使用して、すべての空のセルに配置できる数をカウントします。最小数の異なる数字を配置できる辞書式の最初のセルを見つけ、これらの数字のいずれかがその中に入るようにエンコードします(したがって、セルに3、7、または9のみを含めることができる場合、3は「0 「、7は「1」、9は「2」)。算術コーディングを使用して、結果のシーケンスをエンコードします(セルに含めることができる数の数を考慮します)。

結果のバイナリシーケンスの長さはわかりませんが、特に、セルに配置できる数をカウントするアルゴリズムがかなり洗練されている場合は、かなり短いと思われます。

与えられた数値を含む各セルの確率を推定する優れたアルゴリズムがあれば、さらに改善できます。


3

どんなコメントや批判も歓迎します

圧縮センシングからのアプローチは、ビットから171.72ビットの範囲を提供するようです:69.96171.72

1.)パズルを保存することは、解決策を保存することを意味します(理論的には情報)。

2)最も難しい数独パズルを持っているようです、いくつかのエントリT α に依存するα(例えば、T 3 = 2.444443)。http://www.usatoday.com/news/offbeat/2006-11-06-sudoku_x.htmt(α)α2t(α)αt(3) =2.444443

Pα4t(α)α2

Mβ×α4β2t(α)α22t(α)α2{0,±1}β=kt(α)α2k UUPから十分です。

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|)? Then if encoding the differences between the entries suffices, this itself will remove the factor 2 in βlogα2=2kt(α)α2logα.

It would be interesting to see if 2k can be made equal or less than 2 using A.), B.), C.) and D.). This would be better than 89 bits (which is the best so far in other answers) and for the best case better than the absolute minimum for all puzzles which is around 73bits.


1

これは、完成した数独コンパクトエンコーディングの実装を報告することです(Zurui Wang 9/14/11による提案と同様)。

入力は、最上行と2行目の最初の3桁です。これらは1〜9に削減されます。1-120で、<= 4.4x10 ^ 7に結合されます。これらは、一致するシーケンスまでの30桁の部分的なすべての数独を辞書的にカウントするために与えられたものとして使用されます。次に、81桁までの最終的なカウントが同じ方法で行われます。これらの3つのシーケンスは、最大26ビットの32ビット整数として保存されるため、さらに圧縮できます。プロセス全体には約3分かかり、最初の30桁がほとんどの時間を費やします。デコードは似ていますが、数独ではなく一致するカウントを除きます。

近日公開-改訂には、30桁の補完(2番目の32ビットコード)の列挙に2行目の最初の3桁が含まれ、Jarvis列挙との比較(Jscott、3/1615)


1
FYI: If you created two accounts and would like to merge them, see cstheory.stackexchange.com/help/merging-accounts
D.W.

0

I would go with the following simple analysis:

Each value could be stored in 4 bits (ranges from 1-9, these three bits even allow for 0-16)

If we considered to store the WHOLE solution (not optimal), having 9×9=81 values. 3 bits each = 243 bits.

However, as the rules that the solved sudoku has to follow, storing every bit is in fact redundant. However, since the order is important, you need to store the first 8 values in each row (thus determining the 9th value), for 8 rows (thus determining the last row). This reduces the sudoku to 8×8 for 3 bits, 192 bits (24 bytes).

I guess I could reduce it to:

b=log2(v)(n1)

where

v = range of values (I've seen 0-5 sudokus a lot)

n = number of rows / columns

Edit: Neo Style: I know Latex.


-2

That number is different for each Sudoku. One of the rules for Sudoku is that it has exactly one solution.

So if you look at an example, that's the minimum amount of data that you must store.

If you work from the opposite side, you can remove digit by digit and run a solver on the result to see if it still has exactly one solution. If so, you can delete another digit. If not, you must restore this digit and try another. If you can't, you have found a minimum.

Since most puzzles start mostly empty, a run length encoding will probably yield good results.


This greedy approach not necessarily achieves the minimum, perhaps you need to select carefully which digit to remove in each step.
Diego de Estrada

It's just an example. Google for "sudoku puzzle generators" to get more sophisticated ones.
アーロンディグラ

5
これが特にうまくいくとあなたが期待する理由は本当にわかりません。これは、答えというよりもむしろ直感的な感じのようです。
ジョーフィッツシモンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.