Bir sudoku bulmacasını saklamak için gereken minimum bit sayısı nedir?


28

Not: Bu standart 9x9 sudoku bulmacası hakkında. Çözüm, yalnızca çözülmüş yasal bulmacaları desteklemeli . Dolayısıyla bir çözümün boş hücreleri desteklemesi gerekmez ve çözülmüş bir sudoku bulmacasının özelliklerine güvenebilir.

Bunu merak ediyordum, ama memnun olduğum bir cevabı düşünemedim. Saf bir çözelti, her bir hücre (81 hücre) için toplam 648 bit kullanan bir bayt kullanır. Daha karmaşık bir çözüm, tüm sudoku bulmacasını 9 tabanlı bir sayıda (hücre başına bir basamak) ve bit gerektirir.log2(981))=257

Ancak yine de geliştirilebilir, örneğin, 3x3 alt kılavuzundaki 9 sayının 8'ini biliyorsanız, 9'unu önemsizden çıkarabilirsiniz. Bu düşünceye, bu sorunun aşağı indiği noktaya kadar devam edebilirsiniz . Eşsiz çözülen sudokus miktarı nedir? Artık her ikili sayıyı bir sudoku bulmacasına eşleyen büyük bir arama tablosu kullanabilirsiniz, ancak bu kullanışlı bir çözüm olmaz.

Öyleyse benim sorum:

Bir arama tablosu kullanmadan, bir sudoku bulmacasını saklamak için gereken minimum bit miktarı nedir ve hangi algoritma ile?


3
9. sayıyı 3x3, satır veya sütunlarda bırakmak ve sadece asgari sudokuyu bu eşsiz çözüme sahip boş alanlarla saklamak arasında gerçekten niteliksel bir fark var mı? “boş hücreleri desteklemesi gerekmez”, eğer optimal çözüm mutlaka ihtiyaç duyuyorsa, biraz kırmızı ringa balığıdır.
Wooble

19
Çünkü orada 6.67 × 10 ^ 21 çözüldü sudoku ( “QSCGZ” 2003, Felgenhauer ve 2005 Jarvis) ..., bir alt sınır 73 bit (büyük tablosunun kullanılması bile) ve log_2 (6.67 × 10 ^ 21) 72.4 = . Esas olarak özdeş özümleri simetri açısından ayırt etmeniz gerekmiyorsa, bu alt sınır geçerli değildir.
Tsuyoshi Ito

9
Bu soru iyi bir programlama yarışması için olur.
Peter Shor

1
Esasen özdeş özümler için benzer alt sınır 33 bittir.
Charles

3
Neden bir masaya ihtiyacınız var? İstediğiniz numaraya ulaşana kadar Sudoku çözümlerini birer birer sıralayabilirsiniz.
Zirui Wang,

Yanıtlar:


19

