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
© Copyright 2025