02.02.2015 Views

Graafid Kui ühendada elemendid omavahel viitadega vabamal kujul ...

Graafid Kui ühendada elemendid omavahel viitadega vabamal kujul ...

Graafid Kui ühendada elemendid omavahel viitadega vabamal kujul ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Graafid</strong><br />

writeln('Tipp ',i,' külgneb tipuga ',x);<br />

Näites on tipud välja trükitud, tegelikult tuleks neid protseduurist näiteks massiivi abil programmi tagasi tuua.<br />

Keerulisemad on algoritmid graafi läbimiseks ja teede leidmiseks. Näiteks selleks, et leida, kas tipust x läheb tee tippu y<br />

tuleb maatriksiga arvutusi teha.<br />

<strong>Graafid</strong>e töötlemisel kasutatakse laiuti või sügavuti otsimise tehnikat (kuna teid võib olla palju tuleb kõik võimalused<br />

ära proovida, sest tavaliselt ei aita ühe tee leidmisest, vaid see tee peab vastama mingitele tingimustele) ja sel juhul<br />

läheb sellise algoritmi keerukus O(N 3 )-ni. Reeglina tuleb siin kasutada ka rekursiooni. Aitab ka dünaamiline<br />

programmeerimine. Nimetatud erinevatest algoritmide koostamise strateegiatest tuleb juttu edaspidi.<br />

Dünaamiline realisatsioon<br />

Hõreda graafi ökonoomsemaks kujutamiseks võetakse kasutusele nimistud, nn külgnevusnimistu (adjacency list).<br />

Graafi tippudest moodustatakse massiiv, üks lahter iga tipu jaoks (võib ka lineaarnimistu) ning iga tipulahtri külge<br />

kinnitatakse lineaarnimistu nendest tippudest, mis külgnevad antud tipuga. Nimistu lõpus on nil.<br />

Selliselt saab mälu kokku hoida. Siit võite endale ise ette kujutada, mida sel juhul tähendaksid uue kaare lisamine<br />

(riputame nimistu lõppu uue elemendi), kaare kustutamine (kustutame elemendi) ja naabrite leidmine (läbime vastava<br />

nimistu).<br />

Kahe viidaga nimistu külgnevate tippude hoidmiseks on sobivam.<br />

1 ---> 2 ---> 3 nil<br />

2 nil<br />

3 ---> 4 ---> 5 ---> 6 nil<br />

4 ---> 5 nil<br />

5 ---> 6 nil<br />

6 ---> 7 ---> 9 nil<br />

7<br />

8 ---> 7 ---> 9 nil<br />

9 ---> 10 nil<br />

10 nil<br />

Joonis 3. Külgnevusnimistu joonisel 1 olevale graafile.<br />

Kõigi tegevuste puhul nii 1. kui 2. realisatsiooni korral tuleb arvestada, kas graaf on orienteeritud või mitte.<br />

Orienteerimata graafi korral tuleb kaare lisamisel tippude x ja y vahele kirjutada 1 nii lahtrisse Kylgnev[x,y] kui ka<br />

Kylgnev[y,x]. Dünaamilise realisatsiooni korral lisada kaks elementi - tipu x element y-i külge ning tipu y element<br />

x-i külge.<br />

Mida teha kaalutud graafiga Sel juhul tuleks Kylgnev-massiivi kirjutada ka vastavate kaarte kaalud (milleks<br />

massiivi kirjelduses on isegi väli olemas 'kaalu' näol).<br />

Mõned probleemid, millele on võimalik vastuseid leida kasutades graafide jaoks mõeldud algoritme:<br />

• <strong>Kui</strong>das jõuab kõige kiiremini Tallinnast Värskasse<br />

• <strong>Kui</strong>das saab kõige odavamalt Tallinnast Värskasse<br />

• <strong>Kui</strong>das transportida kaupa kõige odavamalt erinevatelt müüjatelt erinevatele ostjatele.<br />

• <strong>Kui</strong>das korraldada tööde järjekord, et saada maja valmis kõige lühema ajaga<br />

• Millises järjekorras valida õppeained, et võimalikult lühema ajaga ülikool lõpetada<br />

• Millises järjekorras käia ära kõigis linnades, et see toimuks võimalikult ruttu või lühemat teed mööda. Tegemist on<br />

klassikalise nn 'rändkaupmehe ülesandega'.<br />

Kõigi selliste probleemide lahendamiseks tuleks kõigepealt olukord kirjeldada graafina ja seejärel kasutades<br />

graafialgoritme, leida lahendused. Olles probleemi graafina kirja pannud pole enam vahet, kas uurime tööde tegemise<br />

4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!