Chapter 11 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-07 16:57:20 +02:00
parent ad051fb5c3
commit 38c6cda3ed
1 changed files with 82 additions and 77 deletions

View File

@ -393,36 +393,38 @@ is \emph{not} simple because there is an edge that begins
and ends at node 4, and there are two edges and ends at node 4, and there are two edges
between nodes 2 and 3. between nodes 2 and 3.
\section{Verkko muistissa} \section{Graph representation}
On monia tapoja pitää verkkoa muistissa algoritmissa. There are several ways how to represent graphs in memory
Sopiva tietorakenne riippuu siitä, in an algorithm.
kuinka suuri verkko on ja The choice of a data structure
millä tavoin algoritmi käsittelee sitä. depends on the size of the graph and
Seuraavaksi käymme läpi kolme tavallista vaihtoehtoa. how the algorithm manipulates it.
Next we will go through three representations.
\subsubsection{Vieruslistaesitys} \subsubsection{Adjacency list representation}
\index{vieruslista@vieruslista} \index{adjacency list}
Tavallisin tapa pitää verkkoa muistissa on A usual way to represent a graph is
luoda jokaisesta solmusta \key{vieruslista}, to create an \key{adjacency list} for each node.
joka sisältää kaikki solmut, An adjacency list contains contains all nodes
joihin solmusta pystyy siirtymään kaarta pitkin. that can be reached from the node using a single edge.
Vieruslistaesitys on tavallisin verkon esitysmuoto, ja The adjacency list representation is the most popular
useimmat algoritmit pystyy toteuttamaan way to store a graph, and most algorithms can be
tehokkaasti sitä käyttäen. efficiently implemented using it.
Kätevä tapa tallentaa verkon vieruslistaesitys on luoda taulukko, A good way to store the adjacency lists is to allocate an array
jossa jokainen alkio on vektori: whose each element is a vector:
\begin{lstlisting} \begin{lstlisting}
vector<int> v[N]; vector<int> v[N];
\end{lstlisting} \end{lstlisting}
Taulukossa solmun $s$ vieruslista on kohdassa $\texttt{v}[s]$. The adjacency list for node $s$ is in position
Vakio $N$ on valittu niin suureksi, $\texttt{v}[s]$ in the array.
että kaikki vieruslistat mahtuvat taulukkoon. The constant $N$ is so chosen that all
Esimerkiksi verkon adjacency lists can be stored.
For example, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -438,7 +440,7 @@ Esimerkiksi verkon
\path[draw,thick,->,>=latex] (4) -- (1); \path[draw,thick,->,>=latex] (4) -- (1);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
voi tallentaa seuraavasti: can be stored as follows:
\begin{lstlisting} \begin{lstlisting}
v[1].push_back(2); v[1].push_back(2);
v[2].push_back(3); v[2].push_back(3);
@ -447,18 +449,20 @@ v[3].push_back(4);
v[4].push_back(1); v[4].push_back(1);
\end{lstlisting} \end{lstlisting}
Jos verkko on suuntaamaton, sen voi tallentaa samalla tavalla, If the graph is undirected, it can be stored in a similar way,
mutta silloin jokainen kaari lisätään kumpaankin suuntaan. but each edge each is store in both directions.
Painotetun verkon tapauksessa rakennetta voi laajentaa näin: For an weighted graph, the structure can be extended
as follows:
\begin{lstlisting} \begin{lstlisting}
vector<pair<int,int>> v[N]; vector<pair<int,int>> v[N];
\end{lstlisting} \end{lstlisting}
Nyt vieruslistalla on pareja, joiden ensimmäinen kenttä on Now each adjacency list contains pairs whose first
kaaren kohdesolmu ja toinen kenttä on kaaren paino. element is the target node,
Esimerkiksi verkon and the second element is the edge weight.
For example, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -474,7 +478,7 @@ Esimerkiksi verkon
\path[draw,thick,->,>=latex] (4) -- node[font=\small,label=left:2] {} (1); \path[draw,thick,->,>=latex] (4) -- node[font=\small,label=left:2] {} (1);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
voi tallentaa seuraavasti: can be stored as follows:
\begin{lstlisting} \begin{lstlisting}
v[1].push_back({2,5}); v[1].push_back({2,5});
v[2].push_back({3,7}); v[2].push_back({3,7});
@ -483,40 +487,40 @@ v[3].push_back({4,5});
v[4].push_back({1,2}); v[4].push_back({1,2});
\end{lstlisting} \end{lstlisting}
Vieruslistaesityksen etuna on, että sen avulla on nopeaa selvittää, The benefit in the adjacency list representation is that
mihin solmuihin tietystä solmusta pääsee kulkemaan. we can efficiently find the nodes that can be
Esimerkiksi seuraava silmukka käy läpi kaikki solmut, reached from a certain node.
joihin pääsee solmusta $s$: For example, the following loop goes trough all nodes
that can be reached from node $s$:
\begin{lstlisting} \begin{lstlisting}
for (auto u : v[s]) { for (auto u : v[s]) {
// käsittele solmu u // process node u
} }
\end{lstlisting} \end{lstlisting}
\subsubsection{Vierusmatriisiesitys} \subsubsection{Adjacency matrix representation}
\index{vierusmatriisi@vierusmatriisi} \index{adjacency matrix}
\key{Vierusmatriisi} on kaksiulotteinen taulukko,
joka kertoo jokaisesta mahdollisesta kaaresta,
onko se mukana verkossa.
Vierusmatriisista on nopeaa tarkistaa,
onko kahden solmun välillä kaari.
Toisaalta matriisi vie paljon tilaa,
jos verkko on suuri.
Vierusmatriisi tallennetaan taulukkona
An \key{adjacency matrix} is a two-dimensional array
that indicates for each possible edge if it is
included in the graph.
Using an adjacency matrix, we can efficiently check
if there is an edge between two nodes.
On the other hand, the matrix takes a lot of memory
if the graph is large.
We can store the matrix as an array
\begin{lstlisting} \begin{lstlisting}
int v[N][N]; int v[N][N];
\end{lstlisting} \end{lstlisting}
where the value $\texttt{v}[a][b]$ indicates
jossa arvo $\texttt{v}[a][b]$ ilmaisee, whether the graph contains an edge from
onko kaari solmusta $a$ solmuun $b$ mukana verkossa. node $a$ to node $b$.
Jos kaari on mukana verkossa, If the edge is included in the graph,
niin $\texttt{v}[a][b]=1$, then $\texttt{v}[a][b]=1$,
ja muussa tapauksessa $\texttt{v}[a][b]=0$. and otherwise $\texttt{v}[a][b]=0$.
Nyt esimerkiksi verkkoa For example, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\node[draw, circle] (1) at (1,3) {$1$}; \node[draw, circle] (1) at (1,3) {$1$};
@ -531,7 +535,7 @@ Nyt esimerkiksi verkkoa
\path[draw,thick,->,>=latex] (4) -- (1); \path[draw,thick,->,>=latex] (4) -- (1);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
vastaa seuraava vierusmatriisi: can be represented as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.7] \begin{tikzpicture}[scale=0.7]
\draw (0,0) grid (4,4); \draw (0,0) grid (4,4);
@ -562,10 +566,11 @@ vastaa seuraava vierusmatriisi:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Jos verkko on painotettu, vierusmatriisiesitystä voi If the graph is directed, the adjacency matrix
laajentaa luontevasti niin, että matriisissa kerrotaan representation can be extended so that
kaaren paino, jos kaari on olemassa. the matrix contains the weight of the edge
Tätä esitystapaa käyttäen esimerkiksi verkkoa if the edge exists.
Using this representation, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -582,7 +587,7 @@ Tätä esitystapaa käyttäen esimerkiksi verkkoa
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\begin{samepage} \begin{samepage}
vastaa seuraava vierusmatriisi: corresponds to the following matrix:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.7] \begin{tikzpicture}[scale=0.7]
\draw (0,0) grid (4,4); \draw (0,0) grid (4,4);
@ -614,23 +619,23 @@ vastaa seuraava vierusmatriisi:
\end{center} \end{center}
\end{samepage} \end{samepage}
\subsubsection{Kaarilistaesitys} \subsubsection{Edge list representation}
\index{kaarilista@kaarilista} \index{edge list}
\key{Kaarilista} sisältää kaikki verkon kaaret. An \key{edge list} contains all edges of a graph.
Kaarilista on hyvä tapa tallentaa verkko, This is a convenient way to represent a graph,
jos algoritmissa täytyy käydä läpi if the algorithm will go trough all edges of the graph,
kaikki verkon kaaret eikä ole tarvetta and it is not needed to find edges that begin
etsiä kaarta alkusolmun perusteella. at a given node.
Kaarilistan voi tallentaa vektoriin The edge list can be stored in a vector
\begin{lstlisting} \begin{lstlisting}
vector<pair<int,int>> v; vector<pair<int,int>> v;
\end{lstlisting} \end{lstlisting}
jossa jokaisessa solmussa on parina kaaren where each element contains the starting
alku- ja loppusolmu. and ending node of an edge.
Tällöin esimerkiksi verkon Thus, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -646,7 +651,7 @@ Tällöin esimerkiksi verkon
\path[draw,thick,->,>=latex] (4) -- (1); \path[draw,thick,->,>=latex] (4) -- (1);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
voi tallentaa seuraavasti: can be represented as follows:
\begin{lstlisting} \begin{lstlisting}
v.push_back({1,2}); v.push_back({1,2});
v.push_back({2,3}); v.push_back({2,3});
@ -656,15 +661,15 @@ v.push_back({4,1});
\end{lstlisting} \end{lstlisting}
\noindent \noindent
Painotetun verkon tapauksessa rakennetta voi laajentaa If the graph is weighted, we can extend the
esimerkiksi näin: structure as follows:
\begin{lstlisting} \begin{lstlisting}
vector<pair<pair<int,int>,int>> v; vector<pair<pair<int,int>,int>> v;
\end{lstlisting} \end{lstlisting}
Nyt listalla on pareja, joiden ensimmäinen jäsen Now the list contains pairs whose first element
sisältää parina kaaren alku- ja loppusolmun, contains the starting and ending node of an edge,
ja toinen jäsen on kaaren paino. and the second element corresponds to the edge weight.
Esimerkiksi verkon For example, the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -681,7 +686,7 @@ Esimerkiksi verkon
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\begin{samepage} \begin{samepage}
voi tallentaa seuraavasti: can be represented as follows:
\begin{lstlisting} \begin{lstlisting}
v.push_back({{1,2},5}); v.push_back({{1,2},5});
v.push_back({{2,3},7}); v.push_back({{2,3},7});