Grafer, allmänt Allmänt Med datastrukturen graf menas vanligen: en mängd av noder (vertices) och en mängd av bågar (edges). En graf kan vara riktad (directed) eller oriktad (undirected). En graf kan vara viktad (weighted) eller oviktad(not weighted). Datastrukturer, Grafer 1
Bågar Allmänt En båge består av: två noder, en vikt om grafen är viktad och en riktning om grafen är riktad. Noderna som ingår i en båge säges vara förbundna (adjacent) och säges vara grannar (neighbours) till varandra. I en oviktad graf anses vikten för varje båge vara lika med 1. Med en väg (path) menas: en sekvens av noder där två intillliggande noder i sekvensen utgör noderna i en båge eller en sekvens av bågar, där två intilliggande bågar har en nod gemensamt. Datastrukturer, Grafer 2
Speciella grafer Allmänt En graf säges vara komplett (complete) om varje nod är granne till alla andra noder. Om man inte räknar parallella bågar eller en bågar från en nod till sig själv, innehåller en komplett graf n (n 1) 2 O( n 2 ) bågar. Den kompletta riktade grafen innehåller dubbelt så många. En graf är cyklisk (cyclic) om det finns en väg av minst 2 olika bågar från någon nod till sig själv. En graf är sammanbunden, (eller sammankopplad), (connected) om det från varje nod finns åtminstone en väg till varje annan nod. Minimalt innebär detta att en oriktad sammanbunden graf innehåller n 1 bågar och en riktad sammanbunden graf innehåller minst n bågar. Om grafen inte kan delas in i två isolerade delar är grafen sammanhängande. Med isolerade menas att det ej finns någon båge från den ena delgrafen till den andra delgrafen i den totala grafen. Detta innebär att det finns minst n 1 bågar för en sammanhängande graf. En riktad viktad graf kallas också ett nätverk (network) Datastrukturer, Grafer 3
Traversering i grafer Traversering Två huvudformer: bredden först (breadth first) eller djupet först (depth first). Datastrukturer, Grafer 4
Implementering av grafer Implementering 1. Elementen själva är noder, t.ex. släktgraf. 2. Som en matris, bra vid täta grafer. 3. Med en tabell av grannlistor, bra vid glesa grafer. Datastrukturer, Grafer 5
Exempel: matris Implementering 1 2 3 4 5 6 1 1 4 2 1 2 6 10 3 4 2 5 11 4 6 5 10 5 5 6 11 5 Datastrukturer, Grafer 6
Exempel: granntabell Implementering 1 (1,2,1) (1,3,4) 2 (2,1,1) (2,3,2) (2,4,6) (2,5,10) 3 (3,1,4) (3,2,2) (3,5,5) (3,6,11) 4 (4,2,6) 5 (5,2,10) (5,3,5) (5,6,5) 6 (6,3,11) (6,5,5) Datastrukturer, Grafer 7
Grafalgoritmer Algoritmer Vi skall betrakta några giriga (greedy) algoritmer. 1. Kortaste vägen (Shortest Path), enligt Dijkstra s algoritm. 2. Minsta sammanhängande graf (Minimum spanning tree), enligt Prim s algoritm 3. Minsta sammanhängande graf (Minimum spanning tree), enligt Kruskal s algoritm Datastrukturer, Grafer 8
Komplexitet för grafalgoritmer Algoritmer Komplexiteten för en grafalgoritm anges i förhållande till: antalet noder, dvs O( f( V ) ), antalet bågar, dvs O( f( E ) ) eller en kombination av dessa, dvs O( f( V, E ) ) Vanligast för grafer implementerade i en matris är O( f( V ) ). Vanligast för grafer implementerade med en grannlistetabell är O( f( E ) ) Datastrukturer, Grafer 9
Dijkstra s algoritm på en granntabell Algoritmer Kortaste vägen mellan startpunkt och slutpunkt Köelementen innehåller nod man kommit till, totalvikt och vägen dit från startpunkt Lägg startpunkt med den tomma vägen och totalvikten 0 i en tom prioritetskö Så länge kön inte är tom låt ( nod, totvikt, väg ) vara första element som hämtas i kön (dvs minsta totvikt) om nod ej besökt Om nod är slutpunkt returnera väg Annars: markera nod besökt för varje båge i grannlistan för nod, om tillnoden ej markerad besökt lägg in nytt köelement för denna tillnod Datastrukturer, Grafer 10
Prim s algoritm på en granntabell Algoritmer Prims algoritm för att hitta minsta sammanhängande graf. Välj en godtycklig nod a som startpunkt. Markera a besökt. Lägg alla bågar från a i en prioritetskö pq, som är ordnad efter bågens vikt. (Lägsta vikt har högst prioritet.) Så länge kön pq ej är tom låt ( from, to, weight ) vara första element som hämtas ur kön pq om to ej markerad besökt markera to besökt lägg bågen i listan res lägg alla bågar från to i prioritetskön pq Datastrukturer, Grafer 11
Kruskal s algoritm på en granntabell Algoritmer Kruskals algoritm för att hitta minsta hopknutna graf. (Dvs sammanhängande graf om den är oriktad) Skapa ett fält A som för varje nod innehåller en egen tom lista. Gå igenom granntabellen och lägg in ALLA bågar i en prioritetskö pq (lägsta vikt högsta prioritet) Så länge kön pq ej är tom låt e == (from, to, weight) vara första element som hämtas ur kön pq om from och to ej refererar till samma lista i fältet A, flytta över alla elementen från den ena listan till den andra och se till att alla berörda noder i A refererar till den påfyllda listan lägg slutligen e i den påfyllda listan. Datastrukturer, Grafer 12