You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
A274101 TIETORAKENTEET<br />
JA ALGORITMIT<br />
VERKOT ELI GRAAFIT<br />
Lähteet:<br />
Timo Harju, Opintomoniste<br />
Keijo Ruohonen, Graafiteoria (math.tut.fi/~ruohonen/GT.pdf)<br />
HISTORIAA<br />
<br />
<br />
<br />
<br />
<br />
<br />
Verkko- <strong>eli</strong> <strong>graafit</strong>eorian historia on saanut<br />
alkunsa Eulerin työstä v.1736<br />
Königsbergin (nyk. Kaliningrad) sillat:<br />
http://en.wikipedia.org/wiki/Seven_bridges_of_K%C3%B6nigsberg<br />
Kaupungin läpi virtaa joki, jossa on kaksi saarta<br />
Saaret on yhdistetty rantoihin 7 sillalla<br />
Voiko rannalta lähteä tietystä pisteestä, kulkea<br />
täsmälleen kerran jokaisen sillan yli ja palata<br />
lähtöpaikkaansa<br />
Euler ratkaisi ongelman 1736 ja kehitti samalla<br />
perustan verkkojen <strong>eli</strong> graafien teorialle<br />
8.11.2005 KyAMK - TiRak, syksy 2005 2<br />
HISTORIAA<br />
KÖNIGSBERGIN SILLAT -<br />
RATKAISU<br />
Yksinkertaistetaan kuvaa hieman<br />
N<br />
N<br />
K<br />
O<br />
K<br />
O<br />
S<br />
S<br />
8.11.2005 KyAMK - TiRak, syksy 2005 3<br />
8.11.2005 KyAMK - TiRak, syksy 2005 4
KÖNIGSBERGIN SILLAT -<br />
RATKAISU<br />
MÄÄRITELMIÄ<br />
Kaikista neljästä solmusta lähtee pariton<br />
määrä kaaria<br />
Oletetaan, että seurataan viivoja<br />
nostamatta kynää<br />
Valitaan yksi solmu tarkasteltavaksi –<br />
otetaan joku, josta lähtee 3 kaarta<br />
Kun 1. kerran saavut tähän solmuun, voit<br />
lähteä toista kaarta pitkin pois<br />
Tämän jälkeen solmuun voi vain saapua<br />
kerran<br />
Piirtäminen pitää päättää tähän solmuun<br />
Toinen vaihtoehto on aloittaa tästä<br />
solmusta, jolloin siinä voi vielä kerran<br />
käydä<br />
Solmu, josta lähtee pariton määrä kaaria<br />
voi ainoastaan aloittaa tai päättää ”reitin”<br />
K<br />
N<br />
S<br />
O<br />
Graafi koostuu pisteistä <strong>eli</strong><br />
solmuista (vertex) ja niitä<br />
yhdistävistä kaarista <strong>eli</strong> viivoista<br />
(edge)<br />
Formaalisti:<br />
Graafi (graph) on pari (V,E),<br />
missä V on pisteiden joukko ja E<br />
on pisteparien muodostama<br />
viivojen joukko.<br />
v 1<br />
v 2<br />
v 4<br />
v 3<br />
8.11.2005 KyAMK - TiRak, syksy 2005 5<br />
8.11.2005 KyAMK - TiRak, syksy 2005 6<br />
MÄÄRITELMIÄ<br />
MÄÄRITELMIÄ<br />
Viivat ovat pistepareja (u, v) = (v, u)<br />
Pisteet u ja v ovat viivan (u, v)<br />
päätepisteet<br />
Suunnatuilla graafeilla (u, v) ≠ (v, u)<br />
<strong>eli</strong> pisteparien järjestyksellä on<br />
merkitystä<br />
Solmujen lukumäärää merkitään<br />
|V|:llä ja viivojen määrää |E|:llä<br />
Viivoja voidaan merkitä myös E =<br />
{e 1 , e 2 , …, e n }<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
e 4<br />
v 1<br />
v 3<br />
v 4<br />
<br />
<br />
<br />
<br />
<br />
<br />
Viivat voivat olla myös painotettuja:<br />
(u, v, c), missä c on paino<br />
Viivat, joilla on samat päätepisteet,<br />
ovat rinnakkaiset<br />
Viiva (v, v) on ns. silmukka<br />
Pisteet u ja v, joita yhdistää viiva<br />
ovat rinnakkaiset<br />
Pisteen v aste, merkitään d(v), on<br />
niiden viivojen lukumäärä, joiden<br />
päätepiste v on<br />
Piste, jonka aste on 1 on ns.<br />
loppupiste<br />
e 5<br />
e 6<br />
e 7<br />
8.11.2005 KyAMK - TiRak, syksy 2005 8<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
e 4<br />
v 1<br />
v 3<br />
e 5<br />
e 6<br />
e 7<br />
v 4<br />
8.11.2005 KyAMK - TiRak, syksy 2005 7
MÄÄRITELMIÄ<br />
MÄÄRITELMIÄ<br />
<br />
<br />
<br />
<br />
<br />
Graafi, jossa ei ole lainkaan viivoja<br />
on tyhjä<br />
Graafi, jossa ei ole lainkaan pisteitä,<br />
on ns. nollagraafi<br />
Graafi, jossa on vain yksi piste, on<br />
triviaali<br />
Graafi on yksinkertainen, jos siinä ei<br />
ole rinnakkaisia viivoja, eikä<br />
silmukoita<br />
Graafi on yhtenäinen, jos sen<br />
jokaisesta pisteestä voidaan kulkea<br />
jokaiseen toiseen pisteeseen<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
e 4<br />
v 1<br />
v 3<br />
v 4<br />
<br />
<br />
<br />
<br />
<br />
Graafissa G = (V, E) oleva pisteiden<br />
ja viivojen jono<br />
(v i0 ,e j0 ,v i1 ,e j1 ,v i2 ,…,e jk ,v ik ) on kulku,<br />
jos viivat (v i1 ,v i2 ), (v i2 ,v i3 ),…,(v i(k-<br />
1),v ik ) ∈ E<br />
Kulun pituus on k, v i0 on kulun<br />
alkupiste ja v ik kulun loppupiste<br />
Kulussa saavat samat pisteet ja<br />
viivat esiintyä useitakin kertoja<br />
Kulku on reitti, jos mikään viiva ei<br />
esiinny useita kertoja<br />
Reitti on polku, jos mikään piste ei<br />
esiinny kahta kertaa, päätepisteitä<br />
lukuun ottamatta<br />
e 5<br />
e 6<br />
e 7<br />
8.11.2005 KyAMK - TiRak, syksy 2005 10<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
e 4<br />
v 1<br />
v 3<br />
e 5<br />
e 6<br />
e 7<br />
v 4<br />
8.11.2005 KyAMK - TiRak, syksy 2005 9<br />
MÄÄRITELMIÄ<br />
EULERIN POLKU JA HAMILTONIN<br />
PIIRI<br />
<br />
<br />
<br />
<br />
<br />
Polku, jonka alku- ja päätepiste ovat<br />
samat, on piiri<br />
Huom. myös polku (v, v) on piiri,<br />
jonka pituus on 1 ja sitä sanotaan<br />
silmukaksi<br />
Graafin pisteet u ja v ovat<br />
yhdistetyt, jos on olemassa u-vkulku<br />
Jos pisteet u ja v ovat yhdistetyt<br />
sekä pisteet v ja w ovat yhdistetyt,<br />
niin myös u ja w ovat yhdistetyt<br />
Toisin sanoen jos graafissa on u-vkulku<br />
sekä v-w-kulku, niin siinä on<br />
myös u-w-kulku<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
e 4<br />
v 1<br />
v 3<br />
v 4<br />
<br />
<br />
<br />
<br />
Eulerin ”polku” (Euler path) – kulkee<br />
jokaisen viivan kautta täsmälleen<br />
kerran<br />
Graafissa, jossa on Eulerin polku voi<br />
olla korkeintaan kaksi pistettä, joista<br />
lähtee pariton määrä viivoja<br />
Lisäksi tällaisessa graafissa on aina<br />
vähintään yksi Eulerin polku<br />
Hamiltonin piiri kulkee jokaisen<br />
pisteen kautta ainoastaan kerran ja<br />
sen alku- ja loppupisteet ovat samat<br />
e 5<br />
e 6<br />
e 7<br />
8.11.2005 KyAMK - TiRak, syksy 2005 12<br />
v 2<br />
e 1<br />
e 2<br />
e 3<br />
v 1<br />
v 4<br />
e 4<br />
v 3<br />
e 5<br />
e 6<br />
e 7<br />
8.11.2005 KyAMK - TiRak, syksy 2005 11
SUUNNATUT GRAAFIT<br />
KÄYTÄNNÖN SOVELLUKSIA<br />
<br />
<br />
<br />
<br />
<br />
<br />
Suunnattu graafi on vahvasti yhtenäinen (strongly<br />
connected), jos sen jokaisesta pisteestä on polku<br />
kaikkiin muihin pisteisiin<br />
Suunnattu graafi on heikosti yhtenäinen (weakly<br />
connected), jos se ei ole vahvasti yhtenäinen<br />
mutta olisi suuntaamattomana yhtenäinen<br />
Suunnatun graafin pisteen v tuloaste (in-degree)<br />
on v:hen päättyvien viivojen (u, v) lukumäärä<br />
Solmun v lähtöaste (out-degree) on puolestaan<br />
v:stä lähtevien viivojen (v, w) lukumäärä<br />
Suunnatun graafin suunnattua piiriä sanotaan<br />
sykliksi (cycle)<br />
Suunnattu graafi on syklitön (acyclic), jos siinä ei<br />
ole yhtään sykliä, muutoin syklinen (cyclic)<br />
Useimmat käytännön ongelmia mallintavat <strong>graafit</strong><br />
ovat painotettuja. Useimmiten ne lisäksi ovat<br />
suunnattuja, mutta eivät aina.<br />
Lentokenttäverkko<br />
Solmu (u, v, c): u on lähtökenttä, v on tulokenttä<br />
ja c voi olla välimatka, lentoaika tms.<br />
Liikennevirta<br />
Solmu (u, v, c): u on mistä, v on minne ja c voi<br />
olla tien pituus, kapasiteetti, suurin sallittu nopeus<br />
tms.<br />
8.11.2005 KyAMK - TiRak, syksy 2005 13<br />
8.11.2005 KyAMK - TiRak, syksy 2005 14<br />
GRAAFIN ESITTÄMISTAPOJA<br />
Miten graafia ei kannata esittää<br />
Graafi tulisi esittää niin, että sitä<br />
voidaan käsitellä ohjelmallisesti<br />
Ei välttämättä ole helppoa ja itsestään<br />
selvää<br />
Seuraavassa käsitellään paria tuttua<br />
tietorakennetta<br />
Ovatko ne käyttökelpoisia graafin<br />
esittämiseen<br />
GRAAFIN ESITTÄMISTAPOJA<br />
1. Voitaisiin ajatella, että graafi olisi kätevä<br />
esittää binääripuun tapaan:<br />
linkitetty rakenne<br />
jokainen piste sisältää kentät kaikille mahdollisille<br />
viivoille<br />
Kritiikkiä:<br />
Pisteisiin liittyvien viivojen määrä voi vaihdella<br />
Jokaisessa pisteessä tulee varata tilaa viivoille<br />
pahimman tapauksen mukaisesti<br />
Toinen ongelma on solmujen tavoittaminen:<br />
Mistä ja miten etenemällä jokin tietty solmu<br />
löytyy<br />
8.11.2005 KyAMK - TiRak, syksy 2005 15<br />
8.11.2005 KyAMK - TiRak, syksy 2005 16
GRAAFIN ESITTÄMISTAPOJA<br />
2. Pisteestä lähtevien viivojen<br />
määrää ei haluta rajoittaa<br />
Viivat voitaisiin esittää myös<br />
linkitettyinä listoina<br />
Kritiikkiä:<br />
Rakenne on varsin raskastekoinen<br />
Solmujen tavoittaminen ei ole<br />
yhtään helpompaa kuin edellisessä<br />
menetelmässä<br />
GRAAFIN SIVULUETTELO<br />
Sivuluettelossa nimen mukaisesti<br />
luetellaan verkon sivut <strong>eli</strong> viivat<br />
Luettelon alkiot ovat joko pareja<br />
(painottamaton) tai kolmikoita<br />
(painotettu)<br />
Suuntaamattomassa graafissa jokainen<br />
sivu esiintyy kahteen kertaan<br />
Toisaalta, jos tiedetään, että graafi on<br />
suuntaamaton, ja sivu (u, v) sisältyy<br />
graafiin, sivua (v, u) ei tarvitse ilmoittaa,<br />
koska sen tiedetään automaattisesti<br />
olevan mukana<br />
8.11.2005 KyAMK - TiRak, syksy 2005 17<br />
8.11.2005 KyAMK - TiRak, syksy 2005 18<br />
GRAAFIN SIVULUETTELO<br />
NAAPURUUSMATRIISI<br />
1<br />
3<br />
5<br />
<br />
<br />
<br />
Ohessa on eräs graafi sekä suuntaamattomana että suunnattuna ja<br />
molemmissa tapauksissa sivuluettelo<br />
Suunnattuun graafiin on lisäksi liitetty painot<br />
Samaa graafia käytetään esimerkkinä myös jatkossa<br />
Sivuluettelo<br />
1, 2 3, 1<br />
1, 3 3, 2<br />
1, 4 4, 1<br />
2, 1 4, 5<br />
2, 3 5, 4<br />
2<br />
4<br />
Painottamaton Painotettu<br />
1, 2 1, 2, 3<br />
1, 3 1, 3, 7<br />
1, 4 1, 4, 5<br />
2, 3 2, 3, 4<br />
4, 5 4, 5, 2<br />
8.11.2005 KyAMK - TiRak, syksy 2005 19<br />
7<br />
1<br />
3<br />
5<br />
3<br />
4 5<br />
2<br />
2<br />
4<br />
Naapuruusmatriisi <strong>eli</strong> vierusmatriisi on |V| x |V| -<br />
n<strong>eli</strong>ömatriisi:<br />
Matriisissa on graafin pisteiden määrän verran sekä<br />
sarakkeita että rivejä.<br />
Painottamattomalla graafilla rivin u sarakkeen v alkio<br />
on 1, jos viiva (u, v) sisältyy graafiin, ja 0 muulloin<br />
Painotetulla graafilla viivaa (u, v, c) vastaava matriisin<br />
alkion arvo on viivan paino c<br />
Puuttuvia viivoja vastaavat matriisin alkiot tulee olla<br />
sellaisia, että niitä ei voi sekoittaa viivojen painoihin<br />
(esim. -1, -99, tms.)<br />
Suuntaamatonta graafia vastaava matriisi on<br />
symmetrinen (<strong>eli</strong> A T = A):<br />
Jos viiva (u, v) sisältyy graafiin, niin myös viiva (v, u)<br />
sisältyy ko. graafiin.<br />
8.11.2005 KyAMK - TiRak, syksy 2005 20
NAAPURUUSMATRIISI<br />
Esimerkki<br />
Suuntaamaton verkko Suunnattu verkko<br />
1 2 3 4 5 1 2 3 4 5<br />
1| 0 1 1 1 0 1| 0 1 1 1 0<br />
2| 1 0 1 0 0 2| 0 0 1 0 0<br />
3| 1 1 0 0 0 3| 0 0 0 0 0<br />
4| 1 0 0 0 1 4| 0 0 0 0 1<br />
5| 0 0 0 1 0 5| 0 0 0 0 0<br />
Naapuruusmatriisin tilavaatimus on O( |V| 2 )<br />
käyttökelpoinen esitysmuoto tiheillä (dense) graafeilla,<br />
joissa on paljon viivoja<br />
Harvojen (sparse) graafien esittämiseen soveltuu<br />
paremmin seuraavassa esitettävä naapuruuslista<br />
NAAPURUUSLISTA<br />
Naapuruuslistassa kutakin pistettä vastaa<br />
listan tunnussolu<br />
Kyseisestä pisteestä lähtevät viivat<br />
tallennetaan tunnussolusta lähtevään<br />
linkitettyyn listaan<br />
Suuntaamattomille graafeille jokainen<br />
listasolu esiintyy kahdessa eri listassa<br />
Painottaman graafin listasolu sisältää<br />
verkon pisteen numeron sekä linkin<br />
seuraavaan soluun<br />
Painotetun graafin listasolu sisältää<br />
lisäkentän, johon talletetaan viivan paino<br />
8.11.2005 KyAMK - TiRak, syksy 2005 21<br />
8.11.2005 KyAMK - TiRak, syksy 2005 22<br />
NAAPURUUSLISTA<br />
GRAAFIN PISTEEN TIEDOT<br />
KÄYTÄNNÖSSÄ<br />
Esimerkki<br />
Suunnatun graafin naapuruuslista:<br />
1234<br />
23<br />
3<br />
45<br />
5<br />
Tämän esitystavan tilavaatimus on O( |V| + |E| ).<br />
<br />
<br />
<br />
<br />
Graafin pisteiden nimet ovat harvoin numeroita<br />
Yleensä pisteet sisältävät merkkijonoja, esim.<br />
kaupunkien nimiä<br />
Numerointi on kuitenkin varsin oleellinen sekä<br />
naapuruusmatriisi- että naapuruuslistaesityksessä<br />
Tällöin voidaan menetellä seuraavasti:<br />
Kun graafia luettaessa vastaan tulee aiemmin<br />
esiintymätön piste, annetaan sille seuraava<br />
järjestysnumero<br />
Pisteen nimi talletetaan sopivaan hakurakenteeseen<br />
(esim. binääripuu, hajautustaulu)<br />
Kun nimeä tarvitaan, haku on nopeaa (esim. tietyn<br />
pisteen esiintyminen, tulostukset, …)<br />
8.11.2005 KyAMK - TiRak, syksy 2005 23<br />
8.11.2005 KyAMK - TiRak, syksy 2005 24