Small fixes

This commit is contained in:
Antti H S Laaksonen 2017-02-20 23:23:10 +02:00
parent d4ea994907
commit 797035fd8a
13 changed files with 43 additions and 43 deletions

View File

@ -759,7 +759,7 @@ up to an integer. For example,
The functions $\min(x_1,x_2,\ldots,x_n)$ The functions $\min(x_1,x_2,\ldots,x_n)$
and $\max(x_1,x_2,\ldots,x_n)$ and $\max(x_1,x_2,\ldots,x_n)$
return the smallest and largest of values give the smallest and largest of values
$x_1,x_2,\ldots,x_n$. $x_1,x_2,\ldots,x_n$.
For example, For example,
\[ \min(1,2,3)=1 \hspace{10px} \textrm{and} \hspace{10px} \max(1,2,3)=3.\] \[ \min(1,2,3)=1 \hspace{10px} \textrm{and} \hspace{10px} \max(1,2,3)=3.\]
@ -793,7 +793,7 @@ There is also a closed-form formula
for calculating Fibonacci numbers: for calculating Fibonacci numbers:
\[f(n)=\frac{(1 + \sqrt{5})^n - (1-\sqrt{5})^n}{2^n \sqrt{5}}.\] \[f(n)=\frac{(1 + \sqrt{5})^n - (1-\sqrt{5})^n}{2^n \sqrt{5}}.\]
\subsubsection{Logarithm} \subsubsection{Logarithms}
\index{logarithm} \index{logarithm}

View File

@ -20,7 +20,7 @@ Later in the book we will learn more sophisticated
data structures that are not available data structures that are not available
in the standard library. in the standard library.
\section{Dynamic array} \section{Dynamic arrays}
\index{dynamic array} \index{dynamic array}
\index{vector} \index{vector}
@ -135,7 +135,7 @@ string c = b.substr(3,4);
cout << c << "\n"; // tiva cout << c << "\n"; // tiva
\end{lstlisting} \end{lstlisting}
\section{Set structure} \section{Set structures}
\index{set} \index{set}
@ -243,7 +243,7 @@ s.erase(s.find(5));
cout << s.count(5) << "\n"; // 2 cout << s.count(5) << "\n"; // 2
\end{lstlisting} \end{lstlisting}
\section{Map structure} \section{Map structures}
\index{map} \index{map}
@ -469,7 +469,7 @@ element that corresponds to $a$ or the previous element.
\section{Other structures} \section{Other structures}
\subsubsection{Bitset} \subsubsection{Bitsets}
\index{bitset} \index{bitset}
@ -524,7 +524,7 @@ cout << (a|b) << "\n"; // 1011111110
cout << (a^b) << "\n"; // 1001101110 cout << (a^b) << "\n"; // 1001101110
\end{lstlisting} \end{lstlisting}
\subsubsection{Deque} \subsubsection{Deques}
\index{deque} \index{deque}
@ -552,7 +552,7 @@ For this reason, a deque is slower than a vector.
Still, the time complexity of adding and removing Still, the time complexity of adding and removing
elements is $O(1)$ on average at both ends. elements is $O(1)$ on average at both ends.
\subsubsection{Stack} \subsubsection{Stacks}
\index{stack} \index{stack}
@ -574,7 +574,7 @@ cout << s.top(); // 5
s.pop(); s.pop();
cout << s.top(); // 2 cout << s.top(); // 2
\end{lstlisting} \end{lstlisting}
\subsubsection{Queue} \subsubsection{Queues}
\index{queue} \index{queue}
@ -596,7 +596,7 @@ s.pop();
cout << s.front(); // 2 cout << s.front(); // 2
\end{lstlisting} \end{lstlisting}
\subsubsection{Priority queue} \subsubsection{Priority queues}
\index{priority queue} \index{priority queue}
\index{heap} \index{heap}

View File

