Verkkoalgoritmit - luentokalvot osa 1


811312A Tietorakenteet
ja algoritmit
2014 - 2015
V Verkkojen algoritmeja
Osa1 : Leveys- ja syvyyshaku

Sisältö
1.
2.
3.
4.
5.
Johdanto
Leveyshaku
Syvyyshaku
Kruskalin algoritmi
Dijkstran algoritmi
Ari Vesanen
811312A TRA Verkot / osa 1
2

V.1 Johdanto


Verkkoalgoritmit ovat yleisimpiä ja tärkeimpiä
algoritmityyppejä
 tunnetaan suuri määrä erilaisia algoritmeja
 verkkoalgoritmeja on analysoitu laajasti.
Yleisneuvo algoritmiseen ongelmaan: muunna verkkojen
ongelmaksi
 ratkaisu saattaa olla yleisesti tunnettu tai
 ongelma osoitettu vaikeaksi.
Ari Vesanen
811312A TRA Verkot / osa 1
3

V.1.1 Verkon määritelmä



Verkko (graafi, graph) on pari G = (V, E), missä
 V on solmujen (vertices) epätyhjä joukko
 E on välien (edges) joukko E ⊆ V × V (relaatio
solmujen joukossa)
 E määrittelee, mitkä solmut on kytketty toisiinsa.
Verkko voi olla suunnattu tai suuntaamaton:
Suuntaamattomassa verkossa ehdosta i, j ∈ E seuraa
aina j, i ∈ E.
Verkko voi olla painotettu: väleihin liitetään luku, ns.
painoarvo
Ari Vesanen
811312A TRA Verkot / osa 1
4

V.1.2 Esimerkki
1
1
2
5
2
5
3
4

Suunnattu verkko
Ari Vesanen
3
4

Suuntaamaton verkko
811312A TRA Verkot / osa 1
5

V.1.2 Esimerkki (2)


Kuvion esittämille verkoille
 solmujen joukko V = { 1, 2, 3, 4, 5 }.
 välien joukko suunnatulle verkolle
E = {(1,2),(2,4),(2,5),(3,2),(3,5),(4,3),(5,4)}
 välien joukko suuntaamattomalle verkolle
E = {(1,2),(2,1),(2,4),(4,2),(2,5),(5,2),(3,2),(2,3),(3,5),
(5,3),(4,3),(3,4),(5,4),(4,5)}
Suunnatuille väleille käytetään joskus kulmasulkeita ja
silloin kaarisulut varataan suuntaamattomille
(kaksisuuntaisille) väleille
Ari Vesanen
811312A TRA Verkot / osa 1
6
V.1.3 Verkkojen esittäminen
Matriisesitys:
Verkko:
1
2
5
0
1
0
0
0
0
0
0
1
1
0
1
0
0
1
0
0
1
0
0
0
0
0
1
0
Adj
3
4
Vieruslistaesitys:
1
2
/
2
4
5
/
3
2
5
/
4
3
/
5
4
/

V.2 Leveyshaku (Breadth-first search)



Yksinkertaisimpia algoritmeja verkon läpikäymiseen
Toimii monien algoritmien pohjaratkaisuna
Idea: Valitaan kiinteä solmu s ja käydään välejä
systemaattisesti läpi, kunnes kohdataan kaikki solmut,
joihin solmusta s voidaan päästä.
 Ensin löydetään kaikki etäisyydellä 1 olevat solmut,
sitten etäisyydellä 2 olevat solmut jne. -> Nimitys
leveyshaku
Ari Vesanen
811312A TRA Verkot / osa 1
8

V.2 Leveyshaku (2)




Käyttää (FIFO-tyyppistä) jonoa Q
 Operaatiot ENQUEUE ja DEQUEUE
Taulukko color: Solmujen värit kussakin vaiheessa
 Valkoinen: Solmua ei vielä löydetty
 Musta: Solmu ja sen kaikki naapurit löydetty
 Harmaa: Solmu löydetty mutta sillä voi olla valkeita
naapureita
Taulukko d: Solmujen etäisyydet lähtösolmusta
Taulukko p: Solmujen edeltäjät lyhimmässä polussa
 Lopuksi voidaan lukea lyhin polku mihin tahansa
solmuun (lopusta alkuun)
Ari Vesanen
811312A TRA Verkot / osa 1
9

