Chapter 9 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-03 23:11:02 +02:00
parent fe87f1f1e3
commit c76f9237f4
1 changed files with 67 additions and 69 deletions

View File

@ -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.