Topological sorting

This commit is contained in:
Antti H S Laaksonen 2017-01-08 16:43:57 +02:00
parent ae8e753305
commit e2f30d154d
1 changed files with 71 additions and 72 deletions

View File

@ -1,32 +1,29 @@
\chapter{Directed graphs}
Tässä luvussa tutustumme kahteen suunnattujen
verkkojen alaluokkaan:
In this chapter, we focus on two classes of directed graphs:
\begin{itemize}
\item \key{Syklitön verkko}:
Tällaisessa verkossa ei ole yhtään sykliä,
eli mistään solmusta ei ole polkua takaisin
solmuun itseensä.
\item \key{Seuraajaverkko}:
Tällaisessa verkossa jokaisen solmun lähtöaste on 1
eli kullakin solmulla on yksikäsitteinen seuraaja.
\item \key{Acyclic graph}:
There are no cycles in the graph,
so there is no path from any node to itself.
\item \key{Successor graph}:
The outdegree of each node is 1,
so each node has a unique successor.
\end{itemize}
Osoittautuu, että kummassakin tapauksessa
verkon käsittely on yleistä verkkoa helpompaa
ja voimme käyttää tehokkaita algoritmeja, jotka
hyödyntävät oletuksia verkon rakenteesta.
It turns out that in both cases,
we can design efficient algorithms that are based
on the special properties of the graphs.
\section{Topologinen järjestys}
\section{Topological sorting}
\index{topologinen jxrjestys@topologinen järjestys}
\index{sykli@sykli}
\index{topological sorting}
\index{cycle}
\key{Topologinen järjestys} on tapa
järjestää suunnatun verkon solmut niin,
että jos solmusta $a$ pääsee solmuun $b$,
niin $a$ on ennen $b$:tä järjestyksessä.
Esimerkiksi verkon
A \key{topological sort} is a ordering
of the nodes of a directed graph
where node $a$ is always before node $b$
if there is a path from node $a$ to node $b$.
For example, for the graph
\begin{center}
\begin{tikzpicture}[scale=0.9]
\node[draw, circle] (1) at (1,5) {$1$};
@ -45,7 +42,7 @@ Esimerkiksi verkon
\path[draw,thick,->,>=latex] (3) -- (6);
\end{tikzpicture}
\end{center}
yksi topologinen järjestys on
a possible topological sort is
$[4,1,5,2,3,6]$:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -66,50 +63,49 @@ $[4,1,5,2,3,6]$:
\end{tikzpicture}
\end{center}
Topologinen järjestys on olemassa
aina silloin, kun verkko on syklitön.
Jos taas verkossa on sykli,
topologista järjestystä ei voi muodostaa,
koska mitään syklissä olevaa solmua ei voi
valita ensimmäisenä topologiseen järjestykseen.
Seuraavaksi näemme, miten syvyyshaun avulla
voi muodostaa topologisen järjestyksen tai
todeta, että tämä ei ole mahdollista syklin takia.
A topological sort always exists
if the graph is acyclic.
However, if the graph contains a cycle,
it is not possible to find a topological sort
because no node in the cycle can appear
before other nodes in the cycle in the ordering.
It turns out that we can use depth-first search
to both construct a topological sort or find out
that it is not possible because the graph contains a cycle.
\subsubsection{Algoritmi}
\subsubsection{Algorithm}
Ideana on käydä läpi verkon solmut ja aloittaa
solmusta uusi syvyyshaku aina silloin, kun solmua
ei ole vielä käsitelty.
Kunkin syvyyshaun aikana solmuilla on
kolme mahdollista tilaa:
The idea is to go through the nodes in the graph
and always begin a depth-first search if the
node has not been processed yet.
During each search, the nodes have three possible states:
\begin{itemize}
\item tila 0: solmua ei ole käsitelty (valkoinen)
\item tila 1: solmun käsittely on alkanut (vaaleanharmaa)
\item tila 2: solmu on käsitelty (tummanharmaa)
\item state 0: the node has not been processed (white)
\item state 1: the node is under processing (light gray)
\item state 2: the node has been processed (dark gray)
\end{itemize}
Aluksi jokaisen verkon solmun tila on 0.
Kun syvyyshaku saapuu solmuun, sen tilaksi tulee 1.
Lopuksi kun syvyyshaku on käsitellyt kaikki
solmun naapurit, solmun tilaksi tulee 2.
Initially, the state of each node is 0.
When a search reaches a node for the first time,
the state of the node becomes 1.
Finally, after all neighbors of a node have
been processed, the state of the node becomes 2.
Jos verkossa on sykli, tämä selviää syvyyshaun aikana siitä,
että jossain vaiheessa haku saapuu solmuun,
jonka tila on 1. Tässä tapauksessa topologista
järjestystä ei voi muodostaa.
If the graph contains a cycle, we will realize this
during the search because sooner or later
we will arrive at a node whose state is 1.
In this case, it is not possible to construct a topological sort.
Jos verkossa ei ole sykliä, topologinen järjestys
saadaan muodostamalla lista, johon kukin solmu lisätään
silloin, kun sen tilaksi tulee 2.
Tämä lista käänteisenä on yksi verkon
topologinen järjestys.
If the graph doesn't contain a cycle, we can construct
a topological sort by adding each node to the end of a list
when its state becomes 2.
This list in reverse order is a topological sort.
\subsubsection{Esimerkki 1}
\subsubsection{Example 1}
Esimerkkiverkossa syvyyshaku etenee ensin solmusta 1
solmuun 6 asti:
In the example graph, the search first proceeds
from node 1 to node 6:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -132,8 +128,8 @@ solmuun 6 asti:
\end{tikzpicture}
\end{center}
Tässä vaiheessa solmu 6 on käsitelty, joten se lisätään listalle.
Sen jälkeen haku palaa takaisinpäin:
Now node 6 has been processed, so it is added to the list.
After this, the search returns back:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -154,8 +150,8 @@ Sen jälkeen haku palaa takaisinpäin:
\end{tikzpicture}
\end{center}
Tämän jälkeen listan sisältönä on $[6,3,2,1]$.
Sitten seuraava syvyyshaku alkaa solmusta 4:
At this point, the list contains values $[6,3,2,1]$.
The next search begins at node 4:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -178,9 +174,11 @@ Sitten seuraava syvyyshaku alkaa solmusta 4:
\end{tikzpicture}
\end{center}
Tämän seurauksena listaksi tulee $[6,3,2,1,5,4]$.
Kaikki solmut on käyty läpi, joten topologinen järjestys on valmis.
Topologinen järjestys on lista käänteisenä eli $[4,5,1,2,3,6]$:
Thus, the final list is $[6,3,2,1,5,4]$.
We have processed all nodes, so a topological sort has
been found.
The topological sort is the reverse list
$[4,5,1,2,3,6]$:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -201,13 +199,14 @@ Topologinen järjestys on lista käänteisenä eli $[4,5,1,2,3,6]$:
\end{tikzpicture}
\end{center}
Huomaa, että topologinen järjestys ei ole yksikäsitteinen,
vaan verkolla voi olla useita topologisia järjestyksiä.
Note that a topological sort is not unique,
but there can be several topological sorts for a graph.
\subsubsection{Esimerkki 2}
\subsubsection{Example 2}
Tarkastellaan sitten tilannetta, jossa topologista järjestystä
ei voi muodostaa syklin takia. Näin on seuraavassa verkossa:
Let's consider another example where we can't
construct a topological sort because there is a
cycle in the graph:
\begin{center}
\begin{tikzpicture}[scale=0.9]
@ -227,7 +226,7 @@ ei voi muodostaa syklin takia. Näin on seuraavassa verkossa:
\path[draw,thick,->,>=latex] (3) -- (6);
\end{tikzpicture}
\end{center}
Nyt syvyyshaun aikana tapahtuu näin:
Now the search proceeds as follows:
\begin{center}
\begin{tikzpicture}[scale=0.9]
\node[draw, circle,fill=gray!20] (1) at (1,5) {$1$};
@ -247,9 +246,9 @@ Nyt syvyyshaun aikana tapahtuu näin:
\path[draw=red,thick,->,line width=2pt] (5) -- (2);
\end{tikzpicture}
\end{center}
Syvyyshaku saapuu tilassa 1 olevaan solmuun 2,
mikä tarkoittaa, että verkossa on sykli.
Tässä tapauksessa sykli on $2 \rightarrow 3 \rightarrow 5 \rightarrow 2$.
The search reaches node 2 whose state is 1
which means the graph contains a cycle.
In this case, the cycle is $2 \rightarrow 3 \rightarrow 5 \rightarrow 2$.
\section{Dynaaminen ohjelmointi}