<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flying memes &#187; Knuth</title>
	<atom:link href="http://sandropaganotti.com/tag/knuth/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 08 Jan 2012 16:00:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Knuth e i dancing links</title>
		<link>http://sandropaganotti.com/2008/11/23/knuth-e-i-dancing-links/</link>
		<comments>http://sandropaganotti.com/2008/11/23/knuth-e-i-dancing-links/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 21:20:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[Algorithm X]]></category>
		<category><![CDATA[Dancing Links]]></category>
		<category><![CDATA[DLX]]></category>
		<category><![CDATA[Knuth]]></category>
		<category><![CDATA[ruby-dlx]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=49</guid>
		<description><![CDATA[Nel post precedente cercando di trovare un algoritmo interessante per la generazione di Sudoku mi sono imbattuto nei Dancing Links. L&#8217;algoritmo DLX è stato inventato da Donald Knuth (il pdf originale è disponibile gratuitamente) ed è essenzialmente un&#8217;implementazione performante di un algoritmo di backtracking (Algoritmo X). L&#8217;algoritmo X si applica a problemi chiamati &#8216;Exact Cover [...]]]></description>
			<content:encoded><![CDATA[<p>Nel post precedente cercando di trovare un algoritmo interessante per la generazione di Sudoku mi sono imbattuto nei Dancing Links.</p>
<p>L&#8217;algoritmo DLX è stato inventato da <a href="http://www-cs-faculty.stanford.edu/~knuth/">Donald Knuth</a> (il pdf originale è <a href="http://lanl.arxiv.org/pdf/cs/0011047 ">disponibile gratuitamente</a>) ed è essenzialmente un&#8217;implementazione performante di un algoritmo di backtracking (Algoritmo X).</p>
<p><span id="more-49"></span></p>
<p>L&#8217;algoritmo X si applica a problemi chiamati &#8216;Exact Cover Problems&#8217;; tali problemi presentano (genericamente) questo enunciato:</p>
<blockquote><p>Data una matrice di soli &#8217;0&#8242; e &#8217;1&#8242; è possibile trovare un sottoinsieme di righe tali che per ogni colonna vi sia uno e uno solo &#8217;1&#8242; ?</p></blockquote>
<p>L&#8217;approccio dell&#8217;algoritmo X per risolvere un problema come questo è il seguente (data una matrice A):</p>
<ol>
<li>Se A è vuota il problema è risolto</li>
<li>Altrimenti scegli una colonna c</li>
<li>Scegli una riga r, tale che A[r,c] = 1</li>
<li>Includi r nella soluzione parziale</li>
<li>Per ogni j che soddisfi A[r,j] = 1
<ol>
<li>cancella la colonna j da A</li>
<li>Per ogni i che soddisfi A[i,j] = 1
<ol>
<li>cancella la riga i da A</li>
</ol>
</li>
</ol>
</li>
<li>Ripeti questo algoritmo iterativamente sulla matrice A così ridotta</li>
</ol>
<p>Il problema che rende questo algoritmo molto più laborioso di quanto non sembri è il punto 3. Knuth ci spiega infatti che la scelta della riga r determina la solvibilità o meno del problema (cioè se scegliamo la r giusta il problema si risolve, altrimenti no); questo ci costringe a provare iterativamente tutte le r candidate fino a che non troviamo quella giusta (il che equipara l&#8217;algoritmo X ad un algoritmo di backtracking).</p>
<p>I Dancing Links aiutano a velocizzare (in termini di esecuzione) l&#8217;algoritmo X offrendo una struttura di memorizzazione dati molto intelligente; Supponiamo di memorizzare solo gli &#8217;1&#8242; della matrice A, e di farlo nel seguente modo:</p>
<ol>
<li>Creiamo un&#8217;oggetto Nodo che contiene 4 puntatori ad altrettanti oggetti nodi (su,giu,sinistra e destra) e un puntatore ad un oggetto Colonna.</li>
<li>Creiamo un oggetto Colonna &lt; Nodo con in più alcune informazioni sulla quantità di nodi che contiene (diciamo un campo size).</li>
<li>Creiamo un&#8217;istanza un pò particolare dell&#8217;oggetto colonna (diciamo colonna 0) che punti al primo oggetto colonna della nostra matrice.</li>
</ol>
<p>Il risultato è illustrato egregiamente a pagina 6 del <a href="http://lanl.arxiv.org/pdf/cs/0011047">pdf originale di Knuth</a>.</p>
<p>Ma&#8230; dove risiede la velocità nell&#8217;operare su una struttura simile ? Se pensate ad un classico algoritmo di backtracking ricorderete che la parte più difficile/onerosa da gestire era quella legata al ripristino dello stato del sistema all&#8217;istante n (questo avveniva ogni volta che si realizzava che i passaggi n+1..n+k non portavano ad una soluzione).</p>
<p>Con i Dancing Links invece il tutto è leggermente più semplice, pensiamo infatti all&#8217;operazione &#8216;Inserisco un nodo&#8217;:</p>
<ol>
<li>Prendo x: un nodo da inserire tra i nodi k e m</li>
<li>k.giu = x</li>
<li>m.su = x</li>
<li>x.su  = k</li>
<li>x.giu = m</li>
<li>(k.colonna (equivalente a m.colonna)).size += 1</li>
</ol>
<p>In questo breve pseudocodice ho escluso i puntatori destra e sinistra ma ormai il funzionamento dovrebbe essere abbastanza chiaro.</p>
<h3>Il tutto in Ruby</h3>
<p>Ho appena finito il porting dell&#8217;<a href="http://www.bluechromis.com/stan/chesnutt.html">algorimo DLX implementato da Stan Chesnutt</a> nel suo &#8216;Sudoku Solver&#8217; in linguaggio Ruby, per il momento potete trovare tutti i sorgenti <a href="http://github.com/sandropaganotti">alla mia pagina di GitHub</a>, nel prossimo articolo utilizzeremo quanto creato per sviluppare il risolvi-sudoku, che a sua volta verrà poi utilizzato per il più ambizioso genera-sudoku.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2008/11/23/knuth-e-i-dancing-links/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

