12.07.2015 Views

Riktade grafer Riktade grafer Riktade grafer Riktade grafer

Riktade grafer Riktade grafer Riktade grafer Riktade grafer

Riktade grafer Riktade grafer Riktade grafer Riktade grafer

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Riktade</strong> <strong>grafer</strong><strong>Riktade</strong> <strong>grafer</strong>En riktad graf (eng: digraph) är en samling noder och ensamling bågar. Varje båge har en riktning d.v.s. den utgår frånnågon nod och har sin slutpunkt i någon nod (eventuelltsamma).En båge mellan noder a och b kan betecknas med En nods utgrad är antalet bågar som utgår från noden ochdess ingrad är antalet bågar som har sin slutpunkt i noden.acingrad(a) = ingrad(b) = 1ingrad(c) = ingrad(e) = 2ingrad(d) = 0butgrad(a) = 2 övriga har utgrad = 1deAD: Grafer 1AD: Grafer 2<strong>Riktade</strong> <strong>grafer</strong>En väg från en nod v 1 till en nod v k är en följd av noder v 1 ,v 2 ,…v k sådana att att det i grafen finns bågar En nod b är nåbar från en nod a om det finns en väg från atilll b eller om a och b är samma noder.Tre enkla cykler:<strong>Riktade</strong> <strong>grafer</strong>En väg från v 1 till v k är en cykel om v 1 =v kEn väg från v 1 till v k är en enkel cykel om alla noder på vägenär olika.Cykeln a-->c-->d-->b-->c-->d-->b-->aär inte enkel:bacdAD: Grafer 3AD: Grafer 4


Oriktade <strong>grafer</strong>Enoriktadgrafärensamlingnoderochbågar.Enbågegårmellan två olika noder och det är ingen riktning förknippadmed bågarna. Man brukar inte tillåta mer än en båge mellansamma par av noder.Oriktade <strong>grafer</strong>En nod a är granne till b i en oriktad graf om det finns en bågemellan a och b.Envägmellanv 1 och v k ienoriktadgrafärencykelomdetfinns bågar (v i ,v i+1 ) för i = 1, 2, …, k-1.Det finns en väg från en nod a till en nod b i en oriktadgraf om det finns en följd av bågar som förbinder a ochb.AD: Grafer 5AD: Grafer 6Oriktade <strong>grafer</strong>GrafrepresentationTvå noder är förbundna om det finns en väg mellan dem. Omvarje par av noder är förbundna är grafen sammanhängandeannars består den av ett antal sammanhängande komponenter.SammanhängandeEj sammanhängande, 3 komponenterAD: Grafer 7Det finns flera olika sätt att representera <strong>grafer</strong>. Vilken manväljer beror ibland på om man vill knyta data till noderna, tillbågarna eller både och.Om man t ex vill knyta data till bågarna och noderna enbarthar nummer 0, 1, …, n-1 kan man välja en matris a av typObject[][] med n rader och n kolumner. Objektet på plats(i,j) i matrisen innehåller då de data som associeras med bågenmellan nod nummer i och nod nummer j. Om ingen båge finnsmellan två noder lagras null på motsvarande plats i matrisen.Om grafen är oriktad låter man matrisen vara symmetrisk såatt a[i,j] = a[j,i]AD: Grafer 8


GrafrepresentationGrafrepresentationEx: Ett vägnät med (dubbelriktade) vägar mellan orter kanmodelleras med en oriktad graf där vägarnas längd är de datasom associeras till noderna:10 0 81156 32Grafen kan representeras av matrisen:null 10 8 null10 null 15 68 15 null nullnull 6 null nullEn mera generell representation som gör det enkelt attassociera data med både noder och bågar är närhetslistor.Grafen representeras av en lista av noder. Till varje nod hören lista av objekt som innehåller bågarnas data samt enreferens till den nod som är andra ändpunkten på bågen.AD: Grafer 9AD: Grafer 10GrafrepresentationEx på en riktad graf med data knutna till noderna (en sträng)och till bågarna (ett heltal) samt dess representation mednärhetslistor:Ga5a 7 Själva grafen repr.d av en referens till c 2 35nod-listan.b3b2 cdAD: Grafer 117Enkel ADT för grafhantering/** Beskriver en nod i en graf */public class Vertex {/** Tag reda på nästa nod i grafen */public Vertex nextVertex();}/** Tag reda på första båge från noden */public Edge firstEdge();/** Beskriver en båge i en graf */public class Edge{/** Tag reda på nästa båge (från samma nod) */public Edge nextEdge();}/** Tag reda på noden i andra änden av bågen */public Vertex endPoint();AD: Grafer 12