V.2.1 Leveyshaun algoritmi
Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään
vieruslistaesitystä.
Tulostus: N solmujen lukumäärä. N-paikkaiset taulukot p,d ja color
indeksoidaan verkon solmuilla. Taulukkoon d lasketaan solmun
etäisyys syötesolmusta s. Arvo INF = ei polkua. Taulukkoon p
lasketaan solmun edeltäjäsolmu jossakin lyhimmässä polussa
syötesolmusta s. Arvo NIL = ei polkua.
BFS(G,s)
1.
for each u in V
2.
color[u] = WHITE
3.
d[u] = INF
4.
p[u] = NIL
5.
d[s] = 0
6.
color[s] = GRAY
7.
Q = EMPTY
8.
ENQUEUE(Q,s)
Ari Vesanen
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
while Q != EMPTY
u = DEQUEUE(Q)
for each v in Adj[u]
if color[v] == WHITE
color[v] = GRAY
d[v] = d[u]+1
p[v] = u
ENQUEUE(Q,v)
color[u] = BLACK
return
811312A TRA Verkot / osa 1
10

V.2.2 Esimerkki: Leveyshaun eteneminen
1:
a
b
c
d
INF
0
INF
INF
INF
INF
INF
e
f
g
Q:b
0
3: a
b
c
d
1
0
INF
INF
INF
1
INF
e
f
g
Ari Vesanen
Q: f
1
2:
a
b
c
d
1
0
INF
INF
INF
1
INF
e
f
g
Q:a, f
11
4: a
b
c
d
1
0
2
INF
2
1
2
e
f
g
811312A TRA Verkot / osa 1
Q:e, c, g
2 2 2
11

V.2.2 Esimerkki: Leveyshaun eteneminen (2)
5: a
b
c
d
1
0
2
2
1
2
e
f
g
a
b
c
d
1
0
2
2
1
2
e
f
g
7:
Ari Vesanen
6: a
b
c
d
INF
1
0
2
3
Q:c, g
2 2
2
1
2
e
f
g
8:
Q:g, d
2 3
a
b
c
d
3
1
0
2
3
Q:d
3
2
1
2
Q:
e
f
g
811312A TRA Verkot / osa 1
12

V.2.3 Leveyshaun algoritmin analyysi:
kompleksisuus





Oletetaan, että verkossa N solmua ja M väliä
Tarkka askelten määrä riippuu verkon rakenteesta
Yläraja suoritettavien rivien määrälle 6∙(N+M)
Siis algoritmin kompleksisuusluokka O(N+M)
HUOM! Jos verkossa lähes kaikkien solmujen välillä on
kytkentä, on M luokkaa N2. Tällöin siis algoritmin
kompleksisuus on luokkaa O(N2).
Ari Vesanen
811312A TRA Verkot / osa 1
13

V.2.3 Leveyshaun algoritmin analyysi: oikeellisuus
Olkoon algoritmin syötesolmu s
 Merkintä: (s,v) on solmun v etäisyys solmusta s
 Algoritmi todettu oikeaksi, kun osoitetaan:
1. Algoritmin suorituksen jälkeen kaikki solmusta s
saavutettavat solmut löydetään
2. Taulukon d arvo d[v] = (s,v)
3. Jos v≠s, ja v voidaan saavuttaa solmusta s, niin jokin
lyhimmistä poluista solmusta s solmuun v on polku
solmusta s solmuun p[v] ja väli (p[v],v)

Ari Vesanen
811312A TRA Verkot / osa 1
14

V.2.4 Leveyshaun sovelluksia



Lyhimmän polun hakeminen kahden solmun väliltä
Verkon yhtenäisyyden selvittäminen
Yhdistettyjen komponenttien hakeminen
Ari Vesanen
811312A TRA Verkot / osa 1
15

V.2.4.1 Lyhimmän polun tulostaminen
Syöte: Verkko G=(V,E) ja sen solmut s ja v. Algoritmissa oletetaan
ensin ajettavan BFS(G,s), jonka tuottamaa taulukkoa p käytetään.
Tulostus: Lyhin polku solmusta s solmuun v tai ilmoitus siitä, että
polkua ei ole.
BFS_POLKU(G,s,v)
1. if v==s
2.
tulosta s
3. else
4.
if p[v] == NIL
5.
tulosta ”Ei polkua”
6.
else
7.
BFS_POLKU(G,s,p[v])
8.
tulosta v
9. return
Ari Vesanen
811312A TRA Verkot / osa 1
16

