Hjemmeside Nyheter Forelesningsplan Oppgaver Eksempler Pensumliste |
Algoritmer og datastrukturerØvingsoppgaver: Grafer[Løsningsforslag]Oppgave 1Anta at en referanse (en peker) og et heltall krever like mye plass i maskinens hukommelse, f.eks. 32 bit med RAM, og la dataene i hver node i en graf være et enkelt heltall.
Oppgave 2Følgende rettede og vektede graf er gitt:
De 8 nodene i grafen er S, A-F og T. Lengden/vekten på hver kant er et heltall angitt i sirkelen midt på kanten. Nodene er nummerert slik:
S:0 A:1 B:2 C:3 D:4 E:5 F:6 T:7 Grafen skal traverseres med start i noden S.
Oppgave 3Anta at en dybde-først traversering, slik som den er beskrevet for grafer, skal brukes på et binært søketre, og at høyre subtre til en node oppsøkes før venstre subtre. I hvilken rekkefølge vil nodene i treet oppsøkes?Oppgave 4Programmer en iterativ versjon av dybde-først traversering. Her kan du ta utgangspunkt i koden som ble vist på forelesning.Den iterative versjonen av DFS kan lages ganske enkelt ved å bytte ut køen som brukes i BFS med en stack, og bare gjøre et par andre små endringer. Oppgave 5I denne oppgaven skal det brukes den samme grafen som i oppgave 2 ovenfor.Dijkstra's algoritme skal brukes for å finne korteste vei fra noden S til alle de 7 andre nodene. Vi vet at Dijkstra finner korteste vei til én ny node i hver iterasjon. Sett opp en oversiktlig tabell som viser forløpet av Dijkstra's algoritme på denne grafen. Hver rad i tabellen skal vise tilstanden etter en iterasjon og skal angi:
Oppgave 6Skriv om koden for Dijkstras algoritme, slik at den også lagrer og skriver ut alle noder langs den korteste veien fra startnoden til hver node i grafen.Oppgave 7Skriv om koden for Dijkstras algoritme, slik at den bruker en min-heap til å lagre hittil korteste avstand til nodene. Algoritmen vil da bli mer effektiv, med en kjøretid som er O(n log(n)).Det skal brukes en heap som lagrer klasseobjekter som inneholder både nodenummeret og avstanden til noden, for alle noder som vi ikke har funnet korteste avstand til ennå. Programmer denne heapen først, med utgangspunkt i koden for en heap med enkle heltall. Det må her legges til en ny metode i tillegg til metodene for innsetting og fjerning av minste verdi, som kan brukes til å endre verdien for en node som allerede ligger i heapen. For at denne metoden skal bli O(log (n)), må det brukes en ekstra array, som til enhver tid inneholder indeksen i heapen der hver node i grafen er lagret. Skriv deretter en ny versjon av Dijkstra som i hvert steg bruker denne heapen til å finne noden med kortest avstand til startnoden. Oppgave 8Dette er en tidligere eksamensoppgave.I en vektet, rettet graf er nodene representert slik: class node { int ant_naboer; // Antall naboer int nabo[]; // Nodenummere for alle direkte naboer int lengde[]; // Kantlengder };Arrayene nabo og lengde i hver node inneholder informasjon om de direkte forbindelsene noden har til andre noder i grafen. Hvis f.eks. nabo[0] er lik 2 og lengde[0] er lik 5 i en node, betyr det at det går en kant av lengde 5 fra denne noden til node nummer 2. Alle kanter i grafen har lengder større enn 0 (null). Det finnes maksimalt N noder i grafen (N er en globalt definert konstant), nummerert fra 0 til N-1. Hele grafen er lagret i en array graf med nodeobjekter: node graf[];Arrayen graf har lengde lik N. Informasjonen om node nummer i ligger lagret i graf[i]. I de videre oppgavene kan du anta at grafen ligger ferdig lagret i denne arrayen.
Jan Høiberg |