Föreläsning Datastrukturer (DAT036)

Relevanta dokument
Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning Datastrukturer (DAT036)

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

Dugga Datastrukturer (DAT036)

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

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

Föreläsning 5: Grafer Del 1

Tentamen Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Lösningar Datastrukturer TDA

Föreläsning 13 Datastrukturer (DAT037)

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

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

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

Datastrukturer. föreläsning 8. Maps 1

Föreläsning 13 Datastrukturer (DAT037)

Datastrukturer. föreläsning 9. Maps 1

Tentamen Datastrukturer (DAT036)

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

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

FÖRELÄSNING 11 DATALOGI I

Tentamen Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Graphs (chapter 14) 1

Föreläsningsanteckningar F6

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

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

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 7. Maps 1

Föreläsning Datastrukturer (DAT036)

Föreläsning 1 Datastrukturer (DAT037)

Datastrukturer. föreläsning 9. Maps 1

Avancerad Problemlösning och Programmering i Praktiken

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 5 Datastrukturer (DAT037)

Kapitel 9: Grafalgoritmer

Trädstrukturer och grafer

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

TNK049 Optimeringslära

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

Exempeltenta GruDat 2002/2003

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

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

Föreläsning 2 Datastrukturer (DAT037)

Övningsuppgifter #11, Programkonstruktion och datastrukturer

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

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

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/INN960

Tentamen Datastrukturer D DAT 035/INN960

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Tildatenta Lösningsskiss

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

Föreläsning 9 Innehåll

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Sökning och sortering

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

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

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

Tentamen kl Uppgift 4. Uppgift 5

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Datastrukturer och Algoritmer D0041D

Grundläggande datalogi - Övning 4

Föreläsning 4: Kombinatorisk sökning

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

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

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

Föreläsning 10 Datastrukturer (DAT037)

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

Föreläsning 6. Slumptal Testa slumptal Slumptal för olika fördelningar Grafer Datastrukturen graf

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Föreläsning 11 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Transkript:

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

Idag Grafer: Terminologi. Datastrukturer. Topologisk sortering. Kortaste vägen. Bredden först-sökning. Dijkstras algoritm. (Vi får se vad vi hinner.)

Grafer Grafer kan representera: Nätverk. Beroenden. Flödeskapaciteter.

Grafer Givet en graf kan man ställa olika frågor: Nätverk. Hur tar man sig från A till B? Snabbast? Billigast? Vilken rutt har störst bandbredd? Beroenden. Vad måste göras först? Flödeskapaciteter. Vilket är det största möjliga flödet?

Terminologi

Terminologi Graf: G = (V, E). V : Ändlig mängd av noder. E: Kanter/bågar. Riktad graf: E V V. Oriktad graf: E { U V 1 U 2 }. Viktad graf: E V V W eller E { U V 1 U 2 } W (där W kan vara N, Z, R, ). I en multigraf kan det finnas flera kanter från u till v.

Terminologi Direkta efterföljare till u: { v (u, v) E }. Direkta föregångare till v: { u (u, v) E }. Ingrad: Antalet direkta föregångare. Utgrad: Antalet direkta efterföljare. Begreppen definieras på motsvarande sätt för oriktade grafer/multigrafer/viktade grafer.

Terminologi Väg: v 1 v 2 v n. Längd: n 1. Vägar kan ha längd 0. Enkel väg: Alla noder distinkta (utom möjligtvis v 1 och v n ). Loop: Kant från nod till sig själv.

Terminologi För riktade grafer: Cykel: Väg av längd 1 från v till v. Enkel cykel: Cykel som är enkel väg. (Riktad) acyklisk graf/dag: Graf utan cykler.

Terminologi För oriktade grafer: Sammanhängande: Finns väg från varje nod till varje annan nod. För riktade grafer: Starkt sammanhängande: Finns väg från varje nod till varje annan nod. Svagt sammanhängande: Underliggande oriktad graf är sammanhängande.

Terminologi Komplett graf: Inga loopar. I övrigt så många kanter som möjligt.

Terminologi Tät graf: E = Θ( V 2 ). Annars gles.

Är grafer av följande typ täta?....

Datastrukturer

Grannmatriser Kvadratisk matris med V 2 element. Elementen kan t ex vara true/false. Tar stor plats om grafen är gles. Gå igenom en nods direkta efterföljare: Θ( V ). Gå igenom alla noders direkta efterföljare: Θ( V 2 ). Avgöra om det finns en kant från u till v: Θ(1). Antagande ovan: En nods index kan beräknas på konstant tid. Kan kanske använda hashtabell: nod index.

Grannlistor En variant: Array av storlek V innehållandes oordnade listor med direkta efterföljare. Ibland också listor med direkta föregångare. Gå igenom en nods direkta efterföljare: O( V ). Gå igenom alla noders direkta efterföljare: Θ( E ). Avgöra om det finns en kant från u till v: O( V ).

Grannlistor En annan variant: Ett objekt per nod. Avbildning (map) från noder till nodobjekt. Objekten innehåller grannlistor med pekare till andra objekt.

Hur stor plats tar en graf representerad som en grannlista? (Anta att etiketter/vikter tar liten plats.) Θ( V ). Θ( E ). Θ( V + E ). Θ( V 2 ).

Topologisk sortering

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. Tillräckligt villkor för att vara cyklisk: Grafen innehåller minst en nod, och 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 (länkad lista) för nod i. r: dynamisk array, d: 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 O(1)

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(1) O( V ) O( E ) ggr O(1)

Topologisk sortering: enkel algoritm (2) r = new empty list O(1) 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(1) O(1) O( E ) ggr O(1) O(1) return r // Nodes, topologically sorted. O(1) 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.

Analysera värstafallstidskomplexiteten. Θ( V ). Θ( E ). Θ( V + E ). Θ( V 2 ). 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 Θ(1) Θ( V + E ) Θ( V ) Θ( V ) ggr Θ(1) Θ(1) Θ( E ) ggr Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) return r // Nodes, topologically sorted. Θ(1)

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 u och v, hitta en kortaste väg från u till v. Givet nod u, för varje nod v, hitta en kortaste väg från u till v. 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)

Fungerar algoritmen för viktade grafer (om + 1 byts ut mot + vikten av kanten från v till v')? Testa! s 4 s 4 A: 1 2 3 B: 1 2 0. 2. 2

Viktade grafer

Viktade grafer: Dijkstras algoritm Observation: Kan behöva uppdatera kostnader flera gånger. Antagande: Inga negativa vikter. Grundidé: Anta 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 eller 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.

Ger Dijkstras algoritm rätt svar för följande grafer? 1 A: ṡ.. -2 B: s.. -2 1 2 3

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