Chapter 7 first version
This commit is contained in:
parent
69458aab08
commit
499f9dda68
142
luku07.tex
142
luku07.tex
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue