Chapter 13 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-07 20:50:41 +02:00
parent 11e33b0eba
commit 3e98e762f6
1 changed files with 64 additions and 76 deletions

View File

@ -590,33 +590,28 @@ $O(n+m \log m)$ because the algorithm goes through
all nodes in the graph, and adds for each edge all nodes in the graph, and adds for each edge
at most one estimated distance to the priority queue. at most one estimated distance to the priority queue.
\section{FloydWarshallin algoritmi} \section{FloydWarshall algorithm}
\index{FloydWarshallin algoritmi} \index{FloydWarshall algorithm}
\key{FloydWarshallin algoritmi} The \key{FloydWarshall algorithm}
on toisenlainen lähestymistapa is an alternative way to approach the problem
lyhimpien polkujen etsintään. of finding shortest paths.
Toisin kuin muut tämän luvun algoritmit, Unlike other algorihms in this chapter,
se etsii yhdellä kertaa lyhimmät polut kaikkien it finds all shortest paths between the nodes
verkon solmujen välillä. in a single run.
The algorithm maintains a two-dimensional array
that contains distances between the nodes.
First, the distances are calculated only using
direct edges between the nodes.
After this the algorithm updates the distances
by allowing to use intermediate nodes in the paths.
Algoritmi ylläpitää kaksiulotteista \subsubsection{Example}
taulukkoa etäisyyksistä solmujen
välillä.
Ensin taulukkoon on merkitty
etäisyydet käyttäen vain solmujen
välisiä kaaria.
Tämän jälkeen algoritmi
päivittää etäisyyksiä,
kun verkon solmut saavat yksi kerrallaan
toimia välisolmuina poluilla.
\subsubsection{Esimerkki} Let's consider how the FloydWarshall algorithm
works in the following graph:
Tarkastellaan FloydWarshallin
algoritmin toimintaa seuraavassa verkossa:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -635,13 +630,12 @@ algoritmin toimintaa seuraavassa verkossa:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Algoritmi merkitsee aluksi taulukkoon Initially, the distance from each node to itself is $0$,
etäisyyden 0 jokaisesta solmusta itseensä and the distance between nodes $a$ and $b$ is $x$
sekä etäisyyden $x$, jos solmuparin välillä if there is an edge between nodes $a$ and $b$ with weight $x$.
on kaari, jonka pituus on $x$. All other distances are infinite.
Muiden solmuparien etäisyys on aluksi ääretön.
Tässä verkossa taulukosta tulee: In this graph, the initial array is as follows:
\begin{center} \begin{center}
\begin{tabular}{r|rrrrr} \begin{tabular}{r|rrrrr}
& 1 & 2 & 3 & 4 & 5 \\ & 1 & 2 & 3 & 4 & 5 \\
@ -654,18 +648,17 @@ Tässä verkossa taulukosta tulee:
\end{tabular} \end{tabular}
\end{center} \end{center}
\vspace{10pt} \vspace{10pt}
Algoritmin toiminta muodostuu peräkkäisistä kierroksista. The algorithm consists of successive rounds.
Jokaisella kierroksella valitaan yksi uusi solmu, On each round, one new node is selected that
joka saa toimia välisolmuna poluilla, can act as intermediate node in paths,
ja algoritmi parantaa taulukon and the algorithm improves the distances in the array
etäisyyksiä muodostaen polkuja tämän solmun avulla. using this node.
Ensimmäisellä kierroksella solmu 1 on välisolmu. On the first round, node 1 is the intermediate node.
Tämän ansiosta solmujen 2 ja 4 välille muodostuu Now there is a new path between nodes 2 and 4
polku, jonka pituus on 14, with length 14 because node 1 connects them.
koska solmu 1 yhdistää ne toisiinsa. Correspondingly, there is a new path
Vastaavasti solmut 2 ja 5 yhdistyvät polulla, between nodes 2 and 5 with length 6.
jonka pituus on 6.
\begin{center} \begin{center}
\begin{tabular}{r|rrrrr} \begin{tabular}{r|rrrrr}
@ -680,9 +673,9 @@ jonka pituus on 6.
\end{center} \end{center}
\vspace{10pt} \vspace{10pt}
Toisella kierroksella solmu 2 saa toimia välisolmuna. On the second round, node 2 is the intermediate node.
Tämä mahdollistaa uudet polut solmuparien 1 ja 3 This creates new paths between nodes 1 and 3,
sekä 3 ja 5 välille: and between nodes 3 and 5:
\begin{center} \begin{center}
\begin{tabular}{r|rrrrr} \begin{tabular}{r|rrrrr}
@ -697,8 +690,8 @@ sekä 3 ja 5 välille:
\end{center} \end{center}
\vspace{10pt} \vspace{10pt}
Kolmannella kierroksella solmu 3 saa toimia välisolmuna, On the third round, node 3 is the intermediate round.
jolloin syntyy uusi polku solmuparin 2 ja 4 välille: There is a new path between nodes 2 and 4:
\begin{center} \begin{center}
\begin{tabular}{r|rrrrr} \begin{tabular}{r|rrrrr}
@ -713,13 +706,10 @@ jolloin syntyy uusi polku solmuparin 2 ja 4 välille:
\end{center} \end{center}
\vspace{10pt} \vspace{10pt}
The algorithm continues like this,
Algoritmin toiminta jatkuu samalla tavalla until all nodes have been intermediate nodes.
niin, että kukin solmu tulee vuorollaan After the algorithm has finished, the array contains
välisolmuksi. the minimum distance between any two nodes:
Algoritmin päätteeksi taulukko sisältää
lyhimmän etäisyyden minkä tahansa
solmuparin välillä:
\begin{center} \begin{center}
\begin{tabular}{r|rrrrr} \begin{tabular}{r|rrrrr}
@ -733,9 +723,9 @@ solmuparin välillä:
\end{tabular} \end{tabular}
\end{center} \end{center}
Esimerkiksi taulukosta selviää, että lyhin polku For example, the array indicates that the
solmusta 2 solmuun 4 on pituudeltaan 8. shortest path between nodes 2 and 4 has length 8.
Tämä vastaa seuraavaa polkua: This corresponds to the following path:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -758,16 +748,17 @@ Tämä vastaa seuraavaa polkua:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\subsubsection{Toteutus} \subsubsection{Implementation}
FloydWarshallin algoritmin etuna on, The benefit in the
että se on helppoa toteuttaa. FloydWarshall algorithm that it is
Seuraava toteutus muodostaa etäisyysmatriisin easy to implement.
\texttt{d}, jossa $\texttt{d}[a][b]$ The following code constructs a
on pienin etäisyys polulla solmusta $a$ solmuun $b$. distance matrix \texttt{d} where $\texttt{d}[a][b]$
Aluksi algoritmi alustaa matriisin \texttt{d} is the smallest distance in a path between nodes $a$ and $b$.
verkon vierusmatriisin \texttt{v} perusteella First, the algorithm initializes \texttt{d}
(arvo $10^9$ kuvastaa ääretöntä): using the adjacency matrix \texttt{v} of the graph
(value $10^9$ means infinity):
\begin{lstlisting} \begin{lstlisting}
for (int i = 1; i <= n; i++) { for (int i = 1; i <= n; i++) {
@ -779,7 +770,7 @@ for (int i = 1; i <= n; i++) {
} }
\end{lstlisting} \end{lstlisting}
Tämän jälkeen lyhimmät polut löytyvät seuraavasti: After this, the shortest paths can be found as follows:
\begin{lstlisting} \begin{lstlisting}
for (int k = 1; k <= n; k++) { for (int k = 1; k <= n; k++) {
@ -791,16 +782,13 @@ for (int k = 1; k <= n; k++) {
} }
\end{lstlisting} \end{lstlisting}
Algoritmin aikavaativuus on The time complexity of the algorithm is $O(n^3)$
$O(n^3)$, koska siinä on kolme sisäkkäistä because it contains three nested loops
silmukkaa, that go through the nodes in the graph.
jotka käyvät läpi verkon solmut.
Koska FloydWarshallin Since the implementation of the FloydWarshall
algoritmin toteutus on yksinkertainen, algorithm is simple, the algorithm can be
algoritmi voi olla hyvä valinta jopa silloin, a good choice even if we need to find only a
kun haettavana on yksittäinen single shortest path in the graph.
lyhin polku verkossa. However, this is only possible when the graph
Tämä on kuitenkin mahdollista vain silloin, is so small that a cubic time complexity is enough.
kun verkko on niin pieni,
että kuutiollinen aikavaativuus on riittävä.