V.3 Syvyyshaku




Monipuolisempi kuin leveyshaku
Laajempi sovellettavuus
Hieman haastavampi käyttää
Idea: Mennään verkossa aina aluksi niin ”syvälle” kuin
päästään, ts. tarkistetaan, onko tutkittavalla solmulla s
vielä tutkimattomia siitä lähteviä välejä
 Kun kaikki välit on tutkittu, algoritmi perääntyy
solmuun, josta solmu s löydettiin ja tutkii siitä
lähtevät välit
 Jatketaan, kunnes lähtösolmusta saavutettavat
solmut on kaikki tutkittu
 Jos vielä tutkimattomia solmuja, valitaan uusi
lähtösolmu
Ari Vesanen
811312A TRA Verkot / osa 1
17

V.3 Syvyyshaku (2)



Toteutuksesta:
Käytetään samankaltaista solmujen värittämistä ja
edeltäjätaulukkoa kuin leveyshaussa
Lisäksi globaali askelmuuttuja, joka ilmaisee kunkin
solmun löytämis- ja tarkastelun lopettamisajan
 Tallennetaan aikaleimoina kahteen taulukkoon
 Aikaleimojen avulla saadaan verkon rakenteesta
tarkempaa tietoa kuin leveyshaulla
Ari Vesanen
811312A TRA Verkot / osa 1
18

V.3.1 Syvyyshaun algoritmi
Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään
vieruslistaesitystä.
Tulostus: Olkoon N solmujen lukumäärä. N-paikkaiset taulukot p,d,f ja
color indeksoidaan verkon solmuilla. Taulukkoon p lasketaan solmun
edeltäjäsolmu syvyyshakupuussa. Taulukkoon d lasketaan solmun
havaitsemisaika ja taulukkoon f solmun käsittelyn lopetusaika.
DFS(G)
1.for each u in V
2. color[u] = WHITE
3. p[u] = NIL
4. time = 0
5.for each u in V
6. if color[u]==WHITE
7.
DFS_VISIT(u)
8.return
Ari Vesanen
DFS_VISIT(u)
1. color[u] = GRAY
2. time = time+1
3. d[u] = time
4. for each v in Adj[u]
5.
if color[v]==WHITE
6.
p[v] = u
7.
DFS_VISIT(v)
8. color[u] = BLACK
9. time = time+1
10.f[u] = time
11.return
811312A TRA Verkot / osa 1
19

V.3.2 Syvyyshaun eteneminen
1: a
b
c
1/
2: a
b
1/
2/
c
d
e
f
d
e
f
3: a
b
c
4: a
b
c
1/
2/
1/
2/
B
3/
d
Ari Vesanen
e
f
4/
3/
d
e
811312A TRA Verkot / osa 1
f
20

V.3.2 Syvyyshaun eteneminen (2)
5: a
b
1/
2/
c
6: a
b
1/
2/
B
B
4/5
3/
d
e
7: a
b
1/
4/5
3/6
f
d
e
f
c
8: a
b
c
2/7
1/8
B
F
4/5
3/6
d
e
Ari Vesanen
c
f
2/7
B
4/5
3/6
d
e
811312A TRA Verkot / osa 1
f
21

V.3.2 Syvyyshaun eteneminen (3)
9: a
1/8
b
c
2/7
9/
B
F
3/6
d
e
11: a
F
1/8
F
4/5
1/8
10: a
b
c
2/7
9/
C
B
4/5
3/6
10/
f
d
e
f
b
c
12: a
b
c
2/7
9/
2/7
9/12
B
C
1/8
F
B
C
4/5
3/6
10/11
4/5
3/6
10/11
d
e
f
d
e
f
Ari Vesanen
811312A TRA Verkot / osa 1
22

V.3.3 Syvyyshaun kompleksisuus




Oletetaan, että verkossa N solmua ja M väliä
Algoritmi DFS_VISIT suoritetaan täsmälleen kerran
jokaiselle solmulle
Jokainen solmusta lähtevä väli tutkitaan DFS_VISITissä
vakioaikaisella operaatiolla sekä mahdollisella
DFS_VISIT-kutsulla
Siis kompleksisuus Θ(N+M)
Ari Vesanen
811312A TRA Verkot / osa 1
23