Cırcır ucubesinin cevabıyla aynı çizgiler boyunca, aşağıdaki matristeki yıldız olmayan hücreleri doldurursanız, bir seferde 3x3 kutu, her zaman bir kutuyu satır veya sütunları paylaşan bir kutu olarak doldurmak için her zaman bir sonraki kutuyu seçme zaten doldurdunuz, adım başına seçenek sayısı için aşağıdaki gibi bir şablon elde edersiniz (ilk önce üst ortadaki kutuyu, sonraki üst sağdaki kutuyu vb.

İlk olandan sonraki her 3x3 kutuda, kutunun bir satırını veya sütununu doldurduktan sonra, kalan altı haneden üçü tek bir satıra yerelleştirilir. Önce yerlerini seçin ve sonra kalan üç hücreyi doldurun. (Yani, doldurulacak hücrelerin asıl sırası, bildiklerinize bağlı olarak değişebilir, ancak seçenek sayısı gösterdiğimden daha fazla değildir.)

Bu hücreleri doldurduktan sonra yıldızların tümü belirlenir.

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

Doğru hesapladıysam, bu 87 bit verir. Peter Shor'un yorumuna göre son 3x3'lük blokta elde edilecek bazı ek tasarruflar var: her değer dört hücreden birine yerelleştiriliyor ve her satır sadece dört olası değere sahip en az bir hücre içeriyor, yani kesinlikle buradaki faktörler blok 4 ile 6 ile başlamalı, ancak Shor'ın cevabında kalan faktörleri anlamıyorum.


4
Altıncı 3x3 kutusunu doldururken de seçenek sayısını azaltabilirsiniz. Doğru hesapladıysam, bu kutu toplam 83 bit için 4,3,2 / 3,2,1 / 2,1,1 olur.
Peter Shor

@Peter - hayır. Sağdaki 3 sayı, yukarıdaki sayı ile aynı olabilir. Hepsinin ayrı olduğunu bilmiyorsunuz. En güvenilen benzersiz sayılar 3'tür, bu nedenle ilk kutu altı maddeden bir seçimdir. (Bu konum bir örnektir. Diğerleri için de geçerlidir.)
Hogan

@David - Peter'a yaptığım yoruma göre, numaralarınızın yanlış olduğunu sanmıyorum. 2. kutuda en kötü durum için 6 5 4 4 3 2 3 2 1olması gerektiğine inanıyorum 6 5 4 6 5 4 3 2 1.
Hogan

Hogan, hayır, "Kutunun bir satırını veya sütununu doldurduktan sonra, mümkün olan en fazla dört değerin bulunduğu bir satır olmak üzere her zaman bir sonraki satırı veya sütunu seçebilirsiniz. "
David Eppstein

@David - 3 x 3s 1,1 1,2 1,3 etiketini sola, yukarıdan aşağıya doğru sola doğru etiketleyelim. Kareler etikel olsun A - Soldan sağa, yukarıdan aşağıya gidiyorum. 1,3'deki D konumu (A, B, C) 'deki 3x3'teki 3 sayıyı bilir ve 1,2 (3, E, F)' deki 3 sayıyı bilir ancak bu 6 sayının farklı olduğunu bilmez. Kutu 3,1 ve 2,1'deki aynı 3 sayı olabilir, bu yüzden MAX 6 seçeneği vardır.
Hogan

13

@ peter kullanıcısının yanıtı ile devam ediyor, burada her bir hücre için soldan başlayarak doldururken en kötü durum olasılık listesi.

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

bu 4,24559E + 29 olasılık veya 99 bit yapar

düzenleme: Unutmayın ki son kare tamamen diğerleri tarafından belirlenir


Çok hoş!! Gerçek bir Sudoku çözümü için bu en kötü durum olanaklarını elde edebileceğinizi açıkça söylememe izin vermeyin (özellikle, hücrelerde sayıların daraltılması ihtimalini azaltmak için bazı Sudoku tekniklerini kullanan karmaşık bir algoritma kullanıyorsanız) ).
Peter Shor

Peter ama en ve daraltmada daraltıcıları eklemelisiniz ve bir tane seçip sırayı düzeltmek zorunda kalmazsanız (en kolay yol ama gerçekten optimal değil), bunu kodlamaya da eklemeniz gerekir
cırcır ucube

Hayır, kod çözme prosedüründeki en iyi hücreyi bulmak için aynı algoritmayı kullanırsanız ve kod çözme prosedüründe aynı hücreyi (aynı veriler üzerinde çalıştığından beri) verir, böylece kod çözme ve işlem prosedürleri senkronize edilir, ve sıralamayı kodlamaya eklemek zorunda değilsin. Bu fikir aynı zamanda LZW veri sıkıştırma algoritmasının çalışmasını sağlar.
Peter Shor

Ben düşünüyorum asgari bit geçerli bir sudoku bulmaca saklamak için gerekli hesaplanabilir bir fonksiyon (Kolmogorov) değildir. Ancak Peter / cırcır tarafından 103 bit iyi bir sınır gibi görünüyor.
Marzio De Biasi

2
@Vor: Teknik olarak girdi olarak bir sudoku bulmacası verildiğinde doğru bit sayısını veren Turing makinesi sonludur çünkü giriş kümesi sonludur, yani "bu bulmacayı tanımlamak için kaç bit gereklidir" hesaplanabilir. Açıkça böyle bir Turing makinesi bulabileceğimizi söylüyorum (prensipte, hesaplamalar çok uzun sürecektir), çünkü Omega sayısının sınırlı bir önekini hesaplamaktan daha zor olamaz.
Aaron Sterling

5

En iyi sıkıştırılabilirliği elde etmek için eksiksiz bir masaya ihtiyacınız yoktur. Makul bir görünüm tablosu kullanan modern bilgisayarların , halihazırda bazı basamaklar bulunan Sudokus olan sınırlı Sudokus sayısını sayabildiğini düşünüyorum . Bunu kullanarak, işte nasıl kodladığınız (kod çözme benzer).

d1N1d1d2N2d 2 , N = Σ i K ıd1d2N=iNi

Bu kodlama yöntemi , literatürde binom kodlaması olarak bilinir . Verimli (gerçek dünyadaki anlamda) herhangi bir Sudoku indeksini hesaplamanıza olanak sağlar ve bunun tersi de geçerlidir. Daha sonra , yukarıda belirtildiği gibi yalnızca bit gerekecektir (bu, birçoğunu bu ortalama bit sayısıyla kodlayabileceğiniz anlamına gelir).72.4

