Föreläsning 8 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

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

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

Föreläsning 5: Grafer Del 1

Tentamen Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

Graphs (chapter 14) 1

Tentamen Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 8. Maps 1

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Trädstrukturer och grafer

Lösningar Datastrukturer TDA

Tentamen Datastrukturer (DAT037)

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

Algoritmer, datastrukturer och komplexitet

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Algoritmer, datastrukturer och komplexitet

Föreläsning 2 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 1 Datastrukturer (DAT037)

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

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (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å

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

Datastrukturer. föreläsning 9. Maps 1

Tentamen i Algoritmer & Datastrukturer i Java

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

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

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

FÖRELÄSNING 11 DATALOGI I

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

Näst nästa gång: Nästa gång: mer grafer (kap 10) Grafer 1 1. ! uppspännande träd. ! minimala uppspännande träd. ! Prims algoritm. !

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

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

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

Algoritmer och datastrukturer, föreläsning 11

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Datastrukturer. föreläsning 7. Maps 1

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

träd dag graf båge och vikt Grafer definitioner och terminologi

Sökning och sortering

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

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

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning 3 Datastrukturer (DAT037)

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

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

Kapitel 9: Grafalgoritmer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Algoritmer, datastrukturer och komplexitet

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

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Tentamen Datastrukturer för D2 DAT 035

Föreläsning 2 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 036/DIT960

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

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

Datastrukturer. föreläsning 10. Maps 1

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

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

Tommy Färnqvist, IDA, Linköpings universitet

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 4: Kombinatorisk sökning

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Transkript:

Föreläsning 8 Datastrukturer (DAT037) Fredrik Lindblad 1 22 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 1

Innehåll 2 djupet först-sökning topologisk sortering starkt sammanhängande komponenter

3 Djupet förstsökning

Djupet först-sökning (DFS) 4 Metod för att gå igenom alla noder och kanter. Har tidigare sett bredden först-sökning (kortaste vägen för oviktade grafer). Fungerar för oriktade och riktade grafer.

Djupet först-sökning: mall visited = new array with indices {0,, V -1} and all elements equal to false // Startar/startar om sökning. for v {0,, V -1} do if not visited[v] then dfs(v) // Utför sökning. dfs(v) { visited[v] = true } for w {w (v, w) E} do if not visited[w] then dfs(w) 5

Djupet först-sökning: mall visited = new array with indices {0,, V -1} and all elements equal to false Θ( V ) // Startar/startar om sökning. for v {0,, V -1} do if not visited[v] then dfs(v) // Utför sökning. dfs(v) { visited[v] = true Θ( V ) ggr Θ( V ) ggr } for w {w (v, w) E} do if not visited[w] then dfs(w) Θ( E ) ggr tot 5

Djupet först-sökning 6 Tidskomplexitet: Θ( V + E ) (linjär).

Uppspännande skog 7 Depth-first spanning forest: Skog: Mängd av träd. Ett träd för varje toppnivåanrop till dfs. Rekursiva anrop till dfs ger upphov till vanliga trädkanter. Om visited[w] = true får man istället en speciell kant: Bakåtkant: Om kanten pekar uppåt (eller på samma nod). Framåtkant: Om kanten pekar nedåt. Tvärkant: I övriga fall ( åt vänster ).

Uppspännande skog Graf: 1. 0 2 4 3 Skog (om vi söker från 0, 1 och 4, och väljer 2 före 3): 0. 1 4 5 2 5 3 8

Djupet först-sökning 9 DFS kan användas för att implementera andra algoritmer. Exempel: Är en oriktad graf sammanhängande? Testa om DFS från godtycklig nod besöker alla noder (utan omstart).

Sammanhängande? 10 if V = 0 then return true visited = new array with indices {0,, V -1} and all elements equal to false dfs(0) for v {1,, V -1} do if not visited[v] then return false return true dfs(v) { visited[v] = true for w {w {v, w} E} do if not visited[w] then dfs(w) }

11 Topologisk sortering

Topologisk sortering 12 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 13 Ointressant för oriktade grafer. Cykel ingen topologisk sortering. DAGs (riktade acykliska 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 14 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 14 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) 15 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 16 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 17 Exempel: // d ä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. d = new array of size V // Initialisera d. for i in [0,..., V -1] do d[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do d[j]++

Pseudokod 17 Exempel: // d ä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. d = new array of size V // Initialisera d. for i in [0,..., V -1] do d[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do d[j]++ O( V ) ggr O(1)

Pseudokod 17 Exempel: // d ä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. d = new array of size V // Initialisera d. for i in [0,..., V -1] do d[i] = 0 for i in [0,..., V -1] do for each direct successor j of i do d[j]++ O( V ) ggr O(1) O( V ) O( E ) ggr tot O(1)

Topologisk sortering: enkel algoritm (2) r = new empty list O(1) d = initiera d enligt koden på föreg. s. 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 tot O(1) O(1) return r // Nodes, topologically sorted. O(1) Totalt: O( V 2 + E ) = O( V 2 ). 18

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. 19

20 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ö?

20 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ö? Svar: O( V + E ). Bonusövning: Fungerar också, samma tidskomplexitet, ev annan ordning.

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 ) O( V ) O( V ) ggr Θ(1) Θ(1) O( E ) ggr tot Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) return r // Nodes, topologically sorted. Θ(1) 21

Topologisk sortering 22 Kan sortera DAG topologiskt genom att: Utföra DFS. Gå igenom träden i uppspännande skogen i preordning, med skillnaden att (barn)träden gås igenom från höger till vänster. Om grafen kan vara cyklisk så är det inte så lätt att avgöra det. Måste hålla koll på om uppåt- eller tvärkanter uppstår.

23 Starkt sammanhängande komponenter

Starkt sammanhängande komponenter 24 För riktade grafer: Starkt sammanhängande graf: Om u, v V så finns det en väg från u till v (och vice versa). Starkt sammanhängande komponent (SCC): Maximal starkt sammanhängande delgraf. Om varje SCC byts ut mot en ny nod (en per SCC) får vi en acyklisk multigraf.

Starkt sammanhängande komponenter 25 Exempel: Noder: Funktioner. Kanter: Anrop från en funktion till en annan. Funktioner i en SCC är ömsesidigt rekursiva.

26 Hur många starkt sammanhängande komponenter innehåller följande graf? 1 6 0. 2 3 4 5 7. 8 9

26 Hur många starkt sammanhängande komponenter innehåller följande graf? 1 6 0. 2 3 4 5 7. 8 9 Svar: 6

SCC-algoritm 27 Kan vi hitta alla SCCer? Kan hitta alla noder i löv-scc genom DFS (utan omstart) från någon av dem. Kan sedan ta bort (ignorera) löv-sccn och fortsätta med annan löv-scc. Men hur hittar man löv-sccer?

SCC-algoritm 28 Utför DFS, gå igenom uppspännande skogen i preordning, från höger till vänster, som i topologisk sortering: Första noden (om någon) måste höra till en rot-scc. Tar man bort alla noder som hör till den SCCn så hör nästa nod (om någon) återigen till en rot-scc. Och så vidare För löv-scc: Utför DFS baklänges (på reverserad graf).

SCC-algoritm 29 1. Utför DFS baklänges. 2. Skapa en nodlista med preorderrl. 3. Utför DFS framlänges, börja hela tiden med första obesökta listnoden. Varje sökning ger en SCC. Tidskomplexitet: Θ( V + E ).