@ -119,7 +119,7 @@ we should form the sum $x-3$ or $x-4$.
Thus, the recursive formula is Thus, the recursive formula is
\[f(x) = \min(f(x-1),f(x-3),f(x-4))+1\] \[f(x) = \min(f(x-1),f(x-3),f(x-4))+1\]
where the function $\min$ returns the smallest where the function $\min$ gives the smallest
of its parameters. of its parameters.
In the general case, for the coin set In the general case, for the coin set
$\{c_1,c_2,\ldots,c_k\}$, $\{c_1,c_2,\ldots,c_k\}$,
@ -250,7 +250,7 @@ that are implemented using loops.
Still, the underlying idea is the same as Still, the underlying idea is the same as
in the recursive function. in the recursive function.
\subsubsection{Constructing the solution} \subsubsection{Constructing a solution}
Sometimes we are asked both to find the value Sometimes we are asked both to find the value
of an optimal solution and also to give of an optimal solution and also to give
@ -319,7 +319,7 @@ we maximize or minimize something in the recursion,
but now we will calculate sums of numbers of solutions. but now we will calculate sums of numbers of solutions.
To solve the problem, we can define a function $f(x)$ To solve the problem, we can define a function $f(x)$
that returns the number of ways to construct that gives the number of ways to construct
the sum $x$ using the coins. the sum $x$ using the coins.
For example, $f(5)=6$ when the coins are $\{1,3,4\}$. For example, $f(5)=6$ when the coins are $\{1,3,4\}$.
The value of $f(x)$ can be calculated recursively The value of $f(x)$ can be calculated recursively
@ -505,9 +505,9 @@ go through all previous values
$f(1),f(2),\ldots,f(k-1)$ and select the best solution. $f(1),f(2),\ldots,f(k-1)$ and select the best solution.
The time complexity of such an algorithm is $O(n^2)$. The time complexity of such an algorithm is $O(n^2)$.
Surprisingly, it is also possible to solve the Surprisingly, it is also possible to solve the
problem in $O(n \log n)$ time, but this is more difficult. problem in $O(n \log n)$ time. Can you see how?
\section{Path in a grid} \section{Paths in a grid}
Our next problem is to find a path Our next problem is to find a path
in an $n \times n$ grid in an $n \times n$ grid

View File

@ -245,13 +245,13 @@ Since both the left and right pointer
move $O(n)$ steps during the algorithm, move $O(n)$ steps during the algorithm,
the time complexity is $O(n)$. the time complexity is $O(n)$.
\subsubsection{2SUM-problem} \subsubsection{2SUM problem}
\index{2SUM-problem} \index{2SUM problem}
Another problem that can be solved using Another problem that can be solved using
the two pointers method is the following problem, the two pointers method is the following problem,
also known as the \key{2SUM-problem}: also known as the \key{2SUM problem}:
We are given an array of $n$ numbers and We are given an array of $n$ numbers and
a target sum $x$, and our task is to find two numbers a target sum $x$, and our task is to find two numbers
in the array such that their sum is $x$, in the array such that their sum is $x$,
@ -414,13 +414,13 @@ number such that the sum is $x$.
This can be done by performing $n$ binary searches, This can be done by performing $n$ binary searches,
and each search takes $O(\log n)$ time. and each search takes $O(\log n)$ time.
\index{3SUM-problem} \index{3SUM problem}
A more difficult problem is A more difficult problem is
the \key{3SUM-problem} that asks to the \key{3SUM problem} that asks to
find \emph{three} numbers in the array find \emph{three} numbers in the array
such that their sum is $x$. such that their sum is $x$.
This problem can be solved in $O(n^2)$ time. This problem can be solved in $O(n^2)$ time.
Can you see how it is possible? Can you see how?
\section{Nearest smaller elements} \section{Nearest smaller elements}

View File

