Föreläsning Datastrukturer (DAT036)

Relevanta dokument
Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 8. Lecture 6 1

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Datastrukturer. föreläsning 8. Maps 1

Dugga Datastrukturer (DAT036)

Datastrukturer. föreläsning 9. Maps 1

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Tentamen Datastrukturer (DAT036)

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Föreläsning 5: Grafer Del 1

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Lösningar Datastrukturer TDA

Föreläsningsanteckningar F6

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 4 Datastrukturer (DAT037)

Graphs (chapter 14) 1

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

FÖRELÄSNING 11 DATALOGI I

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Tentamen Datastrukturer (DAT037)

Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Föreläsning Datastrukturer (DAT037)

Föreläsning 5: Dynamisk programmering

Datastrukturer. föreläsning 9. Maps 1

Tentamen i Algoritmer & Datastrukturer i Java

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15-13:15

Avancerad Problemlösning och Programmering i Praktiken

Föreläsning 1 Datastrukturer (DAT037)

Grafer, allmänt. Med datastrukturen graf menas vanligen: en mängd av noder (vertices) och en mängd av bågar (edges).

Lösningsförslag till tentamen Datastrukturer, DAT037,

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Föreläsning 2. Kortaste vägar i grafer.

Trädstrukturer och grafer

Datastrukturer. föreläsning 7. Maps 1

Kapitel 9: Grafalgoritmer

Föreläsning Datastrukturer (DAT036)

Datastrukturer. föreläsning 3. Stacks 1

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:15 19:15

Föreläsning 5 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Exempeltenta GruDat 2002/2003

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 13. Dynamisk programmering

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen Datastrukturer (DAT036)

Föreläsning 11 Datastrukturer (DAT037)

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

F11. Läsanvisning: kap 10 + dessa OH. Kruskals algoritm kortaste vägar en till alla

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 11. Riktade grafer. Viktade grafer. TDDC70/91: DALG. Innehåll. Innehåll. 1 Riktade grafer A 11.3

Tentamen Datastrukturer för D2 DAT 035

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 4: Kombinatorisk sökning

Algoritmer. Två gränssnitt

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Tentamen kl Uppgift 4. Uppgift 5

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Tentamen Datastrukturer (DAT036)

Föreläsning 10. Riktade grafer. Viktade grafer. TDDC91,TDDE22,725G97: DALG. Innehåll. Innehåll Riktade grafer A 10.3

Tildatenta Lösningsskiss

Föreläsning 2. Kortaste vägar i grafer.

Algoritmer och datastrukturer TDA Fredrik Johansson

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning 2: Grafer. Exempel på graf

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Sökning och sortering

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Transkript:

Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2012-11-13

Idag Mer om grafer: Topologisk sortering. Kortaste vägen. Bredden först-sökning. Dijkstras algoritm. Floyd-Warshall.

Topologisk sortering Definition: Total ordning av V. Om det finns en väg från v 1 till v 2 så är v 1 < v 2. Exempel: Förkunskapskrav giltig ordning av kurser.

Topologisk sortering Ointressant för oriktade grafer. Cykel ingen topologisk sortering. DAGs (riktade ocykliska grafer) kan alltid sorteras topologiskt.

Ingrad/utgrad En nods ingrad är antalet direkta föregångare. En nods utgrad är antalet direkta efterföljare. Tillräckligt villkor för att vara cyklisk: Alla noder har ingrad > 0.

Topologisk sortering: enkel algoritm r = new empty list while V do if any v V with indegree(v) = 0 then r.add-last(v) remove v from G else raise error: cycle found return r // Nodes, topologically sorted.

Topologisk sortering: enkel algoritm r = new empty list while V do if any v V with indegree(v) = 0 then r.add-last(v) remove v from G else raise error: cycle found return r // Nodes, topologically sorted. Kan vi undvika radering?

Topologisk sortering: enkel algoritm (2) r = new empty list d = map from vertices to their indegrees // null for nodes in r. repeat V times if d[v] == 0 for some v then r.add-last(v) d[v] = null for each direct successor v' of v do decrease d[v'] by 1 else raise error: cycle found return r // Nodes, topologically sorted.

