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} \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}