V.3.4 Syvyyshaun ominaisuuksia


Edeltäjätaulukossa p[u] = v, jos ja vain jos (u,v) on
verkon väli ja v havaitaan siinä vaiheessa, kun u on
väriltään harmaa
Muodostetaan verkko, jonka välit ovat (p[u],u) solmuille
u joilla on edeltäjä
 Saadaan puiden muodostama verkko =
syvyyssuuntainen virittävä metsä (depth-first
forest)
 Jos solmu v samassa puussa solmun u kanssa ja
solmusta u lähtevässä alipuussa, sanotaan, että u on
solmun v edeltäjä ja v solmun u jälkeläinen
 Solmu u solmun v edeltäjä tarkalleen silloin, kun u on
väriltään harmaa havaittaessa solmu v
Ari Vesanen
811312A TRA Verkot / osa 1
24

V.3.4 Syvyyshaun ominaisuuksia (2)

Esimerkkiverkon syvyysuuntainen virittävä metsä
a
c
b
f
e
d
Ari Vesanen
811312A TRA Verkot / osa 1
25

V.3.4 Syvyyshaun ominaisuuksia (3)
Olkoot u ja v verkon G solmuja ja suoritetaan verkolle
syvyyshaku. Silloin jokin seuraavasta kolmesta ehdosta
on voimassa:
1. Välit [d[u],f[u]] ja [d[v],f[v]] ovat erilliset eikä u ole
solmun v jälkeläinen eikä v solmun u jälkeläinen
2. Väli [d[u],f[u]] sisältyy kokonaisuudessaan väliin
[d[v],f[v]] ja u on solmun v jälkeläinen
3. Väli [d[v],f[v]] sisältyy kokonaisuudessaan väliin
[d[u],f[u]] ja v on solmun u jälkeläinen
 Seuraus: Solmu v on solmun u jälkeläinen jos ja vain
jos d[u] < d[v] < f[v] < f[u]

Ari Vesanen
811312A TRA Verkot / osa 1
26

V.3.4 Syvyyshaun ominaisuuksia (4)

Solmujen käsittelyajat esimerkkiverkossa
a
c
b
f
e
d
1
Ari Vesanen
2
3
4
5
6
7
8
9 10 11 12
811312A TRA Verkot / osa 1
27

V.3.4 Syvyyshaun ominaisuuksia (5)

1.
2.
3.
4.
Verkon välit jaetaan seuraaviin luokkiin:
Puuvälit (tree edges) ovat välejä syvyysmetsän
puissa
 Siten (u,v) on puuväli, jos solmu v havaittiin väliä
(u,v) tutkimalla
Takautuvat välit (back edges) välejä (u,v), joissa u
on solmun v jälkeläinen jossakin syvyysmetsän puussa
Etenevät välit (forward edges) välejä (u,v), joissa u
on solmun v edeltäjä jossakin syvyysmetsän puussa, ja
(u,v) ei ole puuväli
Sivuttaisvälit (cross edges) ovat välejä, jotka eivät
kuulu mihinkään luokista 1-3
Ari Vesanen
811312A TRA Verkot / osa 1
28

V.3.4 Syvyyshaun ominaisuuksia (6)

Välien luokittelu esimerkkiverkossa
a
b
c
1/8
2/7
9/12
B
F
C
Puuväli
F
Etenevä väli
4/5
3/6
10/11
B
Takautuva väli
d
e
f
C
Sivuttaisväli
Ari Vesanen
811312A TRA Verkot / osa 1
29

V.3.5 Syklin havaiseminen syvyyshaulla


Verkossa sykli tarkalleen silloin, kun syvyyshaku tuottaa
vähintään yhden takautuvan välin
Väli (u,v) on takautuva, jos u on solmun v jälkeläinen
 Tällöin väliä ensimmäistä kertaa tutkittaessa solmun v
on oltava harmaa, jolloin v on solmun u edeltäjä
 Takautuva väli voidaan havaita algoritmin
