Chapter 9 first version
This commit is contained in:
parent
fe87f1f1e3
commit
c76f9237f4
136
luku09.tex
136
luku09.tex
|
@ -1240,40 +1240,39 @@ by following a path downwards from the top node:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\section{Lisätekniikoita}
|
\section{Additional techniques}
|
||||||
|
|
||||||
\subsubsection{Indeksien pakkaus}
|
\subsubsection{Index compression}
|
||||||
|
|
||||||
Taulukon päälle rakennettujen tietorakenteiden
|
A limitation in data structures that have
|
||||||
rajoituksena on, että alkiot on indeksoitu
|
been built upon an array is that
|
||||||
kokonaisluvuin $1,2,3,$ jne.
|
the elements are indexed using integers
|
||||||
Tästä seuraa ongelmia,
|
$1,2,3,$ etc.
|
||||||
jos tarvittavat indeksit ovat suuria.
|
Difficulties arise when the indices
|
||||||
Esimerkiksi indeksin $10^9$ käyttäminen
|
needed are large.
|
||||||
vaatisi, että taulukossa olisi $10^9$ alkiota,
|
For example, using the index $10^9$ would
|
||||||
mikä ei ole realistista.
|
require that the array would contain $10^9$
|
||||||
|
elements which is not realistic.
|
||||||
|
|
||||||
\index{indeksien pakkaus@indeksien pakkaus}
|
\index{index compression}
|
||||||
|
|
||||||
Tätä rajoitusta on kuitenkin mahdollista
|
However, we can often bypass this limitation
|
||||||
kiertää usein käyttämällä \key{indeksien pakkausta},
|
by using \key{index compression}
|
||||||
jolloin indeksit jaetaan
|
where the indices are redistributed so that
|
||||||
uudestaan niin, että ne ovat
|
they are integers $1,2,3,$ etc.
|
||||||
kokonaisluvut $1,2,3,$ jne.
|
This can be done if we know all the indices
|
||||||
Tämä on mahdollista silloin, kun kaikki
|
needed during the algorithm beforehand.
|
||||||
algoritmin aikana tarvittavat indeksit
|
|
||||||
ovat tiedossa algoritmin alussa.
|
|
||||||
|
|
||||||
Ideana on korvata jokainen alkuperäinen
|
The idea is to replace each original index $x$
|
||||||
indeksi $x$ indeksillä $p(x)$,
|
with index $p(x)$ where $p$ is a function that
|
||||||
missä $p$ jakaa indeksit uudestaan.
|
redistributes the indices.
|
||||||
Vaatimuksena on, että indeksien järjestys
|
We require that the order of the indices
|
||||||
ei muutu, eli jos $a<b$, niin $p(a)<p(b)$,
|
doesn't change, so if $a<b$, then $p(a)<p(b)$.
|
||||||
minkä ansiosta kyselyitä voi tehdä
|
Thanks to this, we can conviently perform queries
|
||||||
melko tavallisesti indeksien pakkauksesta huolimatta.
|
despite the fact that the indices are compressed.
|
||||||
|
|
||||||
Esimerkiksi jos alkuperäiset indeksit ovat
|
For example, if the original indices are
|
||||||
$555$, $10^9$ ja $8$, ne muuttuvat näin:
|
$555$, $10^9$ and $8$, the new indices are:
|
||||||
|
|
||||||
\[
|
\[
|
||||||
\begin{array}{lcl}
|
\begin{array}{lcl}
|
||||||
|
@ -1283,23 +1282,23 @@ p(10^9) & = & 3 \\
|
||||||
\end{array}
|
\end{array}
|
||||||
\]
|
\]
|
||||||
|
|
||||||
\subsubsection{Välin muuttaminen}
|
\subsubsection{Range update}
|
||||||
|
|
||||||
Tähän asti olemme toteuttaneet tietorakenteita,
|
So far, we have implemented data structures
|
||||||
joissa voi tehdä tehokkaasti välikyselyitä
|
that support range queries and modifications
|
||||||
ja muuttaa yksittäisiä taulukon arvoja.
|
of single values.
|
||||||
Tarkastellaan lopuksi käänteistä tilannetta,
|
Let us now consider a reverse situation
|
||||||
jossa pitääkin muuttaa välejä ja
|
where we should update ranges and
|
||||||
kysellä yksittäisiä arvoja.
|
retrieve single values.
|
||||||
Keskitymme operaatioon,
|
We focus on an operation that increases all
|
||||||
joka kasvattaa kaikkia välin $[a,b]$ arvoja $x$:llä.
|
elements in range $[a,b]$ by $x$.
|
||||||
|
|
||||||
Yllättävää kyllä,
|
Surprisingly, we can use the data structures
|
||||||
voimme käyttää tämän luvun tietorakenteita myös tässä tilanteessa.
|
presented in this chapter also in this situation.
|
||||||
Tämä vaatii, että muutamme taulukkoa niin,
|
This requires that we change the array so that
|
||||||
että jokainen taulukon arvo kertoo \textit{muutoksen}
|
each element indicates the \emph{change}
|
||||||
edelliseen arvoon nähden.
|
with respect to the previous element.
|
||||||
Esimerkiksi taulukosta
|
For example, the array
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.7]
|
\begin{tikzpicture}[scale=0.7]
|
||||||
|
@ -1326,7 +1325,7 @@ Esimerkiksi taulukosta
|
||||||
\node at (7.5,1.4) {$8$};
|
\node at (7.5,1.4) {$8$};
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
tulee seuraava:
|
becomes as follows:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.7]
|
\begin{tikzpicture}[scale=0.7]
|
||||||
\draw (0,0) grid (8,1);
|
\draw (0,0) grid (8,1);
|
||||||
|
@ -1353,19 +1352,20 @@ tulee seuraava:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
Minkä tahansa vanhan arvon saa uudesta taulukosta
|
The original array is the sum array of the new array.
|
||||||
laskemalla summan taulukon alusta kyseiseen kohtaan asti.
|
Thus, any value in the original array corresponds
|
||||||
Esimerkiksi kohdan 6 vanha arvo 5 saadaan
|
to a sum of elements in the new array.
|
||||||
summana $3-2+4=5$.
|
For example, the value 6 at index 5 in the original array
|
||||||
|
corresponds to the sum $3-2+4=5$.
|
||||||
|
|
||||||
Uuden tallennustavan etuna on,
|
The benefit in using the new array is
|
||||||
että välin muuttamiseen riittää muuttaa
|
that we can update a range by changing just
|
||||||
kahta taulukon kohtaa.
|
two elements in the new array.
|
||||||
Esimerkiksi jos välille $2 \ldots 5$
|
For example, if we want to
|
||||||
lisätään luku 5,
|
increase the range $2 \ldots 5$ by 5,
|
||||||
taulukon kohtaan 2 lisätään 5
|
it suffices to increase the element at index 2 by 5
|
||||||
ja taulukon kohdasta 6 poistetaan 5.
|
and decrease the element at index 6 by 5.
|
||||||
Tulos on tässä:
|
The result is as follows:
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.7]
|
\begin{tikzpicture}[scale=0.7]
|
||||||
|
@ -1392,20 +1392,18 @@ Tulos on tässä:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
Yleisemmin kun taulukon välille $a \ldots b$
|
More generally, to increase the range
|
||||||
lisätään $x$, taulukon kohtaan $a$
|
$a \ldots b$ by $x$,
|
||||||
lisätään $x$ ja taulukon kohdasta $b+1$
|
we increase the element at index $a$ by $x$
|
||||||
vähennetään $x$.
|
and decrease the element at index $b+1$ by $x$.
|
||||||
Tarvittavat operaatiot
|
The required operations are calculating
|
||||||
ovat summan laskeminen
|
the sum in a range and updating a value,
|
||||||
taulukon alusta tiettyyn kohtaan
|
so we can use a binary indexed tree or a segment tree.
|
||||||
sekä yksittäisen alkion muuttaminen,
|
|
||||||
joten voimme käyttää tuttuja menetelmiä tässäkin tilanteessa.
|
|
||||||
|
|
||||||
Hankalampi tilanne on, jos samaan aikaan pitää pystyä
|
A more difficult problem is to support both
|
||||||
sekä kysymään tietoa väleiltä että muuttamaan välejä.
|
range queries and range updates.
|
||||||
Myöhemmin luvussa 28 tulemme näkemään,
|
In Chapter 28 we will see that this is possible
|
||||||
että tämäkin on mahdollista.
|
as well.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue