Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

Like dokumenter
Det første grafteoretiske problem: Broene i Königsberg

INF Algoritmer og datastrukturer

GRAFER. Hva er en graf? Det første grafteoretiske problem: Broene i Königsberg. Grafer vi har sett allerede

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer GRAFER

Grunnleggende Grafteori

INF Algoritmer og datastrukturer

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

GRAFER. Noen grafdefinisjoner. Korteste vei i en uvektet graf V 2 V 1 V 5 V 3 V 4 V 6

Korteste vei i en vektet graf uten negative kanter

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 10

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

INF Algoritmer og datastrukturer

Anvendelser av grafer

TMA4140 Diskret Matematikk Høst 2016

Anvendelser av grafer

INF Algoritmer og datastrukturer

Repetisjon og mer motivasjon. MAT1030 Diskret matematikk. Repetisjon og mer motivasjon

Forelesning 23. MAT1030 Diskret Matematikk. Repetisjon og mer motivasjon. Repetisjon og mer motivasjon. Forelesning 23: Grafteori.

Introduksjon. MAT1030 Diskret Matematikk. Introduksjon. En graf. Forelesning 22: Grafteori. Roger Antonsen

Introduksjon. MAT1030 Diskret matematikk. Søkealgoritmer for grafer. En graf

MAT1030 Diskret matematikk

Grafteori. MAT1030 Diskret Matematikk. Repetisjon og mer motivasjon. Repetisjon og mer motivasjon. Forelesning 23: Grafteori.

Rettede, ikke-sykliske grafer (DAG)

MAT1030 Diskret Matematikk

Kombinatorikk. MAT1030 Diskret Matematikk. Oppsummering av regneprinsipper

MAT1030 Diskret Matematikk

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

MAT1030 Forelesning 22

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Grunnleggende Grafalgoritmer

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

MAT1030 Forelesning 23

Løsnings forslag i java In115, Våren 1999

Vi skal se på grafalgoritmer for:

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

Uretta grafar (1) Mengde nodar Mengde kantar som er eit uordna par av nodar

MAT1030 Forelesning 22

Vi skal se på grafalgoritmer for:

INF Algoritmer og datastrukturer

Algoritmer og datastrukturer Løsningsforslag

Løsnings forslag i java In115, Våren 1996

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Dijkstras algoritme Spørsmål

København 20 Stockholm

INF Algoritmer og datastrukturer

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Oppgave 1. Sekvenser (20%)

UNIVERSITETET I OSLO

IN Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Notater til INF2220 Eksamen

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Grunnleggende Grafalgoritmer II

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Algoritmer og Datastrukturer

EKSAMEN med løsningsforslag

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Obligatorisk oppgave 2 - inf

Disjunkte mengder ADT

Innhold uke 10. Objektorientert programmering i Python. Oblig 7 og 8. IN1000 Seminar! IN1000 Høst 2018 uke 10 Siri Moe Jensen

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Roger Antonsen

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

INF1020 Algoritmer og datastrukturer GRAFER

LO118D Forelesning 9 (DM)

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

MAT1030 Diskret matematikk

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Løsnings forslag i java In115, Våren 1998

Kap 9 Tre Sist oppdatert 15.03

Grafalgoritmer: Korteste vei

UNIVERSITETET I OSLO

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

MAT1140: Kort sammendrag av grafteorien

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

IN Algoritmer og datastrukturer

Vektede grafer. MAT1030 Diskret matematikk. En kommunegraf. En kommunegraf. Oppgave

Kompleksitet og Beregnbarhet

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Transkript:

Dagens plan: INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 6: Grafer Definisjon av en graf Grafvarianter Intern representasjon av grafer Topologisk sortering Korteste vei en-til-alle uvektet graf M.A.W. Data Structures and Problem Solving kap. 14 M.A.W. Data Structures and Algorithm Analsis kap. 9 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 1 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 2 / 1 Det første grafteoretiske problem: Broene i Königsberg Grafer vi har sett allerede Er det mulig å ta en spasertur som krsser hver av broene nøaktig en gang? Labrint Dette problemet ble løst av Euler allerede i 1736! Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 3 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 4 / 1

Grafer vi har sett allerede Trær B A C Hva er en graf? En graf G =(V,E) har en mengde noder, V, og en mengde kanter, E V og E er henholdsvis antall noder og antall kanter i grafen Hver kant er et par av noder, dvs. (u, v) slik at u, v V En kant (u, v) modellerer at u er relatert til v Dersom nodeparet i kanten (u, v) er ordnet (dvs. at rekkefølgen har betdning), sier vi at grafen er rettet, i motsatt fall er den urettet D E F G H I J Grafer er den mest fleksible datastrukturen vi kjenner ( alt kan modelleres med grafer) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 5 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 6 / 1 Hvorfor grafer? De dukker opp i veldig mange problemer i hverdagslivet: Grafer: Definisjoner og varianter Node er nabo-node (eller etterfølger) til node dersom (, ) E Flplassstemer Datanettverk Trafikkflt Ruteplanlegging VLSI (chip design) og mange flere... Grafalgoritmer viser veldig godt hvor viktig valg av datastruktur er mhp. tidsforbruk Det finnes grunnleggende algoritmeteknikker som løser mange ikke-trivielle problemer raskt En graf er vektet dersom hver kant har en tredje komponent, kalt kost eller vekt 2 9 5 z Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 7 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 8 / 1