Enkel ADT för grafhantering, fortsEnkel ADT för grafhantering/** Beskriver en graf */public class DiGraph{/** Lägg in noden v i grafen */public void insertVertex(Vertex v);}/** Lägg in bågen e i grafen mellan noderna v och w */public void insertEdge(Vertex v, Vertex w, Edge e);/** Tag reda på första noden i grafen */public Vertex firstVertex();AD: Grafer 13Om grafen är oriktad brukar man i datastrukturenrepresentera bågen mellan a och b som två riktade bågar, enfrån a till b och en från b till a. Samma klasser som för riktadgraf kan då användas.Man skapar subklasser till Vertex och/eller Edge där manlägger till de attribut som behövs för det aktuella problemet.Ex:class CityVertex extends Vertex {String name;int distance;boolean visited;}AD: Grafer 14Enkel ADT för grafhanteringFör metoderna firstVertex() och nextVertex() (ochanalogt för bågarna) gäller att ett anrop av firstVertex()ger någon nod i grafen och att anrop av nextVertex() gernågon annan nod i grafen etc. Vi vet alltså inte i vilkenordning noderna räknas upp.Gör så här för att besöka alla noder i en graf g av typenDiGraph:Vertex v = g.firstVertex();while (v!=null) {// behandla vv = v.nextVertex();}AD: Grafer 15Enkel ADT för grafhanteringAtt besöka alla grannar till en nod v:Edge e = v.firstEdge();while (e!=null) {Vertex w = e.endPoint();// behandla we = e.nextEdge();}AD: Grafer 16


Traversera en grafVissa problem för <strong>grafer</strong> kan lösas med hjälp av någon formav traversering av grafen. Det finns två sådana: djupet-förstoch bredden-först.Traversera en graf djupet-förstDjupet först:• Motsvarar närmast rekursivt definierade traverseringar avträd.• Man besöker först utgångsnoden och sedan rekursivt dessgrannar djupet-först.• Risk finns för loop om grafen innehåller cykler. Man infördärför ett attribut i noderna (visited) som anger om nodenredan är besökt eller ej. Om en granne redan är besökt görman inget rekursivt anrop.AD: Grafer 17• Endast noder till vilka det finns en väg från utgångsnodenkommer att besökas.AD: Grafer 18Traversera en graf djupet-förstTraversera en graf bredden-förstI nodklassen kan följande metod placeras:public void depthFirst() {visited = true;// behandla nodenEdge e = firstEdge();while (e!=null) {Vertex w = e.endPoint();if (!w.visited) {w.depthFirst();}e = e.nextEdge();}}Alternativt kanmetoden placeras igrafklassen och haen nod somparameter.AD: Grafer 19Bredden-först:• Motsvarar närmast level-by-level-traversering av träd.• Man besöker först utgångsnoden, sedan dess grannar,sedan grannarnas grannar osv.• Risk finns även här för loop om grafen innehåller cykler.Löses på samma sätt som i djupet-först med extra visitedattribut.• Endast noder till vilka det finns en väg från utgångsnodenkommer att besökas.AD: Grafer 20


Traversera en graf bredden-förstKan implementeras som en metod i grafklassen. En kö används:public void breadthFirst(Vertex v) {Queue q = new ArrayQueue();v.visited = true;lägg in v i q;så länge q inte är tom {tag ut första grafnoden x ur q;Edge e = x.firstEdge();while (e!=null) {Vertex w = e.endPoint();if (!w.visited) {w.visited = true;lägg in w i q;}e = e.nextEdge();}}}Här kan x och dessgrannar behandlas.Vad som görs berorpå problemet manlöser.AD: Grafer 21Bredden-först, exempel på tillämpningI specialfallet att alla bågar har samma vikt ÿ0 kan problemetatt finna kortaste väg i en graf från en nod v till alla andranoder som kan nås från v lösas med bredden-förstgenomgång.Då är kortaste väg mellan två noder = den väg mellan nodernasom har minsta antal bågar.1v11 23Kortaste väg från v tillandra noder om viktenär 1 på alla bågar.AD: Grafer 22Bredden-först, exempel på tillämpningGör bredden-först-traversering utgående från v.• Först kommer de noder som är grannar att besökas, dvs desom kan nås på en väg bestående av en enda båge.• Därefter besöks de som inte är direkta grannar till v mensom kan nås på en väg bestående av två bågar etc.Inför ett attribut distance i varje nod. Implementationen finnspå nästa bild.AD: Grafer 23Bredden-först, exempel på tillämpningpublic void breadthFirst(Vertex v) {Queue q = new ArrayQueue();v.distance = 0; v.visited = true;lägg in v i q;så länge q inte är tom {tag ut första grafnoden x ur q;Edge e = x.firstEdge();while (e!=null) {Vertex w = e.endPoint();if (!w.visited) {w.visited = true;w.distance = x.distance+1;lägg in w i q;}e = e.nextEdge();}}AD: Grafer 24}


Traversering, tidskomplexitetOm grafen är sammanhängande så kommer man i både djupetförst-och bredden-först-traversering att besöka varje nod ochvarje båge en gång. Om det finns n noder och m bågar i grafenblir det alltså O(n+m) för själva traverseringen.Om ”behandlingen” av noder och/eller bågar kostar O(1) blirdärför algoritmer som utförs med sådana traverseringar O(n+m).I bredden-först-traversering ingår även köhantering, men allaköoperationer kan antagas vara O(1).Specialfallet av kortaste-väg-problemet vid lika vikt på bågarnaär ett exempel; kostnaden är här O(n+m).OBS: I en sammanhängande oriktad graf med n noder finns detminst n–1 bågar, dvs mÿn–1.AD: Grafer 25Kortaste väg i <strong>grafer</strong> med vikter ÿ 0påbågarnaProblem: Givetengrafmedvikterÿ 0 knutna till bågarna.Bestäm kortaste väg från en viss nod a till alla andra nodersom kan nås från a. Med väglängd avses här sammanlagdavikten på bågarna på vägen.Den tidigare presenterade algoritmen med bredden-försttraverseringklarar bara specialfallet alla vikter lika.För att lösa det allmännare problemet kan Dijkstras algoritmanvändas. Vi demonstrerar först algoritmen med ett exempel.AD: Grafer 26Dijkstras algoritm för kortaste vägSök kortast väg från noden 1 till alla andra i grafen:10 110030251060503420AD: Grafer 27Dijkstras algoritm för kortaste vägNoden 1 är genast klar, den har avstånd 0 till sig själv. (Klaranoder ritas grå). Noder som kan nås direkt från nod 1:21010430Första talet i varje nod är nodens nummer, andra anger avståndet(från utgångsnoden, nod 1). Pilarna anger varifrån den väg kommersom motsvarar avståndsangivelsen. Dijkstras algoritm väljer nu utden av noderna (som ännu inte valts ut) som har minst värde påAD: Grafer 28avståndet.5100


Dijkstras algoritm för kortaste vägDijkstras algoritm för kortaste vägNod 2 har minst värde på avståndet och väljs därför ut.De noder som kan nås direkt från 2 kartläggs nu:210360104305100Nu är det nod 4 som har minst avstånd.AD: Grafer 29Nod 4 väljs ut. De noder som kan nås direkt från 4 kartläggs:21035010Från nod 4 ser vi nod 3 och nod 5 på kortare avstånd äntidigare. Vi bokför bara det kortaste hittills funnaavståndet och varifrån den hittills kortaste vägen tillrespektive nod kommer.430590AD: Grafer 30Dijkstras algoritm för kortaste vägDijkstras algoritm för kortaste vägBland de ännu icke utvalda noderna är nu trean den som harminst värde på avståndet. Från denna ser vi också en kortareväg till nod 5:21035010430560AD: Grafer 31Den enda nod som nu återstår att välja ut är 5:21035010Observera att vi nu också har information om hur dekortaste vägarna ser ut.430560AD: Grafer 32


Dijkstras algoritm, implementationDijkstras algoritm, implementationDet är inte självklart att algoritmen producerar de kortastevägarna. Beviset finns i läroboken.Implementation:Låt noderna ha attribut:● visited, blir true när vi hittat en väg till noden● distance, värdet på den kortaste väg vi hittills harfunnit till noden● parent, refererar till den nod som är föregångare påhittills kortaste väg till noden.forts..AD: Grafer 33Vi måste hålla reda på den mängd noder av kandidater attväljas ut i nästa steg i algoritmen. Denna mängd består av deännu inte klara noder till vilka vi känner någon väg. I dennamängd gör vi● insättning när vi första gången ser en nod● borttagning av nod med minsta värde på avstånd närvi väljer ut en nod (som då blir klar)● minskar värdet på avståndet närvifinnerenkortarevägÿ prioritetskö är lämplig!En prioritetskö pq innehåller alla noder som vi hittills funnitnågon väg till. Prioriteten (nyckeln) i köns element =distance-attributet.AD: Grafer 34Dijkstras algoritm, implementationI pq placeras först noden a med distance =0,visited = true ochparent=null.så länge pq inte är tom:v = nod i pq med minst värde på distance. // deleteMin;d = v.distance; // anger allra kortaste väg till vför varje nod w till vilken det finns en båge från v:newDist = d + vikten på bågen från v till w;om w inte besökts tidigarew.visited = true;w.distance = newDist;w.parent = v;Lägg in w i pq;// insert;annars om newDist


Dijkstras algoritm, tidskomplexitetKostnaden för algoritmen blir uppåt begränsad av:n*W(insert) + n*W(deleteMin) +m*W(decreaseKey)där W(operation) betyder värstafallskostnaden för respektiveoperation på en prioritetskö.Prioritetskön kan aldrig innehålla mer än n element.Om prioritetskön implementerats med en osorterad lista ärkostnaden för insert och decreaseKey O(1) medandeleteMin kostar O(n). Totalt blir det då i värsta fall:n*O(1) + n*O(n) + m*O(1) = O(n 2 +m)AD: Grafer 37Dijkstras algoritm, tidskomplexitetOm prioritetskön implementerats med en heap blir allaoperationerna O(log n) och då blir det totalt:n*O(logn) + n*O(logn) + m*O(logn) = O((n+m)logn)En sammanhängande graf med n noder måste ha minst n–1 bågar, dvs m ÿ n–1.För godtycklig graf gäller också m n 2 (Från var och enav de n noderna kan det högst finnas bågar till varje nod igrafen).AD: Grafer 38Dijkstras algoritm, tidskomplexitetEn graf med m n–1 kallas en gles graf. För sådana <strong>grafer</strong>blir implementationen med heap snabbast ty då är den O(nlogn) medan den osorterade listan ger komplexiteten O(n 2 ).Om däremot m n 2 så vinner den osorterade listan som då gerkostnaden O(n 2 ) medan heapen ger kostnaden O(n 2 log n).Det går dock att använda mer sofistikerad implementation avprioritetskön som alltid ger kostnaden O(n logn + m)Dijkstras algoritm, bokensimplementationDen implementation som visats här är den vanligaste. Denutgår ifrån att man har en implementation av PriorityQueuedär förutom de vanliga operationerna insert, findMin ochdeleteMin även operationen decreaseKey är implementerad.Bokens implementation (sid 472) använder BinaryHeap somsaknar operationen decreaseKey. I heapen sätts in notisobjektinnehållande referens till en nod och dess avstånd. Nären kortare väg till en nod påträffas sätts en ny notis in iheapen.AD: Grafer 39forts …AD: Grafer 40


Dijkstras algoritm, bokensimplementationNär en notis plockas ut (deleteMin) kan den alltså avse ennod som redan tidigare plockats ut. Därför finns ett extraattribut för varje nod som håller reda på om den är klar ellerej. Klara noder ignoreras när de på nytt plockas ur heapen.Det finns dock i Weiss’ klassbibliotek en annanimplementation av prioritetskön, PairingHeap, sominnehåller decreaseKey och som kan användas i stället.AD: Grafer 41Riktad acyklisk graf (DAG)DAG = Directed acyclic graph = riktad graf utan cyklerM1 M2 M3 M4C1 C2 C3 C4I en DAG gäller för varje par av noder a och b ett av följande:1. det finns en väg från a till b ( a ”kommer före” b)2. det finns en väg från b till a (b ”kommer före” a)3. det finns ingen väg från a till b eller från b till a.Det som alltså inte kan inträffa i en DAG är att det finns bådeen väg från a till b och en väg från b till a (ty det skulleinnebära cykel i grafen).AD: Grafer 42Topologisk ordning i DAGTopologisk ordning i DAGAtt topologiskt ordna noderna i en DAG innebär att ordna demi en följd v 1 ,v 2 ,..., v k så att det för alla bågar i grafengäller att v i kommer före v j i följden.Alternativt uttryckt: v 1 ,v 2 ,..., v k utgör en topologisk sorteringom det för i


Algoritm för topologisk sorteringAlgoritm för topologisk sorteringså länge det finns nod med ingrad 0:v = en nod med ingrad 0;lägg in v sist i en lista resultList;tag bort alla bågar från v ur grafen;Listan resultList innehåller nu alla noder i topologiskordning.Anm. 1: Att ta bort bågar från en nod simuleras genom ettattribut inDegree i varje nod. inDegree minskar närbåge till noden ”försvinner”.Anm. 2: Man måste hålla reda på alla noder med ingrad 0,som ännu inte valts ut i en särskild lista (annars ineffektivt,man får då leta efter ny nod med ingrad noll).AD: Grafer 45AD: Grafer 46Topologisk sortering, exI varje nod anges aktuell ingrad. Q är listan med noder avingrad 0, L är den resulterande listan av noder i topologiskordning.A0Initialt:B1C1L: tomD3Q: AEfter ett steg:A0B0L: AD2Q: B, CC0AD: Grafer 47A0B0C0Topologisk sortering, ex (forts)Efter två steg:D1L: A, BQ: CEfter tre steg:A0Och till sist:A0B0C0B0D0D0L: A, B, CQ: DL: A, B, C, DQ: tomCAD: Grafer 048


Kortaste väg i DAGKortaste väg från en viss nod s till en nod x kan lätt beräknasom vi känner kortaste väg från s till alla de noder från vilkadet finns bågar till x.Minstaavståndfrånstillx=minimum(minstaavståndfrånstill y + kostnaden på bågen från y till x) där minimum bildasöver alla noder y som har båge till x.10Om vi för grafen i fig. har bestämtminstaavståndfrånstilla,bochctill 10, 12 och 15 så blir minstaavstånd från s till x det minsta av10+8, 12+6 och 15+1 dvs 16.sa12b15AD: Grafer 4968c1xKortaste väg i DAGVi skall alltså först beräkna kortaste avstånd från s till denoder som är föregångare till en nod x innan vi kan beräknakortaste avstånd till x själv. Dvs vi kan räkna fram kortasteavstånd till noderna i topologisk ordning. Till de noder somär föregångare till vår startnod s finns det ingen väg från seftersom vi inte har cykler i grafen.• Vi kan ha ett extra attribut (distansattribut) i varje nodsom skall innehålla längden av hittills kortaste väg vifunnit från s till noden. Från början har detta attributvärdet i alla noder utom s, där det har värdet 0.Forts.AD: Grafer 50Kortaste väg i DAG• Vi går igenom grafen i topologisk ordning.• När en nod fått ingrad noll och skall behandlas kan två fall inträffa:1. Dess distansattribut är . I så fall är den föregångare till seller det saknas väg från s till noden. Den är alltså ointressant.Vi plockar bara bort dess utgående bågar.2. Dess distansattribut är < . (Detta inträffar första gången närdet är startnoden s som fått ingrad 0 och behandlas.) Då plockarvi dels bort dess bågar, men uppdaterar ev. distansattributen inoderna i andra änden av dessa bågar. Vi har ju nu hittat en nyväg till dessa noder. Om den nya vägens längd är mindre änhittills kortaste kända väg (som anges i attributet) så uppdaterasKortaste väg i DAG, exSök kortaste väg från noden c till alla noder som kan nås fråndenna i grafen: a 10 d2cf5 8022 e10Distansattributen ifyllda i noderna. Den enda nod med ingrad nollär a. Tag bort bågar som utgår från a:Nu har nod c ingrad noll. Viad2 tar bort utgående bågar. Vicf uppdaterar distansattributen i802noderna i bågarnas ändpunkter.2 e10 Vi har ju nu hittat nya kortarevägar till dessa.distansattributet. AD: Grafer 51AD: Grafer 52


Kortaste väg i DAG, exKortaste väg i DAG, exaac0c0d8e2d4e222102ff12Ny nod med ingrad noll är e. Från efinns en båge till d av längden 2. Vi seralltså nu en väg av längden 2 + 2 från ctill d. Eftersom denna är kortare än dengamla (av längden 8) uppdaterar vidistansattributet i d. Vi ser också förförsta gången en väg till f. Denna harlängden 2 + 10 = 12Nu är det nod d som fått ingrad noll.Den enda bågen leder till f och ger enväg av längden 4 + 2 som är kortareän den gamla.AD: Grafer 53ac0d4e2f6Klart, ty inga nya noder med ingradnoll kvar att behandla. Distansattributeti noderna anger nulängden av kortaste väg från c tillnoden. Är detta attribut finnsingen väg från c till noden.Vill man också få uppgift om hur kortaste väg ser ut kan man haett attribut till i varje nod som refererar till den nod som ärföregångare på kortaste vägen:ac0d4e2f6Detta extra attribut uppdaterasenkelt samtidigt med att manuppdaterar distansattributen.AD: Grafer 54

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

Saved successfully!

Ooh no, something went wrong!