Merge pull request #23 from ollpu/master

Improve grammar and language style in chapter 4
This commit is contained in:
pllk 2017-03-12 13:35:14 +02:00 committed by GitHub
commit 42bba7de70
1 changed files with 26 additions and 26 deletions

View File

@ -3,7 +3,7 @@
\index{data structure} \index{data structure}
A \key{data structure} is a way to store A \key{data structure} is a way to store
data in the memory of the computer. data in the memory of a computer.
It is important to choose an appropriate It is important to choose an appropriate
data structure for a problem, data structure for a problem,
because each data structure has its own because each data structure has its own
@ -16,7 +16,7 @@ data structures in the C++ standard library.
It is a good idea to use the standard library It is a good idea to use the standard library
whenever possible, whenever possible,
because it will save a lot of time. because it will save a lot of time.
Later in the book we will learn more sophisticated Later in the book we will learn about more sophisticated
data structures that are not available data structures that are not available
in the standard library. in the standard library.
@ -30,7 +30,7 @@ size can be changed during the execution
of the program. of the program.
The most popular dynamic array in C++ is The most popular dynamic array in C++ is
the \texttt{vector} structure, the \texttt{vector} structure,
that can be used almost like an ordinary array. which can be used almost like an ordinary array.
The following code creates an empty vector and The following code creates an empty vector and
adds three elements to it: adds three elements to it:
@ -61,7 +61,7 @@ for (int i = 0; i < v.size(); i++) {
\end{lstlisting} \end{lstlisting}
\begin{samepage} \begin{samepage}
A shorter way to iterate trough a vector is as follows: A shorter way to iterate through a vector is as follows:
\begin{lstlisting} \begin{lstlisting}
for (auto x : v) { for (auto x : v) {
@ -101,7 +101,7 @@ vector<int> v(10);
vector<int> v(10, 5); vector<int> v(10, 5);
\end{lstlisting} \end{lstlisting}
The internal implementation of the vector The internal implementation of a vector
uses an ordinary array. uses an ordinary array.
If the size of the vector increases and If the size of the vector increases and
the array becomes too small, the array becomes too small,
@ -144,15 +144,15 @@ maintains a collection of elements.
The basic operations of sets are element The basic operations of sets are element
insertion, search and removal. insertion, search and removal.
C++ contains two set implementations: The C++ standard library contains two set
\texttt{set} and \texttt{unordered\_set}. implementations: \texttt{set} and \texttt{unordered\_set}.
The structure \texttt{set} is based on a balanced The structure \texttt{set} is based on a balanced
binary tree and the time complexity of its binary tree and the time complexity of its
operations is $O(\log n)$. operations is $O(\log n)$.
The structure \texttt{unordered\_set} uses hashing, The structure \texttt{unordered\_set} uses hashing,
and the time complexity of its operations is $O(1)$ on average. and the time complexity of its operations is $O(1)$ on average.
The choice which set implementation to use The choice of which set implementation to use
is often a matter of taste. is often a matter of taste.
The benefit in the \texttt{set} structure The benefit in the \texttt{set} structure
is that it maintains the order of the elements is that it maintains the order of the elements
@ -197,7 +197,7 @@ for (auto x : s) {
\end{lstlisting} \end{lstlisting}
An important property of sets is An important property of sets is
that all the elements are \emph{distinct}. that all their elements are \emph{distinct}.
Thus, the function \texttt{count} always returns Thus, the function \texttt{count} always returns
either 0 (the element is not in the set) either 0 (the element is not in the set)
or 1 (the element is in the set), or 1 (the element is in the set),
@ -216,7 +216,7 @@ cout << s.count(5) << "\n"; // 1
C++ also contains the structures C++ also contains the structures
\texttt{multiset} and \texttt{unordered\_multiset} \texttt{multiset} and \texttt{unordered\_multiset}
that work otherwise like \texttt{set} that otherwise work like \texttt{set}
and \texttt{unordered\_set} and \texttt{unordered\_set}
but they can contain multiple instances of an element. but they can contain multiple instances of an element.
For example, in the following code all three instances For example, in the following code all three instances
@ -255,9 +255,9 @@ where $n$ is the size of the array,
the keys in a map can be of any data type and the keys in a map can be of any data type and
they do not have to be consecutive values. they do not have to be consecutive values.
C++ contains two map implementations that The C++ standard library contains two map
correspond to the set implementations: implementations that correspond to the set
the structure implementations: the structure
\texttt{map} is based on a balanced \texttt{map} is based on a balanced
binary tree and accessing elements binary tree and accessing elements
takes $O(\log n)$ time, takes $O(\log n)$ time,
@ -295,7 +295,7 @@ if (m.count("aybabtu")) {
cout << "key exists in the map"; cout << "key exists in the map";
} }
\end{lstlisting} \end{lstlisting}
The following code prints all keys and values The following code prints all the keys and values
in a map: in a map:
\begin{lstlisting} \begin{lstlisting}
for (auto x : m) { for (auto x : m) {
@ -312,8 +312,8 @@ operate with iterators.
An \key{iterator} is a variable that points An \key{iterator} is a variable that points
to an element in a data structure. to an element in a data structure.
Often used iterators are \texttt{begin} The often used iterators \texttt{begin}
and \texttt{end} that define a range that contains and \texttt{end} define a range that contains
all elements in a data structure. all elements in a data structure.
The iterator \texttt{begin} points to The iterator \texttt{begin} points to
the first element in the data structure, the first element in the data structure,
@ -374,7 +374,7 @@ random_shuffle(t, t+n);
Iterators are often used to access Iterators are often used to access
elements of a set. elements of a set.
The following code creates an iterator The following code creates an iterator
\texttt{it} that points to the first element in the set: \texttt{it} that points to the first element in a set:
\begin{lstlisting} \begin{lstlisting}
set<int>::iterator it = s.begin(); set<int>::iterator it = s.begin();
\end{lstlisting} \end{lstlisting}
@ -397,7 +397,7 @@ Iterators can be moved using the operators
meaning that the iterator moves to the next meaning that the iterator moves to the next
or previous element in the set. or previous element in the set.
The following code prints all elements in the set: The following code prints all the elements in the set:
\begin{lstlisting} \begin{lstlisting}
for (auto it = s.begin(); it != s.end(); it++) { for (auto it = s.begin(); it != s.end(); it++) {
cout << *it << "\n"; cout << *it << "\n";
@ -429,7 +429,7 @@ whose value is \emph{larger than} $x$.
If such elements do not exist, If such elements do not exist,
the return value of the functions will be \texttt{end}. the return value of the functions will be \texttt{end}.
These functions are not supported by the These functions are not supported by the
\texttt{unordered\_set} structure that \texttt{unordered\_set} structure which
does not maintain the order of the elements. does not maintain the order of the elements.
\begin{samepage} \begin{samepage}
@ -462,7 +462,7 @@ If \texttt{a} equals \texttt{begin},
the corresponding element is nearest to $x$. the corresponding element is nearest to $x$.
If \texttt{a} equals \texttt{end}, If \texttt{a} equals \texttt{end},
the last element in the set is nearest to $x$. the last element in the set is nearest to $x$.
If none of the previous cases holds, If none of the previous cases hold,
the element nearest to $x$ is either the the element nearest to $x$ is either the
element that corresponds to $a$ or the previous element. element that corresponds to $a$ or the previous element.
\end{samepage} \end{samepage}
@ -534,7 +534,7 @@ Like a vector, a deque provides the functions
\texttt{push\_back} and \texttt{pop\_back}, but \texttt{push\_back} and \texttt{pop\_back}, but
it also provides the functions it also provides the functions
\texttt{push\_front} and \texttt{pop\_front} \texttt{push\_front} and \texttt{pop\_front}
that are not available in a vector. which are not available in a vector.
A deque can be used as follows: A deque can be used as follows:
\begin{lstlisting} \begin{lstlisting}
@ -580,7 +580,7 @@ cout << s.top(); // 2
A \texttt{queue} also A \texttt{queue} also
provides two $O(1)$ time operations: provides two $O(1)$ time operations:
adding a element to the end of the queue, adding an element to the end of the queue,
and removing the first element in the queue. and removing the first element in the queue.
It is only possible to access the first It is only possible to access the first
and last element of a queue. and last element of a queue.
@ -619,7 +619,7 @@ a heap structure that is much simpler than a
balanced binary tree needed for an ordered set. balanced binary tree needed for an ordered set.
\begin{samepage} \begin{samepage}
As default, the elements in the C++ By default, the elements in the C++
priority queue are sorted in decreasing order, priority queue are sorted in decreasing order,
and it is possible to find and remove the and it is possible to find and remove the
largest element in the queue. largest element in the queue.
@ -652,7 +652,7 @@ priority_queue<int,vector<int>,greater<int>> q;
\section{Comparison to sorting} \section{Comparison to sorting}
Often it is possible to solve a problem It is often possible to solve a problem
using either data structures or sorting. using either data structures or sorting.
Sometimes there are remarkable differences Sometimes there are remarkable differences
in the actual efficiency of these approaches, in the actual efficiency of these approaches,
@ -730,8 +730,8 @@ the running time, because algorithm 2
is 45 times faster than algorithm 1. is 45 times faster than algorithm 1.
However, the most efficient algorithm is algorithm 3 However, the most efficient algorithm is algorithm 3
that uses sorting. which uses sorting.
It only uses half of the time compared to algorithm 2. It only uses half the time compared to algorithm 2.
Interestingly, the time complexity of both Interestingly, the time complexity of both
algorithm 1 and algorithm 3 is $O(n \log n)$, algorithm 1 and algorithm 3 is $O(n \log n)$,
but despite this, algorithm 3 is ten times faster. but despite this, algorithm 3 is ten times faster.