Föreläsning 7 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 5: Grafer Del 1

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

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

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

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 5 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 8. Maps 1

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

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

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 13 Datastrukturer (DAT037)

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

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

Föreläsning 13 Datastrukturer (DAT037)

Föreläsningsanteckningar F6

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

Dugga Datastrukturer (DAT036)

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

Lösningar Datastrukturer TDA

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

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

Trädstrukturer och grafer

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

TNK049 Optimeringslära

Tentamen Datastrukturer (DAT037)

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

FÖRELÄSNING 11 DATALOGI I

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

Föreläsning 10 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 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å

Graphs (chapter 14) 1

Kapitel 9: Grafalgoritmer

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

Trafiksimulering: Grafalgoritmer

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Datastrukturer och Algoritmer D0041D

Föreläsning 1 Datastrukturer (DAT037)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Datastrukturer. föreläsning 7. Maps 1

Tentamen Datastrukturer, DAT037 (DAT036)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 11 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 036/DIT960

Exempeltenta GruDat 2002/2003

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

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

729G04 - Diskret matematik. Lektion 4

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

N = {i}: noder (hörn) Graf: G = (N, B) Definitioner. Väg: Sekvens av angränsande bågar. Cykel: Väg som startar och slutar i samma nod.

Tentamen kl Uppgift 4. Uppgift 5

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

Algoritmer, datastrukturer och komplexitet

Datastrukturer. Sammanfattning och Referenshäfte. Guldbrand, Eric Johansson, Algot

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)

Algoritmer och datastrukturer, föreläsning 11

Föreläsning 3 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Övning 3 - Tillämpad datalogi 2012

Föreläsning 4: Kombinatorisk sökning

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

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

Tentamen Datastrukturer (DAT036)

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

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

729G04 - Diskret matematik. Lektion 4

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Tentamen i Algoritmer & Datastrukturer i Java

Träd. Sats. Grafer. Definition. En fullständig graf har en båge mellan varje par av noder. Definition

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Lösningsförslag till tentamen Datastrukturer, DAT037,

Transkript:

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

Förra gången: hashtabeller grafer definitioner representationer kortaste väg för oviktad graf Idag: kortaste vägen (Dijkstras algoritm) minimala uppspännande träd (Prims och Kruskals algoritm) djupet-först-genomlöpning

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. Visar sig naturligt att lösa den mittersta varianten ovan.

Oviktade grafer: bredden först-sökning I algoritmen på nästa slide: d lagrar kortaste kända vägen till alla noder. p lagrar föregående nod för kortaste vägen. q är en kö som bestämmer besöksordningen av noder.

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.

I algoritmen på nästa slide: d lagrar hittills kortaste vägen till alla noder. p lagrar föregående nod för hittills kortaste vägen. k lagrar om kortaste vägen till noden är känd.

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 until no unknown node v' satisfies d[v'] < 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 ). (Antagande: Viktoperationer tar konstant tid.)

d = empty map from node indices (by default ) p = empty map from node indices k = empty set of node indices q = new empty priority queue d[s] = 0 q.insert(s, 0) while q is non-empty do v = q.delete-min() if v not in k then insert v into k for each direct successor v' of v do if (v' not in k) 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ö (binär heap eller leftistheap): Om d, p och k är arrayer: O( V + 2 E log E ) = O( V + E log V ). Med vissa andra avbildnings- och mängddatastrukturer: O( E log V ). För täta grafer med E = Θ( V 2 ): O( V 2 log V ).

Viktade grafer: Dijkstras algoritm Kan också använda decrease-key: Dubbletter i kön undviks. O( E log V ).

Giriga algoritmer Girig algoritm: Varje steg baserat på det som verkar bäst just nu.

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

Minsta uppspännande träd

Fritt träd (träd utan rot) Sammanhängande, acyklisk, oriktad graf.

Uppspännande träd Träd som är delgraf och innehåller alla noder. Minsta uppspännande träd (MST) Uppspännande träd vars totala (kant)vikt är vikten av alla andra uppspännande träd.

Minsta uppspännande träd Några tillämpningar: Konstruktion av nätverk. Klusteranalys. Bildsegmentering. Och mycket annat.

Minsta uppspännande träd Några egenskaper: Existerar omm grafen är sammanhängande. Lägger man till en kant får man en cyklisk graf med exakt en cykel. Tar man sedan bort en kant från cykeln får man ett uppspännande träd.

Prims algoritm Väldigt lik Dijkstras algoritm. Båda giriga algoritmer. Lägger till billigaste nya noden. Dijkstra: Minsta avståndet från startnoden. Prim: Minsta avståndet från gammal nod.

Vad är den totala vikten av följande två grafers minsta uppspännande träd? 4 2 5. 1 6 3 10 11 9 1 8 3 7 4. 2 5 6

Prims algoritm (för icketom graf) Done = new set containing arbitrary node s ToDo = V { s } T = new empty set // MST för noder i Done. while ToDo is non-empty do if no edge connects Done and ToDo then raise error: graph not connected (u,v) = cheapest edge connecting Done and ToDo (u Done, v ToDo) Done = Done { v } ToDo = ToDo { v } T = T { (u,v) } return T // Bara kanterna.

Prims algoritm: korrekthet Algoritmen ger ett uppspännande träd eller, om grafen ej är sammanhängande, ett felmeddelande: Invariant: T är ett uppspännande träd för noderna i Done. Invarianten håller i början: Trädet med noden s och inga kanter spänner upp { s }. Invarianten bevaras: Lägger alltid till ny nod, aldrig cykel. (Om felmeddelande: ej sammanhängande.) När vi kör return T så är Done = V.

Prims algoritm: korrekthet Algoritmen ger ett MST (om det finns något): Invariant: T är ett delträd av något MST. Invarianten håller i början: Det tomma trädet är ett delträd av alla MST. Invarianten bevaras: Antagande: T är ett delträd av något MST. Visa (för k = (u, v)): T { k } är ett delträd av något MST.

Prims algoritm: korrekthet Antagande: T delträd av MST M. Visa: T { k } delträd av något MST. Klara om k M. Annars finns cykel C med k C och C { k } M. Betrakta mängden K = C (T { k }). k förbinder Done och ToDo, T gör det inte, C är en cykel en kant k K förbinder Done och ToDo. k är minst lika dyr som k. T { k } delträd av (M { k }) { k } (som är ett MST).