Corrections

This commit is contained in:
Antti H S Laaksonen 2017-02-15 23:41:59 +02:00
parent b04d80b1f8
commit 8b8a36c261
1 changed files with 21 additions and 21 deletions

View File

@ -82,12 +82,11 @@ the answer for any possible query efficiently.
\index{sum array} \index{sum array}
Let $\textrm{rsq}(a,b)$ (''range sum query'') be the sum of It turns out that we can easily process
elements in the range $[a,b]$ of an array. sum queries on a static array,
To answer such queries efficiently, because we can construct a data structure called
we can construct a data structure called
a \key{sum array}. a \key{sum array}.
Each element in a sum array contains Each element in a sum array corresponds to
the sum of elements in the original array up to that position. the sum of elements in the original array up to that position.
For example, consider the following array: For example, consider the following array:
@ -143,13 +142,15 @@ The corresponding sum array is as follows:
\node at (7.5,1.4) {$8$}; \node at (7.5,1.4) {$8$};
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Let $\textrm{sum}(a,b)$ denote the sum of elements
in the range $[a,b]$.
Since the sum array contains all values Since the sum array contains all values
of the form $\textrm{rsq}(1,k)$ for $1 \le k \le n$, of the form $\textrm{sum}(1,k)$,
we can calculate any value of we can calculate any value of
$\textrm{rsq}(a,b)$ in $O(1)$ time, because $\textrm{sum}(a,b)$ in $O(1)$ time, because
\[ \textrm{rsq}(a,b) = \textrm{rsq}(1,b) - \textrm{rsq}(1,a-1).\] \[ \textrm{sum}(a,b) = \textrm{sum}(1,b) - \textrm{sum}(1,a-1).\]
It is convenient to define $\textrm{rsq}(1,0)=0$, By defining $\textrm{sum}(1,0)=0$,
so that the above formula can be used also when $a=1$. the above formula also holds when $a=1$.
For example, consider the range $[4,7]$: For example, consider the range $[4,7]$:
\begin{center} \begin{center}
@ -241,15 +242,15 @@ to the position of $X$.
\subsubsection{Minimum queries} \subsubsection{Minimum queries}
Let $\textrm{rmq}(a,b)$ (''range minimum query'') be the It is also possible to process minimum queries
minimum element in the range $[a,b]$ of an array.
It is possible to answer also minimum queries
in $O(1)$ time, though it is more difficult than in $O(1)$ time, though it is more difficult than
processing sum queries. to process sum queries.
Note that minimum and maximum queries can always Note that minimum and maximum queries can always
be processed using similar techniques, be processed using similar techniques,
so it suffices to focus on minimum queries. so it suffices to focus on minimum queries.
Let $\textrm{rmq}(a,b)$ denote the minimum element
in the range $[a,b]$.
The idea is to precalculate all values of $\textrm{rmq}(a,b)$ The idea is to precalculate all values of $\textrm{rmq}(a,b)$
where $b-a+1$, the length of the range, is a power of two. where $b-a+1$, the length of the range, is a power of two.
For example, for the array For example, for the array
@ -452,9 +453,8 @@ whole sum array again in $O(n)$ time.
\subsubsection{Structure} \subsubsection{Structure}
A binary indexed tree can be represented as an array A binary indexed tree can be represented as an array
whose each value is the sum of elements in a range. where the value at position $x$
More precisely, the value at position $x$ equals the sum of elements in the range $[x-k+1,x]$,
is $\textrm{rsq}(x-k+1,x)$,
where $k$ is the largest power of two that divides $x$. where $k$ is the largest power of two that divides $x$.
For example, if $x=6$, then $k=2$, because 2 divides 6 For example, if $x=6$, then $k=2$, because 2 divides 6
but 4 does not divide 6. but 4 does not divide 6.
@ -571,8 +571,8 @@ corresponds to a range in the array:
The values in the binary indexed tree The values in the binary indexed tree
can be used to efficiently calculate can be used to efficiently calculate
any value of $\textrm{rsq}(1,k)$. the sum of elements in any range $[1,k]$,
It turns out that any range $[1,k]$ because such a range
can be divided into $O(\log n)$ ranges can be divided into $O(\log n)$ ranges
whose sums are available in the binary indexed tree. whose sums are available in the binary indexed tree.
@ -624,9 +624,9 @@ the following values:
Hence, the sum of elements in the range $[1,7]$ is $16+7+4=27$. Hence, the sum of elements in the range $[1,7]$ is $16+7+4=27$.
To calculate the value of $\textrm{rsq}(a,b)$, To calculate the sum of elements in any range $[a,b]$,
we can use the same trick that we used with sum arrays: we can use the same trick that we used with sum arrays:
\[ \textrm{rsq}(a,b) = \textrm{rsq}(1,b) - \textrm{rsq}(1,a-1).\] \[ \textrm{sum}(a,b) = \textrm{sum}(1,b) - \textrm{sum}(1,a-1).\]
Also in this case, only $O(\log n)$ values are needed. Also in this case, only $O(\log n)$ values are needed.
\subsubsection{Array update} \subsubsection{Array update}