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