Grafrepresentation Pseudokod: Behöver mer information för tidskomplexitetsanalys. Grafrepresentation (den här gången): Noder numrerade 0, 1,, V 1. Array adjacent med V positioner. adjacent[i] innehåller grannlista (direkt efterföljar-lista) för nod i. map from vertices to their indegrees : Array.

Pseudokod Gärna mer detaljer och bättre namn på tenta. Exempel: // indegree är en map från nodindex till // /virtuella/ ingrader, de ingrader // respektive nod skulle ha om alla noder i // r togs bort från grafen. Den virtuella // ingraden för noder i r är null. indegree = new array of size V // Initialisera indegree. for i in [0,..., V -1] do indegree[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do indegree[j]++

Pseudokod Gärna mer detaljer och bättre namn på tenta. Exempel: // indegree är en map från nodindex till // /virtuella/ ingrader, de ingrader // respektive nod skulle ha om alla noder i // r togs bort från grafen. Den virtuella // ingraden för noder i r är null. indegree = new array of size V // Initialisera indegree. for i in [0,..., V -1] do indegree[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do indegree[j]++ O( V ) ggr

Pseudokod Gärna mer detaljer och bättre namn på tenta. Exempel: // indegree är en map från nodindex till // /virtuella/ ingrader, de ingrader // respektive nod skulle ha om alla noder i // r togs bort från grafen. Den virtuella // ingraden för noder i r är null. indegree = new array of size V // Initialisera indegree. for i in [0,..., V -1] do indegree[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do indegree[j]++ O( V ) ggr O( V ) O( E ) ggr

Topologisk sortering: enkel algoritm (2) r = new empty list d = map from vertices to their indegrees O( V + E ) // null for nodes in r. repeat V times if d[v] == 0 for some v then r.add-last(v) d[v] = null for each direct successor v' of v do decrease d[v'] by 1 else raise error: cycle found O( V ) ggr O( V ) O( E ) ggr return r // Nodes, topologically sorted. Totalt: O( V 2 + E ) = O( V 2 ).

Topologisk sortering med kö r = new empty list d = map from vertices to their indegrees q = queue with all nodes of indegree 0 while q is non-empty do v = q.dequeue() r.add-last(v) for each direct successor v' of v do decrease d[v'] by 1 if d[v'] = 0 then q.enqueue(v') if r.length() < V then raise error: cycle found return r // Nodes, topologically sorted.

Övning Analysera tidskomplexiteten. Bonusövning Vad händer om man använder en stack istället för en kö?

Topologisk sortering med kö r = new empty list d = map from vertices to their indegrees q = queue with all nodes of indegree 0 while q is non-empty do v = q.dequeue() r.add-last(v) for each direct successor v' of v do decrease d[v'] by 1 if d[v'] = 0 then q.enqueue(v') if r.length() < V then raise error: cycle found O( V + E ) O( V ) O( V ) ggr O( E ) ggr return r // Nodes, topologically sorted.

Topologisk sortering med kö r = new empty list O( V + E ) O( V ) d = map from vertices to their indegrees Linjär v = q.dequeue() O( V + E ) q = queue with all nodes of indegree 0 while q is non-empty do r.add-last(v) for each direct successor v' of v do decrease d[v'] by 1 if d[v'] = 0 then q.enqueue(v') O( V ) ggr O( E ) ggr if r.length() < V then raise error: cycle found return r // Nodes, topologically sorted.

Kortaste vägen

Kortaste vägen Kostnad av väg v 1,, v n : I oviktad graf: n 1. n 1 c i,i+1 i=1

Kortaste vägen Kortaste vägen-problem: Givet två noder v 1 och v 2, hitta kortaste vägen från v 1 till v 2. Givet nod v, hitta kortaste vägen från v till alla andra noder. Hitta kortaste vägen från varje nod till varje annan.

