Verkot ja verkkoalgoritmit

Tietorakenteet ja algoritmit
Verkot
Ari Korhonen
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
1
10. VERKOT ( graphs )
§ 
§ 
§ 
§ 
§ 
§ 
§ 
§ 
§ 
§ 
10.1 Yleistä
10.2 Terminologiaa
10.3 Verkon esittäminen
10.4 Verkon läpikäyntialgoritmit (graph traversal)
10.5 Painotetut verkot (weighted graphs)
10.6 Pienin virityspuu (minimun spanning tree)
10.7 Lyhin reitti (shortest path)
10.8 Verkon yhtenäisyys (graph connectivity)
10.9 Suunnatut verkot
10.10* Joukot ja verkot
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
2
10.1 Yleistä
§  Verkko on kokoelma solmuja (vertex), joita yhdistää toisiinsa
joukko särmiä (edge). Särmiä kutsutaan myös kaariksi (arc).
§  Solmuilla on nimi ja niihin voi liittyä dataa
A
B
C
D
17. ja 24.11.2015
E
Tietorakenteet ja algoritmit - syksy 2015
3
§  Särmät yksilöidään niiden päätesolmujen avulla. Särmiin voi
liittyä paino (weight)
§  Verkon määrittely ei riipu siitä, miten se on esitetty tai piirretty.
Usein maantieteellinen esitys on selkein
§  Verkkojen ja verkkoalgoritmien
sovelluksia:
•  Lentoyhtiön aikataulu
•  Maantieverkko
•  Projektin aikataulu
•  Putkistokaavio
•  Virtapiiri
•  Tietoliikenneverkko
•  3D malli kappaleesta
17. ja 24.11.2015
A
B
C
D
Tietorakenteet ja algoritmit - syksy 2015
E
4
Eräitä verkkoihin liittyviä ongelmia:
§  Onko reittiä pisteestä A pisteeseen B?
§  Mikä on lyhin reitti pisteestä A pisteeseen B, kun lasketaan
särmät?
§  Mikä on halvin reitti pisteestä A pisteeseen B, kun lasketaan
särmiin liittyvät kustannukset?
§  Mikä on pienin kustannus, jolla verkon eri solmut voidaan
yhdistää toisiinsa?
§  Voidaanko verkko levittää tasoon?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
5
10.2 Terminologiaa
§ 
§ 
§ 
§ 
§ 
Polku (path)
Yksinkertainen polku (simple path)
Silmukka (cycle)
suunnattu verkko (directed graph, network)
suuntaamaton verkko (undirected graph)
•  yhtenäinen (connected)
§  painotettu verkko (weighted graph)
§  Verkon erikoistapauksia (puut, metsä, täydellinen)
•  virityspuu (spanning tree)
•  täydellinen (complete)
§  Vahvasti yhtenäiset komponentit (strongly connected
components)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
6
10.2 Terminologiaa
Solmujen väliset yhteydet:
§  Polku (path) on solmujen lista, joka johtaa solmusta x solmuun y,
siten että listan peräkkäisten solmujen välillä on särmä
§  Yksinkertainen polku (simple path) ei kulje saman solmun kautta
kahdesti
§  Silmukka (cycle) on yksinkertainen polku, paitsi että sen alku- ja
loppusolmut ovat samat
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
7
§  Jos verkon särmiä voi edetä vain tiettyyn suuntaan, kyseessä on
suunnattu verkko (directed graph, network). Muutoin verkko on
suuntaamaton (undirected)
Esimerkki: Projektin aikataulu. Mikä vaihe seuraa mitäkin?
§  Jos verkon särmiin liittyy jokin kustannus, on kyseessä
painotettu verkko (weighted graph)
Esimerkki: Maantieverkko + etäisyydet
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
8
Verkon yhtenevyys:
§  Suuntaamaton verkko on yhtenäinen (connected), jos jokaisesta
solmusta on polku kaikkiin muihin solmuihin
§  Epäyhtenäinen verkko koostuu yhtenäisistä osaverkoista
Esimerkki: Suomen maantieverkko on epäyhtenäinen, koska tietä
pitkin ei pääse kaikkiin kaupunkeihin, esim. Maarianhaminaan.
Välissä tarvitaan muunlaisia yhteyksiä.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
9
Puut:
§  Puu (tree) on yhtenäinen suuntaamaton verkko, jossa ei ole
silmukoita
⇒  Puussa kahden solmun välillä on vain yksi (yksinkertainen)
polku
⇒  Jos puuhun lisätään särmä muodostuu silmukka
§  Metsä (forest) on epäyhtenäinen verkko, jonka yhtenäiset osat
ovat puita
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
10
§  Virityspuu (spanning tree) on verkon yhtenäinen aliverkko, joka
sisältää kaikki verkon solmut, mutta vain niin paljon särmiä kuin
tarvitaan muodostamaan niistä puu
Esimerkki 1: Pienin määrä johtoa, mikä tarvitaan yhdistämään
tietty joukko kytkentäpisteitä
Esimerkki 2: Lyhimmät reitit annetusta lähtöpisteestä kaikkiin
muihin verkon solmuihin.
§  Virityspuu ei ole yksikäsitteinen
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
11
Verkon G=(V,E), jossa on |V| solmua, särmien E ⊆ V × V määrä:
§  Puu, jossa on |V| solmua, sisältää |E| = |V| - 1 särmää
§  Suuntaamattomassa verkossa, jossa on |V| solmua, särmien
määrä |E| voi olla:
0 ≤ |E| ≤ |V|(|V|-1)/2
§  Usein itseisarvomerkit (||) jätetään pois, E = O(V2)
§  Verkko, jossa on kaikki mahdolliset särmät, on täydellinen
(complete)
§  Verkkoa voidaan sanoa tiheäksi (dense) tai harvaksi (sparse).
Rajakynnyksenä esimerkiksi V log V särmää.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
12
Kysymyksiä
§  Mikä on maksimimäärä kaaria suuntaamattomassa verkossa, jossa
on 4 solmua?
§  Jos yhtenäisen verkon virityspuussa on 10 kaarta, niin kuinka
monta solmua virityspuussa on?
§  Mikä on minimimäärä solmuja suuntaamattomassa verkossa, jossa
on sykli?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
13
10.3 Verkon esittäminen
Verkko voidaan esittää tietorakenteena usealla eri tavalla:
1) Yhteysmatriisi (adjacency matrix)
§  Oletetaan, että verkon solmut kuvataan kokonaislukuina 1..V
§  Esimerkkiverkko voidaan esittää nyt matriisimuodossa, jossa
alkio 1 kuvaa särmän olemassaoloa ja alkio 0, että särmää ei ole.
A
B
C
17. ja 24.11.2015
A
B
C
Tietorakenteet ja algoritmit - syksy 2015
A
1
0
1
B
0
1
1
C
1
1
1
14
§  Sovitaan, että alkiosta on yhteys itseensä
§  Suuntaamattoman verkon matriisissa puolet alkioista on
tarpeettomia, mutta neliömatriisia on helpompi käsitellä
algoritmisesti kuin kolmiomatriisia.
§  Suunnatussa verkossa matriisi ei ole symmetrinen
§  Yhteysmatriisi soveltuu tiheille verkoille
A
B
C
17. ja 24.11.2015
A
B
C
Tietorakenteet ja algoritmit - syksy 2015
A
1
0
1
B
0
1
1
C
1
1
1
15
2) Seuraajaluettelo (adjacency structure/list)
§  Jokaisen solmun vieruslistassa eli seuraajaluettelossa luetellaan
kaikki ne solmut, joihin on särmä tästä solmusta
§  Esimerkkiverkon vieruslista:
A
B
A: C
B: C
C: A, B
C
§  Toteutettavissa tehokkaasti linkitettyinä listoina
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
16
A
B
D
C
E
F
H
17. ja 24.11.2015
G
A:
F, C, B, G
B:
A
C:
A
D:
F, E
E:
G,F, D
F:
A, E, D
G:
E, A
H:
I
I:
H
I
Tietorakenteet ja algoritmit - syksy 2015
17
10.4 Verkon läpikäyntialgoritmit
(graph traversal)
§  Algoritmien tavoitteena on käydä läpi verkon kaikki solmut
§  Tätä varten verkon ajatellaan koostuvan kolmesta osasta:
1) Virityspuu (spanning tree)
•  Solmut, joissa on jo käyty (closed)
2) Reunus (fringe)
•  Solmut, joiden etäisyys puusta on yksi särmä (open)
3) Tuntematon (unseen)
•  Muut solmut, jotka ovat siis kauempana puusta
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
18
§  Verkko (sen yhtenäinen osa) käydään läpi valitsemalla
reunukselta jokin solmu, liittämällä se puuhun ja siirtämällä sen
naapurit reunukseen
§  Eri algoritmit poikkeavat siinä
•  mikä solmu reunukselta valitaan
•  miten reunus on toteutettu
§  Lopputuloksena saadaan verkon virityspuu
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
19
Eräs mahdollinen virityspuu
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
20
10.4.1 Syvyyssuuntainen läpikäynti (depth-first search, DFS)
§  Menetelmässä valitaan aina reunuksen uusin solmu ja liitetään se puuhun
(lopputuloksena syntyy verkon syvyyssuuntainen virityspuu)
§  Reunus toteutetaan pinona:
§  Pinon päällimmäinen solmu liitetään puuhun
§  Tämän vierekkäiset tuntemattomat solmut työnnetään pinoon
§  Pinon lisäksi ylläpidetään aputaulukoita visited[] ja parent[]
•  ∀ i: visited[i]
•  ∀ i: parent[i]
17. ja 24.11.2015
= 0, jos i tuntematon,
= -1, jos i reunuksessa, ja
> 0, jos i kuuluu virityspuuhun
= solmun i isä verkon virityspuussa
Tietorakenteet ja algoritmit - syksy 2015
21
10.4.2 Rekursiivinen DFS
§  Rekursiivinen toteutus käy verkon kaikki solmut läpi seuraavalla
tavalla:
1.  Vieraile (visit) solmussa
2.  Tutki, onko seuraajalistan mukaisissa solmuissa vierailtu
3.  Jos jossakin listan solmussa ei ole käyty, kutsu rekursiivista
DFS:ää tälle solmulle
§  Rekursiivisen algoritmin ja pinoalgoritmin DFS-puut ovat erilaisia.
Miksi?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
22
Depth-first Search
Algorithm DFS(G)
Algorithm DFS-VISIT(G, u)
1. for each u V[G] do
1. visited[u] ← true
2.
visited[u] ← false
2. for each v Adj[u] do
3.
finished[u] ← false
3.
if visited[v] = false then
4. for each u V[G] do
4.
DFS-VISIT(G, v)
5.
if visited[u] = false
5. finished[u] ← true
6.
DFS-VISIT(G, u) Muuttuja
u on askeltaja, joka käy läpi tietorakennetta (verkon solmuja).
Jokaiselle solmulle on varattu yksisuuntaiset liput visited[u] ja finished[u].
Rekursiossa parametri G on kiintoarvo ja u on kulkija. Muuttuja v on askeltaja.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
23
Mikä solmu merkitään lipulla finished (rivi 5)
ensimmäisenä?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
24
DFS algoritmin tehokkuus on:
§  Seuraajalistalle Θ(V + E)
§  Yhteysmatriisille Θ(V2)
DFS-algoritmilla voidaan ratkaista eräitä tärkeitä verkkoihin
liittyviä ongelmia, mm.
§  Onko verkko yhtenäinen?
§  Mitkä ovat verkon yhtenäiset osaverkot?
§  Onko verkossa silmukoita?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
25
Luentotehtävä
Esitä pinon sisältö, kun seuraava verkko käydään läpi eirekursiivisella DFS-algoritmille alkaen solmusta A. Esitä myös
muodostuva virityspuu.
A: B D C
B: A C G
C: B A E
D: A E F I
E: D H C
F: D I
G: B
H: E
I: D F
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
26
10.4.3 Leveyssuuntainen läpikäynti (breadth-first search, BFS)
§  Menetelmässä valitaan aina reunuksen vanhin solmu ja liitetään
se puuhun
§  Reunus toteutetaan jonona:
§  Jonon ensimmäinen solmu liitetään puuhun
§  Tämän vierekkäiset alkiot laitetaan jonon loppuun, elleivät ne jo
ole jonossa
Tuloksena saadaan BFS-puu (leveyssuuntainen virityspuu)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
27
Breadth-first search
1. Initialize empty queue Q
2. for each u V[G] do 3.
visited[u] ← false 4.
finished[u] ← false 5. visited[s] ← true
6. ENQUEUE(Q, s)
7. while Q not empty do
8.
u ← DEQUEUE(Q) 9.
for each v Adj[u] do
10.
if visited[v] = false then
10.
visited[v] ← true
12.
ENQUEUE(Q, v)
13.
finished[u] ← true 17. ja 24.11.2015
// u: askeltaja
// visited[u], finished[u]:
// yksisuuntaiset liput
// Q: säiliö (jono)
// u: kulkija
// v: askeltaja
Tietorakenteet ja algoritmit - syksy 2015
28
BFS ratkaisee eräitä verkko-ongelmia
§  Mikä on lyhin reitti pisteestä A pisteeseen B, jos lasketaan vain
kuljettujen särmien määrää?
§  Mitkä ovat lyhimmät reitit kaikkiin solmuihin lähtien solmusta A,
jos lasketaan vain kuljettujen särmien määrää?
DFS:n ja BFS:n perusero:
§  DFS etenee verkossa niin pitkälle kuin mahdollista ja peruuttaa
sitten etsiessään uutta etenemishaaraa
§  BFS etenee verkossa leveällä rintamalla säilyttäen saman
etäisyyden lähtöpisteeseen
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
29
§  Reunuksen esittämiseen käytetty tietorakenne voidaan yleistää
prioriteettijonoksi, jollain saadaan erilaisia PFS-hakuja (priorityfirst search)
•  Mikä on painotetun verkon pienin virityspuu?
•  Mikä on lyhin reitti pisteestä A pisteeseen B painotetussa
verkossa?
•  Mitkä ovat lyhimmät reitit kaikkiin solmuihin lähtien solmusta
A, jos verkko on painotettu?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
30
10.5 Painotetut verkot (weighted graphs)
§  Painotetussa verkossa jokaiseen särmään liittyy kustannus, esim.
•  Aikataulu: hinta tai matkan pituus
•  Projektikaavio: osatyön kestoaika
•  Sähkökytkentä: johdon pituus
§  Algoritmeissa käytetään usein termiä etäisyys, vaikka kysymys
on painosta
§  Yleensä painot ovat positiivisia. Negatiivisten painojen
esiintyminen voi mutkistaa algoritmeja merkittävästi
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
31
§  Painot voidaan esittää yhteysmatriisissa hyvin helposti
A
B
2
3
C
A
B
C
A
0
0
2
B
0
0
3
C
2
3
0
§  Lävistäjäalkiot on selkeintä pitää nollina
§  Seuraajaluettelossa esitykseen täytyy liittää painotiedot:
A: (C, 2)
B: (C, 3)
C: (A, 2), (B, 3)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
32
10.6 Pienin virityspuu (minimum spanning tree)
§  Yhtenäisen verkon pienin virityspuu on niiden särmien joukko,
jotka yhdistävät verkon kaikki solmut toisiinsa siten, että kaarien
painojen summa on pienin mahdollinen.
⇒  Pienin virityspuu ei ole välttämättä yksikäsitteinen
⇒  Tämän joukon täytyy olla välttämättä puu, koska muuten siinä
olisi silmukka ja sen purkaminen vähentäisi kokonaispainoa.
§  Puu voidaan löytää useilla erilaisilla algoritmeilla
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
33
10.6.1 Primin algoritmi (pienimmän virityspuun laskemiseksi)
§  Verkko esitetään yhteysmatriisin avulla, jonka koko on V * V
§  Reunus toteutetaan prioriteettijonolla (taulukko kokoa |V|)
§  Jokaisella kierroksella käydään läpi yksi yhteysmatriisin rivi
(solmusta k lähtevät särmät) ja tehdään seuraavat asiat:
1.  Poistetaan pienimmän kustannuksen omaava solmu k
prioriteettitaulukosta ja liitetään se puuhun
2.  Lisätään k:n viereiset solmut prioriteettitaulukkoon ja
merkitään niiden prioriteetiksi etäisyys k:hon
3.  Jos viereinen solmu on jo prioriteettitaulukossa, päivitetään
sen prioriteettiarvo, jos etäisyys k:hon on lyhyempi kuin
aikaisemmin löydetty kaari
4.  Etsitään prioriteettitaulukon pienin alkio, josta tulee uusi k
seuraavalle kierrokselle
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
34
Esimerkki: Primin algoritmi
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
35
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
36
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
37
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
38
•  Relaksaatio
•  Päivitetään arvoa prioriteettijonossa, jos löytyy lyhyempi
yhteys
Prioriteettijono
b 2 (a)
c 5 (a)
17. ja 24.11.2015
Prioriteettijono
lisätään
solmu b
c 2 (b)
c 5 (a)
5
a
2
Tietorakenteet ja algoritmit - syksy 2015
b
2
c
39
§  Verkko voidaan esittää myös vieruslistana ja prioriteettijono keon
avulla
•  Tehokkuus: O( (E + V) log V)
§  Primin algoritmissa riittää vierusmatriisin leveyden V kokoinen
taulukko, jolloin tehokkuus on Θ(V2) (soveltuu tiheille verkoille).
KUMPI ON TEHOKKAAMPI?
Tiheille verkoille E=Θ(V2), jolloin (E+V) logV = Θ(V2 log V)
Harvoille verkoille E=o(V2) , jolloin (E+V) logV = Ω(V log V)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
40
Lause:
Kun verkon solmut jaetaan kahteen joukkoon, niin pienin
virityspuu sisältää lyhimmän särmän, joka yhdistää näiden
joukkojen jotkin kaksi solmua.
a<b≤c≤d
b
a
c
d
§  Kyseiset joukot ovat {visited} ja {unvisited}
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
41
Todistus:
Vastaväite: Kyseinen särmä ei kuulu pieninpään virityspuuhun.
⇒  Lyhin särmän voidaan lisätä pienimpään virityspuuhun
⇒  Vastaava pidempi yhteys voidaan poistaa
⇒  Saatiin uusi virityspuu, joka on pienempi
⇒  Alkuperäinen virityspuu ei ollutkaan pienin virityspuu
⇒  Päädytään ristiriitaan, joten alkuperäinen lause on tosi
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
42
Luentotehtävä
Etsi seuraavan verkon pienin virityspuu.
Piirrä reunus ja dad-taulukko algoritmin
etenemisen aikana
A: (B,2), (F,4)
B: (A,2), (C,1), (D,3)
C: (B,1), (D,2), (G,1)
D: (B,3), (C,2), (E,1)
E: (D,1), (G,5)
F: (A,4), (G,4)
G: (C,1), (E,5),(F,4)
17. ja 24.11.2015
https://trakla.cs.hut.fi/ebook/ebook-Pienin_virityspuu_Prim.html
Tietorakenteet ja algoritmit - syksy 2015
43
10.7 Lyhin reitti (shortest path)
§  Halutaan löytää reitti solmusta A solmuun B siten, että polkuun
kuuluvien särmien painojen summa on pienin mahdollinen
§  Tuloksena saadaan samalla lyhimpien reittien virityspuu (shortest
paths spanning tree)
§  Useita eri algoritmeja
10.7.1 BFS
§  Jos painot ovat saman suuruisia, voidaan käyttää
leveyssuuntaista läpikäyntiä
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
44
10.7.2 Dijkstran algoritmi
§  Verkko esitetään yhteysmatriisin avulla, jonka koko on V * V
§  Reunus toteutetaan prioriteettijonona (vrt. Primin algoritmi)
§  Jokaisella kierroksella käydään läpi yksi yhteysmatriisin rivi
(solmusta k lähtevät särmät) ja tehdään seuraavat asiat:
1.  Poistetaan solmu k prioriteettijonosta ja liitetään se puuhun
2.  Lisätään k:n viereiset solmut prioriteettijonoon ja merkitään
niiden prioriteetiksi etäisyys lähtösolmuun (k:n prioriteetti +
k:n ja vierussolmun välinen paino)
3.  Jos viereinen solmu on jo prioriteettijonossa, päivitetään sen
prioriteettiarvoa mikäli löydetty uusi polku k:n kautta on
lyhyempi kuin aiemmin löydetty etäisyys lähtösolmuun
4.  Etsitään prioriteettijonon pienin alkio, josta tulee uusi k
seuraavalle kierrokselle
§  Tehokkuus: O(V2) (soveltuu tiheille verkoille)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
45
10.7.2 Dijkstran algoritmi
§  Jos prioriteettijonon toteutuksena on keko ja verkko kuvataan
seuraajalistan avulla suoritusaika on O( (E + V) log V)
§  Kyseessä on yleisesti ns. PFS-haku (Priority First Search)
•  Pienimmän virityspuun tapauksessa (Primin algoritmi) suurin
prioriteetti on solmulla, joka on lähinnä jo löydettyä
virityspuuta
•  Lyhimmän reitin etsinnässä (Dijkstran algoritmi) suurin
prioriteetti on solmulla, jonka etäisyys lähtöspisteestä on
lyhin.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
46
Luentotehtävä
Etsi lyhin reitti A:sta E:hen. Piirrä reunus ja dad-taulukko algoritmin
etenemisen aikana
A: (B,2), (F,3)
B: (A,2), (C,1), (D,3)
C: (B,1), (D,1), (G,1)
D: (B,3), (C,1), (E,4)
E: (D,4), (G,5)
F: (A,3), (G,1)
G: (C,1), (E,5),(F,1)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
47
1AlgorithmDijkstra(G,source)//G=(V,E),E⊆V×V
2foreachvinV://Alustus
3distance[v]:=infinity//Etäisyys(source,v)tuntematon
4previous[v]:=undefined//Virityspuunisälinkki
5distance[source]:=0//Etäisyys(source,source)=0
6Q:=thesetofallnodesinG//Reunustoteutetaanprior.jonona
7whileQisnotempty://Pääsilmukka
8u:=removevfromQwithsmallestdistance[]
9foreach(u,v)inE://Naapurisolmujentutkiminen
10if(dist:=distance[u]+distance(u,v))<distance[v]:
11distance[v]:=dist//löytyilyhyempireitti
12previous[v]:=u//päivitetäänisälinkki
13returnprevious[]//Lyhimpienpolkujenvirityspuu
•  Löytää lyhimmän polun kaikkiin verkon solmuihin (jos olemassa)
•  Miten haluttu polku (source, target) saadaan?
•  Entä jos mahdollisia lyhimpiä polkuja on useita?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
48
10.7.4
Geometriset tehtävät
§  "Hae lyhin reitti tasolla olevassa verkossa pisteestä A pisteeseen
B."
§  Käytetään PFS-hakua, jossa solmun x prioriteettina käytetään
seuraavaa summaa
Etäisyys d(A,x) virityspuuta pitkin laskien
+
geometrinen etäisyys d(x,B)
Lopetetaan, kun B on lisätty puuhun
=>
Lyhin reitti löytyy nopeasti, koska algoritmi hakeutuu
heti oikeaan suuntaan verkossa
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
49
10.8 Verkon yhtenäisyys (graph connectivity)
§  Verkko on yhtenäinen, jos jokaisesta solmusta on polku kaikkiin
muihin solmuihin
§  Epäyhtenäinen verkko koostuu yhtenäisistä osaverkoista
§  DFS-algoritmi löytää verkon yhtenäiset osat
Jos rekursiivisessa DFS-haussa joudutaan tekemään eirekursiivinen DFS-VISIT:n kutsu, ollaan siirrytty toiseen
osaverkkoon
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
50
Depth-first Search
Algorithm DFS(G)
1. for each u V[G] do
2.
visited[u] ← false
3.
finished[u] ← false
4. for each u V[G] do
5.
if visited[u] = false
6.
DFS-VISIT(G, u) 17. ja 24.11.2015
Algorithm DFS-VISIT(G, u)
1. visited[u] ← true
2. for each v Adj[u] do
3.
if visited[v] = false then
4.
DFS-VISIT(G, v)
5. finished[u] ← true
Tietorakenteet ja algoritmit - syksy 2015
51
10.8.1 Kahdesti yhtenevyys
§  Verkko on kahdesti yhtenäinen (biconnected), jos ja vain jos
jokaisen solmuparin välillä on vähintään kaksi aidosti erilaista
polkua
§  Kahdella aidosti erilaisella polulla ei saa olla muita yhteisiä
solmuja kuin alku- ja loppusolmut
§  Leikkaussolmu (articulation point) on solmu, jonka poistaminen
aiheuttaa verkon jakautumisen kahteen tai useampaan eri osaan
⇒  Kahdesti yhtenäisessä verkossa ei ole leikkaussolmuja
Leikkaussolmut jakavat yhtenäisen verkon kahdesti yhteneviin
osaverkkoihin
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
52
§  Leikkaussolmu on kriittinen komponentti, jonka vioittuminen voi
lamauttaa systeemin toiminnan
§  Kun tällaisia solmuja ei ole, saadaan vikasietoinen (fault tolerant)
systeemi
A
D
A
C
B
D
C
E
B
E
Miten leikkaussolmu voidaan havaita?
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
53
§  Leikkaussolmut voidaan etsiä DFS-haun avulla tutkimalla
syntyvää virityspuuta:
1.  Solmu x (ei juuri) ei ole leikkaussolmu, jos sen jokaisen
seuraajan muodostamasta alipuusta on yhteys virityspuuhun
johonkin edeltäjään
2.  Juuren yläpuolelle ei voi olla yhteyksiä. Siksi juuri on
leikkaussolmu, jos sillä on useampia kuin yksi lapsi
A
D
A
C
B
17. ja 24.11.2015
D
C
E
B
Tietorakenteet ja algoritmit - syksy 2015
E
54
Asian tutkiminen voidaan järjestää seuraavasti:
§  Jokainen rekursiivinen DFS-kutsu numeroi käsittelemänsä (visited)
solmut käsittelyjärjestyksessä
§  Solmun edeltäjien järjestysnumero on ennen solmua itseään
§  Jokainen rekursiivinen DFS-kutsu palauttaa tiedon pienimmästä kutsun
aikana nähdystä solmusta
⇒  Jos johonkin solmun k lapseen liittyvä kutsu palauttaa arvon, joka on ≥ k,
k on leikkaussolmu
§  Algoritmin tehokkuus:
•  Seuraajaluettelossa: O(V + E)
•  Yhteysmatriisissa: O(V2)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
55
10.9 Suunnatut verkot
§  Suunnatussa verkossa särmiä voi kulkea vain yhteen suuntaan
§  Kahden solmun välillä voi olla kaksi eri suuntiin menevää särmää
§  Suunnattu verkko voi olla myös painotettu
Esimerkkejä:
•  Helsingin katuverkko
•  Projektin ajoituskaavio
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
56
Ongelmia:
1) Pääseekö pisteestä A pisteeseen B?
§  Suunnatussa verkossa ei välttämässä pääse kaikista pisteistä
toisiin pisteisiin, vaikka verkko olisi yhtenäinen
2) Muodosta suora yhteys kaikkiin niihin solmuihin, joihin pisteestä
A voi päästä
3*) Etsi verkon topologinen lajittelu
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
57
Suunnatun verkon esitysmuoto:
§  Yhteysmatriisi ei ole symmetrinen
A
B
C
A
B
C
A
1
0
0
B
0
1
0
C
1
1
1
§  Seuraajaluettelossa on särmät vain yhteen kertaan
A: C
B: C
C: 17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
58
10.9.1 DFS-haku suunnatussa verkossa
§  Perusmenetelmä toimii samalla tavalla kuin suuntaamattomassa
graafissa
§  Algoritmin avulla löydetään kaikki ne solmut, joihin on
mahdollista päästä lähtösolmusta käsin
§  Syvyyssuuntaisen virityspuun sijasta syntyy yleensä metsä (DFS
search forest)
§  Alunperin yhtenäisestä verkosta syntyy useita puita
§  Virityspuussa voi olla takautuvien kaarien (ylöspäin) lisäksi myös
eteneviä kaaria (alaspäin) ja poikittaiskaaria (ristiin) eri solmujen
välillä
=> Algoritmit, joissa tutkitaan virityspuun rakennetta,
mutkistuvat.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
59
Relaatioista
§  Olkoon verkko G = (V,E), jossa
§ 
•  V on verkon solmujen joukko (esim. V = {x, y, z}) ja
•  E on verkon kaarien joukko E ⊆ V x V
Binäärirelaatio E on (esim. E = {(x,x),(y,x),(x,y),(y,z),(x,z)})
•  refleksiivinen, jos kaikille u ∈ V pätee (u,u) ∈ E
•  symmetrinen, jos (u,v) ∈ E → (v,u) ∈ E
•  transitiivinen, jos (u,v) ∈ E ja (v,w) ∈ E → (u,w) ∈ E
x
x
y
x
y
z
§  Relaatio, joka on refleksiivinen, symmetrinen sekä transitiivinen on
ekvivalenssirelaatio
•  vrt ”yhtäsuuruus” luonnollisille luvuille
ü  mutta ei esim. ”pienempi tai yhtäsuuri”, joka voidaan määritellä
{ (a,b) : a,b ∈ N ja a≤b } (antisymmetrinen) ja muodostaa
osittaisjärjestyksen
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
60
10.9.2 Transitiivinen sulkeuma (transitive closure)
§  Jos suunnattuun verkkoon lisätään välit XY, mikäli X:stä on
olemassa reitti Y:hyn kaikille solmuille X ja Y, saadaan verkon
transitiivinen sulkeuma
§  Se ilmaisee suunnatun verkon yhtenäisyyden mahdollisimman
kompaktisti. Sen avulla on helppo vastata kysymykseen:
"Onko reittiä solmusta A solmuun B?"
§  Transitiivinen sulkeuma voidaan tuottaa DFS-haun avulla, kun
haku suoritetaan lähtien kaikista solmuista erikseen ja lisätään
verkkoon kaikki kaaret lähtösolmusta löydettyihin solmuihin.
§  Tehokkuus:
•  Seuraajaluettelolla: O( V(E + V) )
•  Yhteysmatriisilla: O(V3)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
61
10.9.3 Topologinen lajittelu (topological sorting)
§  Joissakin verkkosovelluksissa silmukat eivät ole mielekkäitä.
Esimerkki:
•  Työnkulkukaaviossa ei ehkä ole mielekästä, että vaihetta A
seuraa vaihe B, jota seuraa vaihe C, jota seuraa vaihe A.
§  Suunnattu verkko, jossa ei ole silmukoita, on nimeltään DAG
(Directed Acyclic Graph)
§  Sen syvyyssuuntaisessa virityspuussa ei ole takautuvia (ylöspäin
osoittavia) kaaria
§  Kun DAGin solmut esitetään siinä järjestyksessä, että kaikki
solmun edeltäjät ovat listassa ennen ko. solmua, saadaan verkon
topologinen lajittelu
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
62
§  Jos mukaan piirrettäisiin kaarien suunnat, ne menisivät kaikki
vasemmalta oikealle
§  Hyödyllinen esitysmuoto esim. projektin ajoituskaaviolle
• 
Kullekin osavaiheelle välttämättömät esivaiheet selvästi
näkyvillä
Luentotehtävä: piirrä oheinen
verkko siten, että solmut ovat
järjestyksessä (vasemmalta
oikealla): 3, 5, 7, 8, 11, 9, 2, 10
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
63
Topologinen lajittelu voidaan muodostaa eri tavoin
1.  Poistetaan verkosta solmu, josta ei lähde yhtään kaarta
• 
• 
• 
• 
Samalla poistetaan siihen saapuvat kaaret (matriisin sarake)
Päivitetään tieto myös poistettujen kaarten lähtösolmujen
osalta (laskuri / solmu)
Valitetaan seuraavaa poistoa varten uusi solmu.
Lopuksi tulostetaan solmut käänteisessä järjestyksessä
2.  DFS-haun avulla seuraavasti:
• 
• 
Käännetään kaikkien särmien järjestys
Tulostetaan solmun nimi juuri ennen Visit-proseduurin
päättymistä
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
64
3.
Vaihtoehtoisesti voidaan toimia näin:
• 
Tulostetaan solmun nimi juuri ennen Visit-proseduurin
päättymistä, jolloin kaikki seuraajat on jo käsitelty
• 
Tuloksena saadaan käänteinen topologinen lajittelu (reverse
topological sorting). Se kuvaa tilannetta, jossa solmun nimeä
seuraavat ne solmut, joista ko. solmu on riippuvainen
• 
Tulostetaan tämä päinvastaisessa järjestyksessä
§  Topologinen lajittelu saadaan laskettua ajassa Θ(E + V)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
65
10.9.4 Vahvasti yhtenäiset komponentit (strongly connected
components)
§  Jos suunnatussa verkossa on joukko solmuja, joista jokaisesta
pääsee saman joukon muihin solmuihin, on kyseessä vahvasti
yhtenäinen komponentti
§  Tällaisten komponenttien ulkopuolelle ei ole edestakaista
yhteyttä
§  Komponentit pystytään löytämään DFS-haulla, jota muokataan
sopivasti:
•  Tunnistetaan tilanteet, joissa syntyy suunnattu silmukka, eli
viitataan hakupuussa ylöspäin jo läpikäytyyn solmuun.
§  Vahvasti yhtenäisten komponenttien laskemisesta on hyötyä
transitiivisen sulkeuman laskemisessa.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
66
11.10 Joukot ja verkot
§  Joukko (set) on kokoelma alkioita
§  Verkko- ja joukkorakenteita voidaan joissakin ongelmissa
käsitellä samalla tavalla
Analogiat:
solmu
=
joukon alkio
särmä
=
alkiot kuuluvat samaan joukkoon
verkon yhtenäinen osa = joukko
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
67
Eräitä ratkaistavia ongelmia:
§  Kuuluvatko solmut A ja B verkon samaan yhtenäiseen osaan?
§  Kuuluvatko alkiot X ja Y samaan joukkoon?
§  Ratkaisuna on kaksi eri algoritmia
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
68
11.10.1 DFS-haku
§  Jos verkko on rakenteeltaan staattinen, käydään verkko läpi DFS-
haulla ja merkitään solmutaulukkoon jokainen erillinen osaverkko
omalla tunnuksella
⇒  Ongelma ratkeaa vertaamalla sitä, ovatko A:n ja B:n
osaverkkojen tunnukset samat
§  Jos verkkoon lisätään särmä, kaikki on tehtävä uudestaan
⇒  Dynaamiseen tilanteeseen tarvitaan erilainen algoritmi
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
69
11.10.2 Etsi-Liitä-algoritmi (Union-find)
§  Algoritmia käytetään tilanteissa, joissa verkkoon (joukkoon)
liitetään peräkkäin uusia särmiä (yhteenkuuluvuuksia)
§  Jokaisen lisäyksen jälkeen voidaan heti kysyä, kuuluvatko jotkin
solmut (alkiot) samaan komponenttiin (joukkoon)
Huom! Algoritmissa muodostuva tietorakenne ei vastaa
alkuperäistä verkkoa, vaan on ainoastaan apuväline tässä
ongelmassa
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
70
Perusalgoritmin toiminta:
§  Luodaan aluksi metsä, jossa kaikki solmut ovat erillisinä puina
§  Kun rakenteeseen lisätään verkkoon kuuluvia särmiä, yhdistetään
metsään kuuluvia puita yhteen
§  Tarvittavat toiminnot Etsi (find) ja Liitä (union) toteutetaan
seuraavasti:
Etsi:
•  Kulje molemmista särmän päätesolmuista puun juurta kohden
ja katso, löytyykö yhteinen isä
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
71
Liitä:
•  Jos särmän päätepisteet kuuluvat samaan puuhun, ei tehdä
mitään
•  Jos päätepisteet kuuluvat eri puihin, puut yhdistetään siten,
että loppupisteen sisältävä puu tulee alkupisteen sisältävän
puun juuren alipuuksi
§  Metsä esitetään dad-linkkien avulla, jolloin juuren etsiminen ja
puiden yhdistäminen on helppoa
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
72
Esimerkki: Verkkoon kuuluu solmut A-M ja siihen liitetään
särmiä järjestyksessä AG, AB, AC, LM, JM, JL, JK, ED, FD, HI,
FE, AF, GE, GC, GH, JG ja LG.
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
73
§  Perusalgoritmi toimii huonosti, jos lisättävät särmät ovat
sopivassa järjestyksessä. Esimerkiksi:
BA, CB, DC, ED, ...
tai
BA, CA, DA, EA, ...
⇒  Rakenne degeneroituu listaksi, jolloin tehokkuus on
kvadraattinen
§  Ongelma voidaan kiertää muuttamalla algoritmia hieman:
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
74
11.10.3 Tasapainotus painon mukaan (weight balancing,
balancing by size)
§  Liitä-operaatiossa yhteiseksi juureksi tulee se puu, joka on
suurempi
§  Kunkin puun juureen liitetään tieto puun koosta
11.10.4 Tasapainotus korkeuden mukaan (height balancing)
§  Liitä-operaatiossa yhteiseksi juureksi tulee se puu, joka on
korkeampi
§  Kunkin puun juureen liitetään tieto puun korkeudesta
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
75
11.10.5 Polun tiivistäminen (path compressing)
§  Kun juuri on löytynyt, liitetään kaikki lähtösolmusta juureen
kulkevan polun solmut suoraan juuren alle. Tämä tehdään
sekä särmän alku- että loppusolmulle.
⇒  Puun korkeus pienenee, mikä nopeuttaa algoritmia
§  Menetelmiä voidaan myös yhdistää, jolloin algoritmin
tehokkuus on O(E α (E)), missä
α (E) < 4, kun log(log(log... (E)...)) ≤ 1
16 kpl
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
76
§  Toteutus isälinkitettynä puuna (taulukko)
§  Algoritmin vaatima tila ≈ V, vaikka verkossa voi olla E ≈ V2
⇒  Hyvin suurten verkkojen yhtenevyyttä voidaan helposti tutkia
§  DFS vaatisi tilaa kaikille särmille
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
77
11.10.6 Sovellus: Kruskalin algoritmi
Verkon pienin virityspuu voidaan laskea seuraavasti:
§  Ideana on rakentaa asteittain verkon komponentteja
suuremmiksi. Uudet lisättävät särmät voivat joko liittää kaksi
komponenttia yhteen tai muodostaa silmukan yhdessä
komponentissa (jolloin lisäystä ei tehdä).
§  Verkko esitetään seuraajalistan avulla
§  Verkon särmät lisätään yksi kerrallaan aloittaen lyhimmästä,
kunnes kaikki solmut on yhdistetty
§  Jos särmä muodostaisi silmukan, sitä ei liitetä mukaan
§  Silmukat voidaan todeta union-find-algoritmilla
§  Algoritmin oikeellisuus perustuu kohdan 11.6.1 lauseeseen
§  Tehokkuus: O(E log E)
17. ja 24.11.2015
Tietorakenteet ja algoritmit - syksy 2015
78