atastrukturer föreläsning 8 Lecture 6 1
jupet-först sökning (S) och bredden-först sökning (S) Två metoder att genomsöka en graf; två grafiteratorer! Kan även användas för att avgöra om två noder är sammanbundna. jupet först: välj en startnod, följ en väg så långt som möjligt, gör sedan backtracking, följ nästa väg så långt som möjligt, osv redden först: välj en startnod, genomsök först alla noder med avståndet 1, sedan alla noder med avståndet 2, osv. Lecture 6 2
jupet-först sökning Lecture 6 3
xempel obesökt nod besökt nod obesökt båge upptäcktsbåge bakåtbåge Lecture 6 4
xempel, fortsättning Lecture 6 5
jupet-först sökning: tillämpningar vgör om en graf är sammanhängande estäm de sammanhängande komponenterna estäm en uppspännande skog inn en väg mellan två noder inn en cykel Lecture 6 6
redden-först sökning L 0 L 1 L 2 Lecture 6 7
xempel obesökt nod besökt nod obesökt båge upptäcktsbåge övergångsbåge L 1 L 0 L 0 L 0 L 1 L 1 Lecture 6 8
xempel (forts.) L 0 L 0 L 1 L 1 L 2 L 0 L 0 L 1 L 1 L 2 L 2 Lecture 6 9
xempel forts. L 0 L 0 L 1 L 1 L 2 L 2 L 0 L 1 L 2 Lecture 6 10
S-algoritmen lgorithm S Input graph G Output labeling of the edges and partition of the vertices of G for all u G.vertices() setlabel(u, UNXPLOR) for all e G.edges() setlabel(e, UNXPLOR) for all v G.vertices() if getlabel(v) = UNXPLOR S(G, v) lgorithm S(G,s) L 0 new empty sequence L 0.insertLast(s) setlabel(s, VISIT) i 0 while L i.ismpty() L i +1 new empty sequence for all v L i.elements() for all e G.incidentdges(v) if getlabel(e) = UNXPLOR w opposite(v,e) if getlabel(w) = UNXPLOR setlabel(e, ISOVRY) setlabel(w, VISIT) L i +1.insertLast(w) else setlabel(e, ROSS) i i +1 Lecture 6 11
redden-först sökning (S) xekveringstiden för S på en graf med n noder och m bågar är O(m+n) S kan användas ör att hitta kortaste vägen (i en oviktad graf) mellan två noder Se även tillämpningarna för S (finna sammanhängande komponenter, cykler, etc) Lecture 6 12
en kortaste vägen 0 8 4 2 8 7 2 1 2 5 3 9 8 5 3 Lecture 6 13
Viktade grafer I en viktad graf tillordnar vi ett tal till varje båge. etta tal kallas en vikt Vikter kan representera avstånd, kostnader mm xempel: avstånd mellan flygplatser SO 337 1843 OR 802 849 LG PV 1205 HNL LX 1233 W 1120 MI Lecture 6 14
tt finna kortaste vägen Givet en viktad graf och två noder u och v, finn en väg mellan dem vars bågar har minimal sammanlagd vikt Tillämpningar ärdplaner för flyg, tåg, bilar, osv Snabbaste vägen att skicka ett paket över internet xempel: HNL Kortaste vägen mellan PV och HNL SO 337 LX 1843 1233 OR 802 W 849 1120 LG PV MI Lecture 6 15 1205
Hur man finner kortaste vägen mellan två noder i en riktad graf ijkstras algoritm är en generalisering av S som beräknar kortaste vägar i en viktad graf. en besöker noderna i avståndsordning från startnoden. en beräknar även avståndet från startnoden till alla andra noder. Lecture 6 16
S, S och ijkstras algoritm essa tre algoritmer delar in noderna i besökta, kandidatnoder (grannar till besökta noder), och obesökta noder. S har en stack med kandidatnoder S har en kö med kandidatnoder ijkstras algoritm har en prioritetskö med kandidatnoder Obs. Kön i pseudokoden för S är implicit! Lecture 6 17
xempel: kortaste vägar från noden till övriga noder 0 8 4 2 7 1 3 9 2 5 esökta noder: 0 Prioritetskö Q: (0,) Lecture 6 18
Steg 1: besök och lägg dess grannar i Q! 8 4 8 2 2 4 7 1 3 9 2 5 esökta noder: 1 Prioritetskö Q:(2,) (4,) (8,) Lecture 6 19
Steg 2 8 4 8 2 2 3 7 1 5 3 9 11 2 5 esökta noder: 2 Prioritetskö Q: (3,)(5,)(8,)(11,) esök och lägg till grannarna och som inte redan finns i Q. Uppdatera också avståndet till eftersom en kortare väg från startnoden har hittats. Lecture 6 20
Steg 3 8 4 8 2 2 3 7 1 5 3 9 8 2 5 esökta noder: 3 Prioritetskö Q: (5,)(8,)(8,) Nu är alla noder antingen besökta eller ligger i Q. Vi måste dock uppdatera avståndet till. Lecture 6 21
Steg 4 8 4 7 2 2 3 7 1 5 3 9 8 2 5 esökta noder: 4 Prioritetskö Q: (7,)(8,) Nu uppdaterade vi avståndet till. Lecture 6 22
Steg 5 8 4 7 2 2 3 7 1 5 3 9 8 2 5 esökta noder: 5 Prioritetskö Q: (8,) Lecture 6 23
Steg 6 8 4 7 2 2 3 7 1 5 3 9 8 2 5 esökta noder: 6 Q: tom Lecture 6 24
Hur man implementerar ijkstras algoritm Input: en graf G med icke-negativa vikter och en startnod s Output: ör varje nod u det kortaste avståndet [u] från s. rån början sätter vi [s] till 0 och [u] till oändligheten. Under exekveringen av algoritmen kommer [u] att innehålla de hittills funna kortaste avstånden från s. lgoritmen använder sig av en prioritetskö Q som innehåller alla obesökta noder u med [u] som prioriteter. Vi besöker den nod som har högst prioritet i Q. Om vi vill returnera kortaste vägar och inte bara kortaste avstånd låter vi [u] även innehålla en pekare till föregående nod på den kortaste vägen. Om vi vill kunna uppdatera prioriteten i Q för en viss nod behöver vi dessutom lagra platsen som noden lagras på i Q. (Om Q är en heap så lagrar vi index i fältet som lagrar Q.) Lecture 6 25
ijkstras algoritm lgorithm ShortestPath(G,s) [s] = 0 [u] = infinity for all nodes u different from s. Q new priority queue containing all nodes u with priorities [u] while Q.ismpty() u Q.removeMinNode() ( visit u) for each node z adjacent to u and not yet visited do if [u] + weight(u,z) < [z] then [z] [u] + weight(u,z) and update the priority of z in Q return [u] for each node u n implementeringsdetalj: Q i exemplet tidigare visar inte de avstånd [u] som är oändligheten. n alternativ implementering har inte dessa med i Q. Lecture 6 26
Några egenskaper genskap 1: n delväg till en kortaste väg är också en kortaste väg genskap 2: et finns ett träd av kortaste vägar från en startnod till de alla de andra noderna xempel: Träd med kortaste vägar från PV SO OR LG PV HNL 337 1843 802 849 1205 LX 1233 W 1120 MI Lecture 6 27
Komplexiteten hos ijkstra med heap Om grafen har n noder och m bågar och vi implementerar Q med en heap gäller att Heapmetoderna (ta bort minsta och ändra prioriteten på ett element i Q) är O(log n). Man tar bort minsta elementet n gånger Man ändrar en prioritet för någon nod maximalt en gång för varje båge, dvs O(m). lltså är komplexiteten O((m+n) log n). Om grafen sammanhängande blir detta O(m log n). Lecture 6 28
Komplexiteten hos ijkstra med Q som fält Om vi i stället implementerar Q med ett osorterat fält av noder och grafen har n noder och m bågar är tt ta bort minsta elementet är O(n) och man gör detta maximalt n gånger. Totala tiden för denna operation är alltså O(n 2 ). tt ändra prioriteten på ett element är O(1) och man gör detta maximalt en gång för varje båge. Totala tiden för denna operation är alltså O(m). lltså är komplexiteten O(n 2 + m). etta är bättre än O((m+n)log n) om vi har en tät graf. Lecture 6 29
Heuristisk sökning Om man letar efter en specifik nod i en graf kan man förbättra ijkstras algoritm om man har ytterligare heuristisk information T ex kan man uppskatta tiden det tar att åka till en viss hållplats om man vet det geografiska avståndet ( as the crow flies ) När man väljer kandidatnod rankar man noderna efter summan av tiden från utgångspunkten och den uppskattade tiden till målet enna algoritm kallas * (brukar betraktas som I) Heuristik = tumregel Lecture 6 30
Riktade grafer Lecture 6 31
jupet-först, bredden-först och ijkstras algoritm fungerar på väsentligen samma sätt för riktade grafer som för oriktade grafer (exemplen var oriktade) Lecture 6 32
Transitiva höljet Transitiva höljet av en riktad graf G är en riktad graf G* som har samma noder som G om G har en väg från u till v (u v), så har G* en båge från u till v Transitiva höljet beskriver vilka noder man kan nå från andra noder ( reachability ) Vi kan beräkna transitiva höljet genom att använda S én gång för varje nod. xekveringstiden blir då O(n(n + m)). ungerar för oriktade grafer också förstås - oriktade grafer är specialfall av riktade grafer! G G* Lecture 6 33
loyd-warshalls algoritm Grafen G är implementerad som en grannmatris. Vilken tidskomplexitet har följande algoritm? lgorithm loydwarshall(g) Output transitive closure G* of G matrix representing the graph G n number of vertices for k 1 to n do for i 1 to n do for j 1 to n do (i,j) (i,j) ((i,k) (k,j)) return Lecture 6 34