suoritusvaiheessa -> Saadaan versio, joka havaitsee
syklin
Ari Vesanen
811312A TRA Verkot / osa 1
30
V.3.5 Syklin havaiseminen syvyyshaulla (2)

Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä.
Tulostus: Kuten syvyyshaku, mutta palauttaa arvon TRUE, jos verkossa sykli
ja arvon FALSE muuten
DFS(G)
1.for each u in V
2. color[u] = WHITE
3. p[u] = NIL
4. time = 0
5. cycle = FALSE
6.for each u in V
7. if color[u]==WHITE
8.
DFS_VISIT(u)
9.return cycle
Ari Vesanen
DFS_VISIT(u)
1. color[u] = GRAY
2. time = time+1
3. d[u] = time
4. for each v in Adj[u]
5.
if color[v]==GRAY
6.
cycle=TRUE
8.
if color[v]==WHITE
9.
p[v] = u
10.
DFS_VISIT(v)
13. color[u] = BLACK
14. time = time+1
15. f[u] = time
16. return
811312A TRA Verkot / osa 1
31

V.3.6 Vahvasti yhtenäiset komponentit




Vahvasti yhtenäinen komponentti suunnatussa verkossa
on sellainen maksimaalinen solmujen joukko, että aina
kun u ja v ovat joukon solmuja, on olemassa polku sekä
solmusta u solmuun v että solmusta v solmuun u
Esimerkkiverkossa vahvasti yhtenäiset komponentit ovat
{a}, {b,d,e}, {c} ja {f}
Voidaan löytää syvyyshaulla
Merkintä: kun G on verkko, niin GT on verkko joka
saadaan G:stä kääntämällä välien suunnat
 Voidaan tehdä ajassa O(N+M), jos G:ssä M väliä
Ari Vesanen
811312A TRA Verkot / osa 1
32

V.3.6 Vahvasti yhtenäiset komponentit (2)
Syöte: Suunnattu verkko G=(V,E). Verkolle oletetaan käytettävän
vieruslistaesitystä.
Tulostus: Syöteverkon vahvasti yhtenäiset komponentit.
SCC(G)
1.
Suorita DFS(G), käytetään solmujen
käsittelyajan päättymistaulukkoa f.
2.
Muodosta GT
3.
Suorita DFS(GT), mutta pääsilmukassa (rivi 6)
käsitellään solmut askelessa 1 saatujen f[u]:n
arvojen suhteen vähenevässä järjestyksessä.
4.
Askelessa 3 syntyvän virittävän metsän
jokainen puu on verkon G vahvasti yhtenäinen
komponentti.
Ari Vesanen
811312A TRA Verkot / osa 1
33

V.3.6 Vahvasti yhtenäiset komponentit (3)





Analyysi. Verkko G, jossa N solmua ja M väliä
Kompleksisuus:
Kahdesti syvyyshaku (Θ(N+M))
GT:n muodostaminen (Θ(N+M))
Koko algoritmin kompleksisuus Θ(N+M)
Ari Vesanen
811312A TRA Verkot / osa 1
34

V.3.6 Vahvasti yhtenäiset komponentit (4)
Oikeellisuus:
1. Jos solmut u ja v samassa komponentissa, G:ssä polku
u:sta v:hen ja päinvastoin. Samoin GT:ssä.
 u ja v päätyvät samaan puuhun
2. Olkoot u ja v samassa puussa, jonka juuri on x
 Siis GT:ssä polut x->u ja x->v, joten G:ssä on polut
u->x ja v->x
 Syvyyshakujärjestys GT:lle takaa myös G:ssä polut
x->u ja x->v
 Siten u ja v samassa komponentissa
 Kohdat 1 ja 2 osoittavat algoritmin oikeaksi

Ari Vesanen
811312A TRA Verkot / osa 1
35

V.3.7 Syvyyshaku suuntaamattomassa verkossa



Toimii samaan tapaan kuin suunnatuissa verkoissa
Välien luokittelua tulkittava
 Suuntaamattomassa verkossa väli (u,v) ja (v,u)
samaistetaan
 Välin luokaksi annetaan se, joka tehdään, kun väliä
tarkastellaan ensimmäistä kertaa, olipa kyseessä vali
(u,v) tai (v,u)
 Suuntaamattoman verkon välit kaikki joko puuvälejä
tai takautuvia välejä
Syvyyssuuntaisen virittävän metsän puut antavat verkon
yhtenäiset komponentit
Ari Vesanen
811312A TRA Verkot / osa 1
36