Chapter 7 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-03 01:07:43 +02:00
parent 69458aab08
commit 499f9dda68
1 changed files with 74 additions and 68 deletions

View File

@ -888,24 +888,25 @@ In this case the path is as follows:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Merkkijonojen \texttt{PALLO} ja \texttt{TALO} viimeinen merkki on sama, The last characters of \texttt{LOVE} and \texttt{MOVIE}
joten niiden editointietäisyys on sama kuin are equal, so the edit distance between them
merkkijonojen \texttt{PALL} ja \texttt{TAL}. equals the edit distance between \texttt{LOV} and \texttt{MOVI}.
Nyt voidaan poistaa viimeinen \texttt{L} merkkijonosta \texttt{PAL}, We can use one editing operation to remove the
mistä tulee yksi operaatio. character \texttt{I} from \texttt{MOVI}.
Editointietäisyys on siis yhden suurempi Thus, the edit distance is one larger than
kuin merkkijonoilla \texttt{PAL} ja \texttt{TAL}, jne. the edit distance between \texttt{LOV} and \texttt{MOV}, etc.
\section{Laatoitukset} \section{Tilings}
Joskus dynaamisen ohjelmoinnin tila on monimutkaisempi kuin Sometimes the dynamic programming state
kiinteä yhdistelmä lukuja. is more complex than a fixed combination of numbers.
Tarkastelemme lopuksi tehtävää, jossa As an example,
laskettavana on, monellako tavalla we consider a problem where our task
kokoa $1 \times 2$ ja $2 \times 1$ olevilla laatoilla is to calculate the number of different ways to
voi täyttää $n \times m$ -kokoisen ruudukon. fill an $n \times m$ grid using
Esimerkiksi ruudukolle kokoa $4 \times 7$ $1 \times 2$ and $2 \times 1$ size tiles.
yksi mahdollinen ratkaisu on For example, one valid solution
for the $4 \times 7$ grid is
\begin{center} \begin{center}
\begin{tikzpicture}[scale=.65] \begin{tikzpicture}[scale=.65]
\draw (0,0) grid (7,4); \draw (0,0) grid (7,4);
@ -927,72 +928,77 @@ yksi mahdollinen ratkaisu on
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
ja ratkaisujen yhteismäärä on 781. and the total number of solutions is 781.
Tehtävän voi ratkaista dynaamisella ohjelmoinnilla The problem can be solved using dynamic programming
käymällä ruudukkoa läpi rivi riviltä. by going through the grid row by row.
Jokainen ratkaisun rivi pelkistyy merkkijonoksi, Each row in a solution can be represented as a
jossa on $m$ merkkiä joukosta $\{\sqcap, \sqcup, \sqsubset, \sqsupset \}$. string that contains $m$ characters from the set
Esimerkiksi yllä olevassa ratkaisussa on 4 riviä, $\{\sqcap, \sqcup, \sqsubset, \sqsupset \}$.
jotka vastaavat merkkijonoja For example, the above solution consists of four rows
that correspond to the following strings:
\begin{itemize} \begin{itemize}
\item \item
$\sqcap \sqsubset \sqsupset \sqcap \sqsubset \sqsupset \sqcap$, $\sqcap \sqsubset \sqsupset \sqcap \sqsubset \sqsupset \sqcap$
\item \item
$\sqcup \sqsubset \sqsupset \sqcup \sqcap \sqcap \sqcup$, $\sqcup \sqsubset \sqsupset \sqcup \sqcap \sqcap \sqcup$
\item \item
$\sqsubset \sqsupset \sqsubset \sqsupset \sqcup \sqcup \sqcap$ ja $\sqsubset \sqsupset \sqsubset \sqsupset \sqcup \sqcup \sqcap$
\item \item
$\sqsubset \sqsupset \sqsubset \sqsupset \sqsubset \sqsupset \sqcup$. $\sqsubset \sqsupset \sqsubset \sqsupset \sqsubset \sqsupset \sqcup$
\end{itemize} \end{itemize}
Tehtävään sopiva rekursiivinen funktio on $f(k,x)$, Let $f(k,x)$ denote the number of ways to
joka laskee, montako tapaa on muodostaa ratkaisu construct a solution for the rows $1 \ldots k$
ruudukon riveille $1 \ldots k$ niin, in the grid so that string $x$ corresponds to row $k$.
että riviä $k$ vastaa merkkijono $x$. It is possible to use dynamic programing here
Dynaaminen ohjelmointi on mahdollista, because the state of a row is constrained
koska jokaisen rivin sisältöä only be the state of the previous row.
rajoittaa vain edellisen rivin sisältö.
Riveistä muodostuva ratkaisu on kelvollinen, A solution is valid if row $1$ doesn't contain
jos rivillä 1 ei ole merkkiä $\sqcup$, the character $\sqcup$,
rivillä $n$ ei ole merkkiä $\sqcap$ row $n$ doesn't contain the character $\sqcap$,
ja kaikki peräkkäiset rivit ovat \emph{yhteensopivat}. and all successive rows are \emph{compatible}.
Esimerkiksi rivit For example, the rows
$\sqcup \sqsubset \sqsupset \sqcup \sqcap \sqcap \sqcup$ ja $\sqcup \sqsubset \sqsupset \sqcup \sqcap \sqcap \sqcup$ and
$\sqsubset \sqsupset \sqsubset \sqsupset \sqcup \sqcup \sqcap$ $\sqsubset \sqsupset \sqsubset \sqsupset \sqcup \sqcup \sqcap$
ovat yhteensopivat, are compatible, while the rows
kun taas rivit $\sqcap \sqsubset \sqsupset \sqcap \sqsubset \sqsupset \sqcap$ and
$\sqcap \sqsubset \sqsupset \sqcap \sqsubset \sqsupset \sqcap$ ja
$\sqsubset \sqsupset \sqsubset \sqsupset \sqsubset \sqsupset \sqcup$ $\sqsubset \sqsupset \sqsubset \sqsupset \sqsubset \sqsupset \sqcup$
eivät ole yhteensopivat. are not compatible.
Koska rivillä on $m$ merkkiä ja jokaiselle merkille on 4 Since a row consists of $m$ characters and there are
vaihtoehtoa, erilaisia rivejä on korkeintaan $4^m$. four choices for each character, the number of different
Niinpä ratkaisun aikavaativuus on $O(n 4^{2m})$, rows is at most $4^m$.
koska joka rivillä käydään läpi $O(4^m)$ Thus, the time complexity of the solution is
vaihtoehtoa rivin sisällölle $O(n 4^{2m})$ because we can check the
ja jokaista vaihtoehtoa kohden on $O(4^m)$ $O(4^m)$ possible states for each row,
vaihtoehtoa edellisen rivin sisällölle. and for each state, there are $O(4^m)$
Käytännössä ruudukko kannattaa kääntää niin possible states for the previous row.
päin, että pienempi sivun pituus on $m$:n roolissa, In practice, it's a good idea to rotate the grid
koska $m$:n suuruus on ratkaiseva ajankäytön kannalta. so that the shorter side has length $m$
because the factor $4^{2m}$ dominates the time complexity.
Ratkaisua on mahdollista tehostaa parantamalla rivien esitystapaa merkkijonoina. It is possible to make the solution more efficient
Osoittautuu, että ainoa seuraavalla rivillä tarvittava tieto on, by using a better representation for the rows as strings.
missä kohdissa riviltä lähtee laattoja alaspäin. It turns out that it is sufficient to know the
Niinpä rivin voikin tallentaa käyttäen vain merkkejä columns of the previous row that contain the first square
$\sqcap$ ja $\Box$, missä $\Box$ kokoaa yhteen vanhat merkit of a vertical tile.
$\sqcup$, $\sqsubset$ ja $\sqsupset$. Thus, we can represent a row using only characters
Tällöin erilaisia rivejä on vain $2^m$ $\sqcap$ and $\Box$ where $\Box$ is a combination
ja aikavaativuudeksi tulee $O(n 2^{2m})$. of characters
$\sqcup$, $\sqsubset$ and $\sqsupset$.
In this case, there are only
$2^m$ distinct rows and the time complexity becomes
$O(n 2^{2m})$.
Mainittakoon lopuksi, että laatoitusten määrän laskemiseen As a final note, there is also a surprising direct formula
on myös yllättävä suora kaava for calculating the number of tilings:
\[ \prod_{a=1}^{\lceil n/2 \rceil} \prod_{b=1}^{\lceil m/2 \rceil} 4 \cdot (\cos^2 \frac{\pi a}{n + 1} + \cos^2 \frac{\pi b}{m+1}).\] \[ \prod_{a=1}^{\lceil n/2 \rceil} \prod_{b=1}^{\lceil m/2 \rceil} 4 \cdot (\cos^2 \frac{\pi a}{n + 1} + \cos^2 \frac{\pi b}{m+1}).\]
Tämä kaava on sinänsä hyvin tehokas, This formula is very efficient because it calculates
koska se laskee laatoitusten määrän ajassa $O(nm)$, the number of tilings on $O(nm)$ time,
mutta käytännön ongelma kaavan käyttämisessä but since the answer is a product of real numbers,
on, kuinka tallentaa välitulokset riittävän tarkkoina lukuina. a practical problem in using the formula is
how to store the intermediate results accurately.