@ -432,7 +432,7 @@ the union of the ranges $[2,5]$ and $[4,7]$:
Since $\textrm{rmq}(2,5)=3$ and $\textrm{rmq}(4,7)=1$, Since $\textrm{rmq}(2,5)=3$ and $\textrm{rmq}(4,7)=1$,
we can conclude that $\textrm{rmq}(2,7)=1$. we can conclude that $\textrm{rmq}(2,7)=1$.
\section{Binary indexed tree} \section{Binary indexed trees}
\index{binary indexed tree} \index{binary indexed tree}
\index{Fenwick tree} \index{Fenwick tree}
@ -567,7 +567,7 @@ corresponds to a range in the array:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\subsubsection{Sum query} \subsubsection{Sum queries}
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
@ -629,7 +629,7 @@ we can use the same trick that we used with sum arrays:
\[ \textrm{sum}(a,b) = \textrm{sum}(1,b) - \textrm{sum}(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 updates}
When a value in the array changes, When a value in the array changes,
several values in the binary indexed tree should be updated. several values in the binary indexed tree should be updated.
@ -731,7 +731,7 @@ values in the binary indexed tree, and each move
to the next position to the next position
takes $O(1)$ time using bit operations. takes $O(1)$ time using bit operations.
\section{Segment tree} \section{Segment trees}
\index{segment tree} \index{segment tree}
@ -841,7 +841,7 @@ node is the sum of the corresponding array elements,
and it can be calculated as the sum of and it can be calculated as the sum of
the values of its left and right child node. the values of its left and right child node.
\subsubsection{Range query} \subsubsection{Range queries}
The sum of elements in a given range The sum of elements in a given range
can be calculated as a sum of values in the segment tree. can be calculated as a sum of values in the segment tree.
@ -922,7 +922,7 @@ of the tree are needed.
Hence, the total number of nodes Hence, the total number of nodes
is only $O(\log n)$. is only $O(\log n)$.
\subsubsection{Array update} \subsubsection{Array updates}
When an element in the array changes, When an element in the array changes,
we should update all nodes in the tree we should update all nodes in the tree
@ -1200,7 +1200,7 @@ element in the whole array.
The operations can be implemented like previously, The operations can be implemented like previously,
but instead of sums, minima are calculated. but instead of sums, minima are calculated.
\subsubsection{Binary search in tree} \subsubsection{Binary search in a tree}
The structure of the segment tree allows us The structure of the segment tree allows us
to use binary search for finding elements in the array. to use binary search for finding elements in the array.

View File

@ -492,7 +492,7 @@ The reason for this is that any successor graph
corresponds to a function $f$ that defines corresponds to a function $f$ that defines
the edges in the graph. the edges in the graph.
The parameter for the function is a node in the graph, The parameter for the function is a node in the graph,
and the function returns the successor of the node. and the function gives the successor of the node.
\begin{samepage} \begin{samepage}
For example, the function For example, the function

View File

@ -18,7 +18,7 @@ find a such path if it exists.
On the contrary, checking the existence of a Hamiltonian path is a NP-hard On the contrary, checking the existence of a Hamiltonian path is a NP-hard
problem and no efficient algorithm is known for solving the problem. problem and no efficient algorithm is known for solving the problem.
\section{Eulerian path} \section{Eulerian paths}
\index{Eulerian path} \index{Eulerian path}
@ -391,7 +391,7 @@ to the circuit:
Now all edges are included in the circuit, Now all edges are included in the circuit,
so we have successfully constructed an Eulerian circuit. so we have successfully constructed an Eulerian circuit.
\section{Hamiltonian path} \section{Hamiltonian paths}
\index{Hamiltonian path} \index{Hamiltonian path}
@ -521,7 +521,7 @@ The function indicates whether there is a Hamiltonian path
that visits the nodes in $s$ and ends at node $x$. that visits the nodes in $s$ and ends at node $x$.
It is possible to implement this solution in $O(2^n n^2)$ time. It is possible to implement this solution in $O(2^n n^2)$ time.
\section{De Bruijn sequence} \section{De Bruijn sequences}
\index{De Bruijn sequence} \index{De Bruijn sequence}
@ -573,7 +573,7 @@ The starting node has $n-1$ characters
and there are $k^n$ characters in the edges, and there are $k^n$ characters in the edges,
so the length of the string is $k^n+n-1$. so the length of the string is $k^n+n-1$.
\section{Knight's tour} \section{Knight's tours}
\index{knight's tour} \index{knight's tour}

View File

@ -89,7 +89,7 @@ It is easy see that this flow is maximum,
because the total capacity of the edges because the total capacity of the edges
leading to the sink is $7$. leading to the sink is $7$.
\subsubsection{Minimum cut} \subsubsection{Minimum cuts}
\index{cut} \index{cut}
\index{minimum cut} \index{minimum cut}

View File

@ -323,7 +323,7 @@ There are $k+1$ positions,
so the number of solutions is so the number of solutions is
${n-2k+1+k+1-1 \choose n-2k+1} = {n-k+1 \choose n-2k+1}$. ${n-2k+1+k+1-1 \choose n-2k+1} = {n-k+1 \choose n-2k+1}$.
\subsubsection{Multinomial coefficient} \subsubsection{Multinomial coefficients}
\index{multinomial coefficient} \index{multinomial coefficient}

View File

@ -386,7 +386,7 @@ sticks in a nim heap.
When we know the Grundy numbers for all states, When we know the Grundy numbers for all states,
we can play the game like the nim game. we can play the game like the nim game.
\subsubsection{Grundy number} \subsubsection{Grundy numbers}
\index{Grundy number} \index{Grundy number}
\index{mex function} \index{mex function}

View File

@ -108,7 +108,7 @@ It means that $x<y$ if either $x \neq y$ and $x$ is a prefix of $y$,
or there is a position $k$ such that or there is a position $k$ such that
$x[i]=y[i]$ when $i<k$ and $x[k]<y[k]$. $x[i]=y[i]$ when $i<k$ and $x[k]<y[k]$.
\section{Trie structure} \section{Trie structures}
\index{trie} \index{trie}

View File

@ -199,7 +199,7 @@ Both operations can be implemented using
similar ideas, and it is even possible to construct similar ideas, and it is even possible to construct
a tree that supports both operations at the same time. a tree that supports both operations at the same time.
\subsubsection{Lazy segment tree} \subsubsection{Lazy segment trees}
Let us consider an example where our goal is to Let us consider an example where our goal is to
construct a segment tree that supports construct a segment tree that supports
@ -506,7 +506,7 @@ In this problem, it is easy to combine lazy updates,
because the combination of updates $z_1$ and $z_2$ because the combination of updates $z_1$ and $z_2$
corresponds to an update $z_1+z_2$. corresponds to an update $z_1+z_2$.
\subsubsection{Polynomial update} \subsubsection{Polynomial updates}
Lazy updates can be generalized so that it is Lazy updates can be generalized so that it is
possible to update ranges using polynomials of the form possible to update ranges using polynomials of the form
@ -584,7 +584,7 @@ node *u = new node(0, 0, 15);
u->s = 5; u->s = 5;
\end{lstlisting} \end{lstlisting}
\subsubsection{Sparse segment tree} \subsubsection{Sparse segment trees}
\index{sparse segment tree} \index{sparse segment tree}
@ -645,7 +645,7 @@ index compression (Chapter 9.4).
However, this is not possible if the indices However, this is not possible if the indices
are generated during the algorithm. are generated during the algorithm.
\subsubsection{Persistent segment tree} \subsubsection{Persistent segment trees}
\index{persistent segment tree} \index{persistent segment tree}

View File

@ -527,7 +527,7 @@ For example, the area of the polygon
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
is is
\[\frac{|(2\cdot5-4\cdot5)+(5\cdot3-5\cdot7)+(7\cdot1-3\cdot4)+(4\cdot3-1\cdot4)+(4\cdot4-3\cdot2)|}{2} = 17/2.\] \[\frac{|(2\cdot5-5\cdot4)+(5\cdot3-7\cdot5)+(7\cdot1-4\cdot3)+(4\cdot3-4\cdot1)+(4\cdot4-2\cdot3)|}{2} = 17/2.\]
The idea in the formula is to go through trapezoids The idea in the formula is to go through trapezoids
whose one side is a side of the polygon, whose one side is a side of the polygon,
@ -565,7 +565,7 @@ all such trapezoids, which yields the formula
Note that the absolute value of the sum is taken, Note that the absolute value of the sum is taken,
because the value of the sum may be positive or negative because the value of the sum may be positive or negative
depending on whether we walk clockwise or counterclockwise depending on whether we walk clockwise or counterclockwise
along the perimeter of the polygon. along the boundary of the polygon.
\subsubsection{Pick's theorem} \subsubsection{Pick's theorem}