Chapter 13 first version
This commit is contained in:
parent
11e33b0eba
commit
3e98e762f6
140
luku13.tex
140
luku13.tex
|
@ -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{Floyd–Warshallin algoritmi}
|
\section{Floyd–Warshall algorithm}
|
||||||
|
|
||||||
\index{Floyd–Warshallin algoritmi}
|
\index{Floyd–Warshall algorithm}
|
||||||
|
|
||||||
\key{Floyd–Warshallin algoritmi}
|
The \key{Floyd–Warshall 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 Floyd–Warshall algorithm
|
||||||
|
works in the following graph:
|
||||||
Tarkastellaan Floyd–Warshallin
|
|
||||||
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}
|
||||||
|
|
||||||
Floyd–Warshallin algoritmin etuna on,
|
The benefit in the
|
||||||
että se on helppoa toteuttaa.
|
Floyd–Warshall 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 Floyd–Warshallin
|
Since the implementation of the Floyd–Warshall
|
||||||
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ä.
|
|
Loading…
Reference in New Issue