En vei (eller sti) i en graf er en sekvens av noder v 1, v 2, v 3,...,v n slik at (v i, v i+1 ) E for 1 i n 1 Lengden til veien er lik antall kanter på veien, dvs. n 1 w z <z, w, > er en vei med lengde 2 Kosten til en vei er summene av vektene langs veien 1 z <z, w, > er en vei med kost 7 5 w 2 En vei er enkel dersom alle nodene (untatt muligens første og siste) på veien er forskjellige Våre grafer har vanligvis ikke loops, (v, v), eller multikanter (to like kanter): En løkke (skel) i en rettet graf er en vei med lengde 1 slik at v 1 = v n. Løkken er enkel dersom stien er enkel I en urettet graf må også alle kanter i løkken være forskjellige Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 9 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 10 / 1 En rettet graf er asklisk dersom den ikke har noen løkker En rettet, asklisk graf blir ofte kalt en DAG (Directed, Acclic Graf) En urettet graf er sammenhengende dersom det er en vei fra hver node til alle andre noder En rettet graf er sterkt sammenhengende dersom det er en vei fra hver node til alle andre noder En rettet graf er svakt sammenhengende dersom den underliggende urettede grafen er sammenhengende sammenhengende ikke sammenhengende sterkt sammen hengende svakt sammen hengende Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 11 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 12 / 1

Hvordan representere grafer? Graden til en node i en urettet graf er antall kanter mot noden Inngraden til en node i en rettet graf er antall kanter inn til noden Utgraden til en node i en rettet graf er antall kanter ut fra noden. v Grad(v)=3 v Inngrad(v)=1 Utgrad(v)=4 Kan organisere strukturen etter noder og/eller etter kanter... Merk: Boka bentter eksplisitte datastrukturer for kantene. Dette gir (ofte) effektivitetsgevinst. For enkelhets skld gjør vi ikke det på foilene... Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 13 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 14 / 1 Nabo-matrise (adjacenc matri) Nabo-liste (adhacenc list) Bra hvis tett graf, dvs. E = Θ( V 2 ) Det tar O( V ) tid å finne alle naboer Bra hvis tnn ( sparse ) graf Tar O(Utgrad(v)) tid å finne alle naboer til v De fleste grafer i det virkelige liv er tnne! Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 15 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 16 / 1