Oviktade grafer: bredden först-sökning d = new array of size V, initialised to p = new array of size V, initialised to null q = new empty queue q.enqueue(s) d[s] = 0 while q is non-empty do v = q.dequeue() for each direct successor v' of v do if d[v'] = then d[v'] = d[v] + 1 p[v'] = v q.enqueue(v') return (d, p)

Oviktade grafer: bredden först-sökning d = new array of size V, initialised to p = new array of size V, initialised to null q = new empty queue q.enqueue(s) d[s] = 0 O( V ) O( V ) while q is non-empty do v = q.dequeue() for each direct successor v' of v do if d[v'] = then d[v'] = d[v] + 1 p[v'] = v q.enqueue(v') O( V ) ggr O( E ) ggr return (d, p)

Övning Vad händer om man använder en stack istället för en kö?

Viktade grafer

Viktade grafer: Dijkstras algoritm Observation: Kan behöva uppdatera kostnader flera gånger. Antagande: Inga negativa vikter. Grundidé: Antag att vi redan känner till kortaste vägen till vissa noder. Beräkna avståndet till alla de här nodernas direkta efterföljare (utom noderna själva). Det kortaste av de här avstånden måste vara korrekt.

d = new array of size V, initialised to p = new array of size V, initialised to null k = new array of size V, initialised to false d[s] = 0 repeat if no unknown node v' satisfies d[v'] < then break v = one of the unknown nodes v' with smallest d[v'] k[v] = true for each direct successor v' of v do if not k[v'] and d[v'] > d[v] + c(v,v') then d[v'] = d[v] + c(v,v') p[v'] = v return (d, p)

Viktade grafer: Dijkstras algoritm Enkel implementation: O( E + V 2 ) = O( V 2 ). Om grafen är tät ( E = Θ( V 2 )): linjär i grafens storlek. (Antagande: Viktoperationer tar konstant tid.)

d = new array of size V, initialised to p = new array of size V, initialised to null k = new array of size V, initialised to false q = new empty priority queue d[s] = 0 q.insert(s, 0) while q is non-empty do v = q.delete-min() if not k[v] then k[v] = true for each direct successor v' of v do if not k[v'] and d[v'] > d[v] + c(v,v') then d[v'] = d[v] + c(v,v') p[v'] = v q.insert(v, d[v']) return (d, p)

Viktade grafer: Dijkstras algoritm Med prioritetskö: Antagande: V = O( E ). Med binär heap: O( V + 2 E log E ) = O( E log V ). Med binomialheap: O( V + E log E + E ) = O( E log V ).

Viktade grafer: Dijkstras algoritm Kan också använda decrease-key: Dubbletter i kön undviks. Med binär heap: O( V + V log V + E log V ) = O( E log V ). Med binomialheap: O( V + V log V + E log V ) = O( E log V ). Krångligare (?), verkar ofta vara långsammare.

Giriga algoritmer Girig algoritm: Varje steg baserat på det som verkar bäst just nu. Bredden först-sökning: Lite för girig.

Övning Visa att Dijkstras algoritm inte fungerar för vissa grafer med negativa vikter (men utan negativa cykler).

Viktade grafer: Floyd-Warshall Hittar kortaste vägen från varje nod till varje annan. Antagande: Inga negativa cykler. Kan vara bra för täta grafer. Använder annan teknik: Dynamisk programmering.

Viktade grafer: Floyd-Warshall D(k) (i,j) : Kortaste avståndet från i till j som bara går via k första noderna. D( V ) (i,j) : Kortaste vägen från i till j.

Viktade grafer: Floyd-Warshall D(k) (i,j) : Kortaste avståndet från i till j som bara går via k första noderna. D( V ) (i,j) : Kortaste vägen från i till j. 0, i = j D(0) (i,j) = c (i,j), i j, (i, j) E, annars D(k + 1) (i,j) = min D(k) (i,j), D(k) (i,k) + D(k) (k,j)

Viktade grafer: Floyd-Warshall D(k) (i,j) : Kortaste avståndet från i till j som bara går via k första noderna. D( V ) (i,j) : Kortaste vägen från i till j. 0, i = j D(0) (i,j) = c (i,j), i j, (i, j) E, annars D(k + 1) (i,j) = min D(k) (i,j), D(k) (i,k) + D(k) (k,j) Representera D(k) med matris. Beräkna D(0), D(1),, D( V ): Θ( V 3 ).

Sammanfattning Topologisk sortering. Kortaste vägen. Nästa vecka: Minsta uppspännande träd. Djupet först-sökning. Dugga.