Düzenleme: Sudoku matematiğinin Wikipedia sayfası , fotoğrafı netleştirmemize yardımcı olur. Ayrıca Ed Russell tarafından derlenen bir tablodur .

Yalnızca ilk üç satırı göz önünde bulundurursanız, dikkate alınması gereken sadece 44 farklı yapılandırma olduğunu görürsünüz. Tabloda, herhangi birine eşdeğer toplam yapılandırma sayısını bulabilirsiniz (en üst satırın 123456789 olduğu varsayılarak) ve her birinin toplam tamamlanma sayısını bulabilirsiniz. Bir Sudoku verildiğinde, sıra sayısını nasıl hesaplayacağımız:

  1. Konfigürasyonu normal hale getirin, böylece üst satır 123456789 olur.
  2. Hangi 44 farklı konfigürasyondan birine ait olduğunu bulun. Wikipedia makalesi bunun için bir algoritma veriyor. Tabloda, her bir konfigürasyon için eşdeğerlik sınıfı sayısı ve tamamlama sayısı listelenmektedir.
  3. Eşdeğerlik sınıfı içindeki ilk üç sıranın konfigürasyonunun sıra sayısını belirleyin. Bu iki yolla yapılabilir: ya tüm denklik sınıflarının bir listesini kullanarak (tüm denklik sınıflarında toplamda 36288 var) ya da hepsini hızlı bir şekilde numaralandırmanın bir yolunu bularak.
  4. Kalan satırları 4-6 ve 7-9 sıralarını ilk sütunlarına göre sıralayarak ve ardından bu iki satır bloğunu rasgele bir şekilde sıralayarak normalleştirin. Bu, tamamlama sayısını 72 katına kadar azaltır.
  5. Aynı ilk sütuna sahip tüm tamamlamaları numaralandırın. Her denklik sınıfı için yaklaşık , bu yüzden çok uzun sürmemelidir. Bazı travmalar da burada mümkün.220
  6. denklik sınıfı olalım , , eşdeğerlik sınıfı içindeki ilk üç sıranın konfigürasyonunun sıra numarası, , tamamlamanın sıra sayısıdır. İki dizi (Ed Russell'in tablosundan hesaplanabilir) öyle ki Soduko'nun 9'a kadar olan sıra sayısı simetri dikkate . Bundan asıl sıra sayısını hesaplayabilirsiniz.j k C ı , D i C i + j D i + k 9 ! 72ijkCi,DiCi+jDi+k9!72

Bu prosedür geri dönüşümlüdür ve bir sıra numarasından bir Sudoku üretecektir. Sudoku numaralandırmasının birkaç dakikaya düşürüldüğünü (2006'da; Wikipedia makalesinin konuşma sayfasına bakın) veya daha az olduğunu, bu nedenle modern bir bilgisayarda bu yaklaşımın çok pratik olacağını ve birkaç saniye veya daha az süreceğini umuyorum.


2
Kısıtlanmış sudoku çözümlerini verimli bir şekilde saymak mümkün mü? Boyutu genelleştirirseniz ve rastgele yerlerde boşluklara izin verirseniz, # P-tamamlandı.
Tsuyoshi Ito

2
Cevabımda bahsettiğim gibi, aritmetik kodlama , bu senaryo için en uygun sıkıştırma seviyesine ulaşacak.
Peter Shor

1
Haklı olabilirsiniz, ancak iddianız modern bir bilgisayarda sudoku ızgaralarının (6.67 × 10 ^ 21) hesaplanmasının kolay olduğu anlamına gelir. Hesaplamak gerçekten mümkün, ama kolay mı?
Tsuyoshi Ito

2
Bu izlenimi, hesaplamanın nasıl yapılacağını açıklayan makalelerden birinden aldım. Ön işleme sırasında "daha ağır" verilerin bir kısmını bile hesaplayabilir ve makul boyutta bir tabloda saklayabilirsiniz - hız kazancı çarpıcı olabilir. Hatırladığım kadarıyla, sadece birkaç saat sürdü, birkaç yıl önceydi. Şimdi 1000 kat daha hızlı yapmak için bir masa kullandığınızı varsayalım. Dahası, her aşamada sayılar katlanarak azalır, bu yüzden işlerin çoğu muhtemelen ilk aşamada yoğunlaşmıştır.
Yuval Filmus,

1
@tsuyoshi Hesaplamayı göreceli olarak kolaylaştıran BDD'lerin bir sürümünün / uzantısının olduğuna inanıyorum - bunun için biraz kazma yapmam gerekecekti, ancak bunların oldukça karmaşık birleşik sayma problemleri için kullanıldığını biliyorum.
Steven Stadnicki

4

İşte oldukça iyi bir kodlama üreteceğinden şüphelendiğim bir algoritma. Sıkıştırmak istediğiniz bitmiş sudokuya sahipsiniz ve diyelim ki bazı hücrelerini zaten kodladınız, bu nedenle bazı hücrelerin doldurulmasıyla birlikte kısmi bir sudoku (mutlaka benzersiz bir çözümle değil) vardır.

Her boş hücreye kaç sayı yerleştirilebileceğini saymak için sabit bir algoritma kullanın. En küçük sayıda farklı sayının yerleştirilebileceği sözlüksel ilk hücreyi bulun ve bu sayılardan hangisinin içine girdiğini kodlayın (bir hücre yalnızca 3, 7 veya 9 içerebilirse, 3, "0 ile kodlanır. ", 7'ye" 1 "ve 9'a" 2 "). Aritmetik kodlamayı kullanarak (bir hücrenin içerebileceği muhtemel sayıların sayısını hesaba katar) ortaya çıkan sırayı kodlayın.

Sonuçta ortaya çıkan ikili dizinin ne kadar süreceğini bilmiyorum, ama oldukça kısa olduğundan şüpheleniyorum, özellikle de bir hücreye kaç tane sayı koyacağınız için algoritmanız oldukça karmaşıksa.

Belirli bir sayı içeren her bir hücrenin olasılığını tahmin eden iyi bir algoritmaya sahipseniz, daha da iyisini yapabilirsiniz.


3

Herhangi bir yorum ve eleştiri edilir

69.96171.72

1.) Bulmacanın depolanması, çözümü depolamak anlamına gelir (bilgi teorik olarak).

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

Bu, tamamlanmış sudoku kompakt kodlamanın uygulanmasını bildirmektir (Zurui Wang 9/14/11 tarafından yapılan öneriye benzer).

Giriş, 2. satırın en üst ve 1. basamağıdır. Bunlar 1-9'a düşürülür! ve 1-120 ve <= 4.4x10 ^ 7'ye birleştirildi. Bunlar, eşleşme sırasına kadar 30 basamağın tüm kısmi sukokusunu sözlükbilimsel olarak saymak için gostatif olarak kullanılır. Daha sonra 81 hanenin tamamına kadar olan son sayım aynı şekilde yapılır. Bu 3 dizi, maksimum 26 bitlik 32 bitlik tamsayılar olarak depolanır, böylece daha fazla sıkıştırılabilir. Tüm işlem yaklaşık 3 dakika sürer ve çoğu zaman 1 30 rakam gelir. Kod çözme benzerdir - sudokus yerine eşleşen sayımlar hariç.

Çok yakında geliyor - Revizyon, 30 basamaklı tamamlamaların numaralandırılmasında 2. sıranın 1. basamağını içerir (2. 32 bit kod), Jarvis numaralandırmasıyla karşılaştırması (Jscott, 3/1615)


1
FYI: İki hesap oluşturduysanız ve birleştirmek istiyorsanız, bkz. Cstheory.stackexchange.com/help/merging-accounts
DW

0

Aşağıdaki basit analiz ile giderdim:

Her değer 4 bite depolanabilir (1-9 arasındadır, bu üç bit 0-16 için bile izin verir)

9×9=81

8×8

Galiba onu azaltabilirim:

b=log2(v)(n1)

nerede

v

n

Düzenleme: Neo Stil: Lateks biliyorum.


-2

Bu numara her Sudoku için farklıdır. Sudoku kurallarından biri de tam olarak tek bir çözüme sahip olmasıdır.

Bu nedenle, bir örneğe bakarsanız, saklamanız gereken minimum veri miktarı budur.

Karşı taraftan çalışıyorsanız, rakamı tek tek kaldırabilir ve hala tek bir çözüme sahip olup olmadığını görmek için sonuçta bir çözücü çalıştırabilirsiniz. Öyleyse, başka bir rakamı silebilirsiniz. Değilse, bu basamağı geri yüklemeniz ve başka bir deneme yapmalısınız. Yapamazsan, minimum buldun.

Çoğu bulmaca çoğunlukla boş başladığından, bir çalışma uzunluğu kodlaması büyük olasılıkla iyi sonuçlar verecektir.


Bu açgözlü yaklaşım mutlaka minimum seviyeye ulaşmaz, belki de her adımda hangi haneyi kaldıracağınızı dikkatlice seçmeniz gerekir.
Diego de Estrada

Bu sadece bir örnek. Google "sudoku bulmaca jeneratörleri" için daha sofistike olanlar elde etmek için.
Aaron Digulla 9:11

5
Bunun neden özellikle iyi performans göstermesini beklediğinizi gerçekten anlamıyorum. Bu sadece bir cevaptan ziyade duygu hissediyorum.
Joe Fitzsimons 12:11
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.