Objekter & arra class Node { int antallnaboer ; Node [ ] e t t e r f ; double [ ] vekt ; Node( int kapasitet ) { e t t e r f = new Node [ kapasitet ] ; vekt = new double [ kapasitet ] ; antallnaboer = 0; I Java kan grafer også representeres ved en kombinasjon av node-objekter og etterfølgerarraer Arralengden kan være en parameter til node-klassens constructor Da må vi vite antall etterfølgere når vi genererer noden Eventuelt kan vi estimere en øvre grense og la siste del av arraen være tom Vi trenger da en variabel som sier hvor mange etterfølgere en node faktisk har Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 17 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 18 / 1 Topologisk sortering En topologisk sortering er en ordning (rekkefølge) av noder i en DAG slik at dersom det finnes en vei fra v i til v j, så kommer v j etter v i i ordningen Topologisk sortering er umulig hvis grafen har en løkke Vanligvis er det flere mulige løsninger Eksempel: forutsetter/bgger på graf MA100/ MA001 IN105 IN102 IN115 IN114 En liten del av Ifis kursplan i 1999 IN212 IN394 Følgende enkle algoritme finner en topologisk sortering (hvis det er noen): 1. Finn en node med inngrad = 0 2. Skriv ut noden, og fjern noden og utkantene fra grafen (marker noden som ferdig og reduser inngraden til nabonodene) 3. Gå tilbake til punkt 1 Eksempel: En topologisk sortering er en lovlig rekkefølge å ta alle kursene på Ifi i MA108 MA IN 118 IN147 IN211 IN210 IN310 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 19 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 20 / 1

Algoritme for topologisk sortering void topsort () { Node v ; for ( int t e l l e r = 0; t e l l e r < ANTALL NODER; t e l l e r ++) { v = finnnnodemedinngradnull ( ) ; i f ( v == n u l l ) { e r r o r ( Løkke funnet! ) ; else { < Skriv ut v som node t e l l e r > for < hver nabo w t i l v > { w. inngrad ; En forbedring er å holde alle noder med inngrad=0 i en boks. Boksen kan implementeres som en stakk eller en kø: 1. Plasser alle nodene med inngrad=0 i boksen. 2. Ta ut en node v fra boksen. 3. Skriv ut v. 4. Fjern v fra grafen og reduserer inngraden til alle etterfølgerne. 5. Dersom noen av etterfølgerne får inngrad=0, settes de inn i boksen. 6. Gå tilbake til punkt 2. Denne algoritmen er O( V 2 ) siden finnnnodemedinngradnull ser gjennom hele node/inngrad-tabellen hver gang Unødvendig: bare noen få av verdiene kommer ned til 0 hver gang Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 21 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 22 / 1 Forbedret algoritme void topsort () { Kø k = new Kø ( ) ; Node v ; int t e l l e r = 0; for < hver node v > i f ( v. inngrad == 0) k. s e t t I n n ( v ) ; while (! k. isempt ()) { v = k. taut ( ) ; < Skriv ut v >; t e l l e r ++; Forutsatt at vi bruker nabolister, er denne algoritmen O( V + E ). Kø/stakk-operasjoner tar konstant tid, og hver node og hver kant blir bare behandlet én gang. for < hver nabo w t i l v > { w. inngrad ; i f (w. inngrad == 0) k. s e t t I n n (w) ; i f ( t e l l e r < ANTALL NODER) e r r o r ( Løkke funnet! ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 23 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 24 / 1

Korteste vei, en-til-alle I korteste vei problemet (en-til-alle) har vi gitt en (muligens vektet) graf G=(V,E) og en node s. Vi ønsker å finne den korteste veien (evt. med vekter) fra s til alle andre noder i G. Korteste vei fra z til uten vekt er 1. Korteste vei fra z til med vekt er 7 (via ). 2 9 5 z Negative vekter (kost) i løkker kan skape problemer: 12 5 5 Hvor me koster korteste vei fra til z? z (Vi skal senere se på korteste vei alle-til-alle, slik som i NAFs veibok) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 25 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 26 / 1 Korteste vei i en uvektet graf Korteste vei fra s til t i en uvektet graf er lik veien som bruker færrest antall kanter. V 3 V 1 V 6 V 4 (Det tilsvarer at alle kanter har vekt=1) V 2 V 7 V 5 Følgende bredde-først algoritme løser problemet for en node s i en uvektet graf G: 1. Marker at lengden fra s til s er lik 0. (Merk at s foreløpig er den eneste noden som er markert.) 2. Finn alle etterfølgere til s. Marker disse med avstand 1. 3. Finn alle umarkerte etterfølgere til nodene som er på avstand 1. Marker disse med avstand 2. 4. Finn alle umarkerte etterfølgere til nodene som er på avstand 2. Marker disse med avstand 3. 5. Fortsett til alle noder er markert, eller vi ikke har noen umarkerte etterfølgere. Finnes det fortsatt umarkerte noder, kan ikke hele G nåes fra s. Hvis G er urettet, skjer dette hvis og bare hvis G er usammenhengende. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 27 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 28 / 1

Vi kan finne den korteste veien ved å sette bakoverpekere ( vei ) til den noden som oppdaget oss void uvektet (Node s ) { for < hver node v > { v. avstand = UENDELIG; v. kjent = f a l s e ; s. avstand = 0; for ( int d i s t = 0; d i s t < ANTALL NODER; d i s t++) { for < hver node v > { i f (! v. kjent && v. avstand == d i s t ) { v. kjent = true ; for < hver nabo w t i l v > { i f (w. avstand == UENDELIG) { w. avstand = d i s t + 1; w. vei = v ; Hovedløkken vil som oftest fortsette etter at alle noder er merket, men den vil terminere selv om ikke alle noder kan nåes fra s. Tidsforbruket er O( V 2 ). Vi sparer tid ved å bentte en kø av noder. Vi begnner med å legge s inn i køen. Så lenge køen ikke er tom, tar vi ut første node i køen, behandler denne og legger dens etterfølgere inn bakerst i køen. Da blir s behandlet først. Så blir alle noder i avstand 1 behandlet før alle i avstand 2, før alle i avstand 3... Denne strategien ligner på bredde først traversering av trær (først rotnoden, så alle noder på nivå 1, så alle noder på nivå 2, osv). Tidsforbruket blir O( E + V ) fordi køoperasjoner tar konstant tid og hver kant og hver node bare blir behandlet én gang. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 29 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 30 / 1 Korteste uvektet vei fra node s void uvektet (Node s ) { Kø k = new Kø ( ) ; Node v ; for < hver node n > n. avstand = UENDELIG; s. avstand = 0; k. s e t t I n n ( s ) ; while (! k. isempt ()) { v = k. taut ( ) ; for < hver nabo w t i l v > { i f (w. avstand == UENDELIG) { w. avstand = v. avstand + 1; w. vei = v ; k. s e t t I n n (w) ; Bruken av kø gjør attributtet kjent overflødig. Forutsatt at vi bruker nabolister, er denne algoritmen O( V + E ). Kø-operasjoner tar konstant tid, og hver node og hver kant blir behandlet bare én gang. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 31 / 1