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

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

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

København 20 Stockholm

Algoritmer og Datastrukturer

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

EKSAMEN med løsningsforslag

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Oppgave 1. Sekvenser (20%)

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

EKSAMEN. Algoritmer og datastrukturer

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

INF2220: Time 12 - Sortering

Binær heap. En heap er et komplett binært tre:

Algoritmer og Datastrukturer

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Obligatorisk oppgave 1 INF1020 h2005

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Algoritmer og datastrukturer Løsningsforslag

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Algoritmer og datastrukturer Eksamen

Algoritmer og Datastrukturer

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

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

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

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

UNIVERSITETET I OSLO

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

INF2220: Forelesning 2

Definisjon av binært søketre

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

Notater til INF2220 Eksamen

1 Hver node er enten rød eller sort. 2 Rota er sort. 3 En rød node kan bare ha sorte barn

INF Algoritmer og datastrukturer

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

INF1010 notat: Binærsøking og quicksort

INF1010 Binære søketrær ++

Løsningsforslag til INF110 h2001

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

INF1020 Algoritmer og datastrukturer GRAFER

Løsningsforslag eksamen INF1020 høsten 2005

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

INF1020 Algoritmer og datastrukturer GRAFER

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

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

UNIVERSITETET I OSLO

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

INF Algoritmer og datastrukturer

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Korteste vei i en vektet graf uten negative kanter

UNIVERSITETET I OSLO

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

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

Algoritmer og datastrukturer Eksamen

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Algoritmer og Datastrukturer

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

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

Kap 9 Tre Sist oppdatert 15.03

Quicksort. Fra idé til algoritme.

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB / 2EA / DESY )

Algoritmer og datastrukturer Løsningsforslag

Definisjon: Et sortert tre

Grunnleggende Grafteori

Øvingsforelesning 6. Sorteringsalgoritmer. Martin Kirkholt Melhus Basert på foiler av Kristian Veøy 30/09/14 1

PG4200 Algoritmer og datastrukturer Forelesning 10

Norsk informatikkolympiade runde

Transkript:

Oppgave 1 1 a IN2220 Algoritmer og datastrukturer orelesning 13: Gjennomgang av eksamen vår 2001 Arild Waaler Institutt for informatikk, Universitetet i Oslo Oppgave 1 a Programmer en ikke-rekursiv metode som returnerer antall forekomster av tallet n i et binært søketre med rot t. int antall( BinNode t, int n ) { int i = 0; BinNode peker = t; 10. november 200 while ( peker!= null ) { if ( peker.data == n ) i++; if ( peker.data <= n ) peker = peker.vsub; else peker = peker.hsub; return i; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 2 / 47 Oppgave 1 b Oppgave 1 1 b Oppgave 1 1 b Programmer en metode som returnerer true dersom treet med rot t er et binært søketre i henhold til definisjonen over og false ellers. Trikset er å unngå at følgende tre kommer ut som et binært søketre: 2 4 3 6 5 Løsning: Angi et intervall av lovlige verdier inn til metoden. boolean bst( BinNode t ) { return bst( t, -UENDELIG, UENDELIG ); boolean bst( BinNode t, int min, int max ) { if( t == null ) return true; int d = t.data; if( d < min d > max ) return false; return( bst( t.vsub, min, d ) && bst( t.hsub, d+1, max ) ); Det er ikke tilstrekkelig å kun teste en nodes verdier lokalt mot verdiene til barna (som vi gjør når vi setter inn i et binært søketre). Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 3 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 4 / 47

Oppgave 1 c Oppgave 1 1 c Programmer en metode som gir en sortert utskrift av alle verdiene i treet med rot t som er i intervallet fra og med min til og med max. Du skal ikke skrive ut samme tall mer enn en gang. Legg vekt på at metoden skal være så rask som mulig. Angi kompleksitet. Oppgave 1 1 c 4 4 6 Oppgaven løses elegant med infiks-traversering samtidig med at vi minker intervallet av tall som skal skrives ut. void skrivintervall( BinNode t, int min, int max ) { if( t == null max < min ) return; int d = t.data; if( d > min ) skrivintervall( t.vsub, min, d-1 ); if( d >= min && d <= max ) System.out.println( t.data ); if( d < max ) skrivintervall( t.hsub, d+1, max ); 3 4 Anta at 4 ligger i intervallet. I treet vil den øverste 4 verdien skrives ut. Den midterste 4 noden vil besøkes, men ikke skrives ut. Den nederste noden med 4 vil ikke besøkes i traverseringen Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 5 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 6 / 47 Oppgave 1 1 c Oppgave 1 1 d Oppgave 1 d Alternativ løsning: la metoden returnere den høyeste verdi som har blitt skrevet ut traverser hele treet inntil det besøkes en node med tall utenfor intervallet I treet over vil da den nederste 4 noden skrives ut, men hele treet vil besøkes (hvis alle nodene ligger i intervallet) Selv om den første løsningen i noen tilfeller vil avskjære søkerommet mest, vil begge løsningene være lineære, dvs. O(n), der n er antall noder i treet. Et binærtre er komplett dersom hvert nivå i treet er fullt, med et mulig unntak for det laveste nivået, som skal være fylt fra venstre mot høyre. Programmer en boolsk metode boolean komplett( BinNode t ) som returnerer true dersom treet med rot t er komplett og false ellers. Oppgaven kan løses både ved bredde-først og dybde-først traversering. Viktig å lage figurer og analysere Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 7 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 / 47

Oppgave 1 1 d Oppgave 1 1 d Oppgave 1 d: Observasjon Det finnes fire muligheter for strukturen til en node i et binærtre. En node kan ha a ingen barn, b venstre barn, men ikke høyre barn, c høyre barn, men ikke venstre barn, d to barn. Merk at: Tilfellet c er uforenelig med at treet er komplett. Hvis treet er komplett og tilfelle a eller b inntreffer når vi går bredde først fra venstre mot høyre, må detværefordiviharkommet til nederste nivå i treet. Tilfellet d er uproblematisk når vi søker bredde først gitt at noden kan ha barn. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 9 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 10 / 47 Oppgave 1 1 d Oppgave 1 d: Løsning ved traversering bredde først Koden traverserer treet nivåvis og gjør bruk av en kø-abstraksjon. Hvis a eller b inntreffer, og vi senere besøke noder som har barn, er ikke treet komplett. Ellers er det komplett. En boolsk variabel flagg til true når tilfelle a eller b inntreffer. Metoden returnerer false når vi tar ut en node med barn av køen mens flagget er true. Hvis denne situasjonen aldri inntreffer, returneres true. Koden blir enklere hvis vi behandler null-referanser i køen: class BinNodeQueue { Queue q = new Queue(); void enqueue(binnode node){if(node!=null) q.enqueue(node); BinNode dequeue(){ return (BinNode) q.dequeue(); Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 11 / 47 Oppgave 1 1 d boolean komplett( BinNode t ) { boolean flagg = false; BinNodeQueue q = new BinNodeQueue(); BinNode denne; q.enqueue( t ); while(!q.isempty() ) { denne = q.dequeue(); if( denne.vsub==null && denne.hsub!=null ) return false; if( flagg && denne.vsub!=null ) return false; // (flagg && denne.hsub!= null) har alt gitt false if( denne.vsub==null denne.hsub==null ) flagg = true; q.enqueue( denne.vsub ); q.enqueue( denne.hsub ); // q.isempty() return true; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 12 / 47

Oppgave 1 1 d Oppgave 1 d: Løsning ved traversering dybde først Et tre er rett dersom det er komplett og alle løvnoder ligger på sammenivå halt dersom det er komplett og ikke alle løvnoder ligger på samme nivå. Det tomme treet er rett, mens i et halt tre er det laveste nivåetavnoder ikke fullt, men fylt fra venstre mot høyre. Observasjon: Et tre med rot t er komplett hvis og bare hvis en av følgende betingelser holder: t er null t.vsub er rett med høyde h og t.hsub er enten rett eller halt med høyde enten h eller h 1 t.vsub er halt med høyde h og t.hsub er rett med høyde h 1 Oppgave 1 1 d Vi kan teste betingelsene ved å traversere treet rekursivt postorder. Vi får ekstra kompakt kode ved å definere en integerverdi tag på følgende måte: tag er 0 hvis treet ikke er komplett (2 + høyden) hvis det rett -(1 + høyden) hvis det er halt. Eksempler: tomme trær er rette, har høyde -1 og tag 1 trær med kun en rotnode er rette, har høyde 0 og tag 2 trær med kun en rotnode og et venstre barn er halte, har høyde 1 og tag -2 rette trær med 3 noder har høyde 1 og tag 3 Merk at negative tall fungerer som en signal om at treet er halt. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 13 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 14 / 47 Oppgave 1 1 d boolean komplett( BinNode t ){ return( tag(t)!= 0 ); int tag( BinNode t ) { if( t == null ) return 1; int v = tag( t.vsub ); if ( v == 0 ) return 0; int h = tag( t.hsub ); if ( h == 0 ) return 0; if( v < 0 ) { if( v == -h ) return v - 1; else return 0; if( h < 0 ) { if( v == 1 - h ) return h - 1; else return 0; if( v == h ) return 1 + v; else if ( v == 1+h ) return -v; else return 0; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 15 / 47 Oppgave 2 Oppgave 2 Oppgaven går ut på å lage metoder som skal bli brukt til å generere dagens samtalelogg. Dette er en fil der all samtaleinformasjon er ordnet primært etter kundenummer, sekundært etter start-tidspunkt for samtalene. Logg-fila skal altså begynne med data for den første samtalen til brukeren med lavest kundenummer og skal slutte med data for den siste samtalen til brukeren med høyest kundenummer. Anta at det er K kunder som har transaksjoner en gitt dag og at det er totalt T transaksjoner. Merk at samtalene i arrayen som skal sorteres ligger kronologisk. Dette betyr at de allerede er sortert etter tid, som er det ene kriteriet for sortering. Det gjelder da å sortere arrayen etter knr også på en slik måte at den kronologiske ordningen bevares. Vi sier at en sorteringsmetode som bevarer den kronologiske ordningen når den brukes til å sortere etter knr er stabil. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 16 / 47

Oppgave 2 Oppgave 2 2 a Stabile sorteringsalgoritmer Oppgave 2 a En algoritme er stabil dersom ethvert objekt B som initielt ligger et sted etter et objekt A i inputarrayen også ligger etter A etter sortering hvis B ikke ligger foran A i ordningen som det sorteres etter. Hvis f.eks. A og B er like i henhold til kriteriet for sortering (i oppgaven gjelder det hvis to samtaler har samme knr), skal deres innebyrdes rekkefølge ikke endres under sortering. Innstikksortering (insertion sort) er alltid stabil. lettesortering (mergesort) er stabil hvis flettingen velger objekt fra venstre del av den sorterte subarrayen før den høyre. Quicksort er ikke uten videre er stabil. Programmer en metode som tar inn dagens samtaler som en array av lengde T og returnerer en array av samtaler ordnet som en logg. Stikkord for løsning: Bucket-sort. Bucket-sort tar lineær tid i forhold til antall samtaler, det vil si O(T ). or å bevare den kronologiske ordningen mellom samtale objektene kan vi la hver bøtte være bygget opp som en kø. Køen bør være implementert med en dynamisk struktur siden dette vil utnytte minnet bedre. Etter selve sorteringen, må innholdet i bøttene kopieres over til en array av SamtaleInfo-objekter. Også denne kopieringen tar lineær tid, siden hver samtale kopieres en gang. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 17 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 1 / 47 Oppgave 2 2 a SamtaleInfo[] loggordner( SamtaleInfo[] samtale ) { int index = 0; SamtaleInfo[] logg = new SamtaleInfo[samtale.length]; // Buckets for hver kunde Queue hylle = new Queue[K+1]; // initialiser hyllene for( int i = 1; i <= K; i++ ) hylle[i] = new Queue(); // legg objekter inn i hyllene for ( int i = 0; i < samtale.length; i++ ) hylle[samtale[i].knr()].enqueue( samtale[i] ); // flytt fra hyllene over i loggen for( int i = 1; i <= K; i++ ) while(!hylle[i].isempty() ) logg[index++] = (SamtaleInfo) hylle[i].dequeue(); return logg; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 19 / 47 Oppgave 2 2 b Oppgave 2 b. orslag 1: Hashing Anta nå at selskapet bruker et -sifret telefonnummer som kundenummer. Merk: Siden vi nå ikke lenger kan bruke kundenummerene som indekser i buckets, kan vi ikke lenger bruke Bucket sort direkte. Bruk av hashing innebærer: Vi må hashe kundenummerene over til en array av køer og legge inn objektene som i 2 a. Når vi skal skrive til logg, må vi først sortere arrayen etter kundenummer siden hash-funksjonen vil spre kundenummer fritt over indeksene. krever O(T )forå lese fra arrayen og skrive til logg og O(K log(k)) for å sortere arrayen etter kundenummer. Dermed blir algoritmen O(K log(k)+ T ). Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 20 / 47

Oppgave 2 2 b Oppgave 2 b. orslag 2: Søketre Oppgave 2 2 b Oppgave 2 b. orslag 3: Bruk en stabil sorteringsmetode. Bygg opp et søketre basert på kundenummer. Dataverdiene i en node ligger i en kø (som i Oppgave 2 a). Når vi skal skrive til logg, traverserer vi treet infiks. Detter krever O(T )forå lese fra arrayen og skrive til logg. Oppbyggingen av et binært søketre er O(K log(k)) hvis vi bruker B tre eller et rød-sort tre. Bruker vi et vanlig binært søketre, er oppbyggingen O(K 2 )iverste tilfelle og algoritmen O(K 2 + T ). Siden telefonnummer normalt vil spre seg jevnt over samtalene, kan vi forvente at algoritmen vil eksekvere i O(K log(k)+t ) tid også hvis vi bruker binært søketre. Hvis sorteringsmetoden er n log(n), vil løsningen være O((K + T ) log(k + T )). Merk at invarianten i oppgaven tilsier at vi kan bruke flettesortering. Denne er rask og enkel å gjøre stabil. Det er mulig å bruke quicksort og heapsort også, men disse er vanskeligere å gjøre stabile. Hvis vi skal gjøre det, kan vi ikke sortere bare etter knr feltet, men må inkludere tidsattributtet også. Vi kan da bruke samme type ordning som man bruker i telefonkatalogen, der navnene først ordnes etter etternavn og dernest etter fornavn (her: først etter knr, dernest etter tid). Dette kalles en leksiografisk ordning. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 21 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 22 / 47 Oppgave 2 2 b Implementasjon av en leksiografisk ordning Kode for flettesortering Oppgave 2 2 b I Java kan vi ved å bruke følgende compareto metode for klassen SamtaleInfo: int compareto( Object rhs ) { SamtaleInfo o = (SamtaleInfo ) rhs; if ( knr < o.knr ) return -1; if ( knr == o.knr ) return tid.compareto( o.tid ); return 1; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 23 / 47 SamtaleInfo[] loggordner( SamtaleInfo[] samtale ) { SamtaleInfo[] tmp = new SamtaleInfo[samtale-length]; flettsorter( samtale, tmp, 0, samtale.length - 1 ); return samtale; void flettsorter( SamtaleInfo[] a, SamtaleInfo[] tmp, int lav, int hoy ) { if( lav < hoy ) { int m = ( lav + hoy ) / 2; flettsorter( a, tmp, lav, m ); flettsorter( a, tmp, m + 1, hoy ); flett( a, tmp, lav, m + 1, hoy ); Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 24 / 47

Oppgave 2 2 b void flett( SamtaleInfo[] a, SamtaleInfo[] tmp, int i, int j, int jslutt ) { int islutt = j - 1; int start = i; int k = i; while( i <= islutt && j <= jslutt ) { if( a[i].knr <= a[j].knr ) tmp[k++] = a[i++]; else tmp[k++] = a[j++]; // naa er enten i>islutt eller j>jslutt while( i <= islutt ) tmp[k++] = a[i++]; // kopier tilbake, k er en for stor for( k--; start <= k; k-- ) a[k] = tmp[k]; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 25 / 47 Oppgave 2 c Oppgave 2 2 c Anta nå at internminnet ikke lenger er stort nok til å lagre alle samtalene på en gang. Hvordan vil du endre datastrukturen? Merk at algoritmen må bruke disk til å lagre SamtaleInfo-objekter, og det er essensielt å minimalisere antall diskaksesser. B trær er da et nærliggende valg. Vi kan bruke treet til ålagre telefonnummere og la løvnodene i treet inneholde referanse direkte til diskblokken. Dette vil gi T diskaksesser når fila leses. Dersom det er ledig plass i internminnet, vil en bedre løsning være å utnytte denne til samtale objekter, for så å frigjøre plassen når minnet blir fullt. Dette kan organiseres ved å legge objektene i arrayer tilsvarende blokk størrelsen på disken.når en kunde har objekter som fyller en slik array, kan denne skrives til disk. Pådenmåten kan man skrive flere samtaler til disken i en aksess, og dermed redusere antall aksesser. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 26 / 47 Oppgave 3 3 a Oppgave 3 3 a Oppgave 3 a. Antagelser i oppgaveteksten Eksempelgraf Gitt en vektet, sammenhengende urettet graf. Nodene angir byer (flyplasser). En kant K mellom node A og node B angir at det går en direkte flyreise fra A til B og en direkte flyreise fra B til A. Vekten k til en kant mellom A og B angir kostnaden til en direkte flyreise mellom A og B (uansett vei). En reiserute fra A til B er en liste av kanter K 1,...,K m, m 0, slik at man ved å følge kantene i angitt rekkefølge kommer fra A til B uten å besøke noen noder mer enn en gang. Kostnaden til reiseruten er k 1 + + k m,derk i er kostnaden til kant K i. Kostnaden fra en node til seg selv (dvs. en reiserute uten kanter) er 0. Prisen fra A til B bestemmes som kostnaden til den reiseruten fra A til B som har minst kostnad. Oslo 50 30 Helsinki 40 40 København 20 Stockholm München 30 20 Milano 0 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 27 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 2 / 47

Oppgave 3 a Oppgave 3 3 a løsningsforslag Oppgave 3 3 b Oppgave 3 b. Antagelser i oppgaveteksten Bruk Dijkstras algoritme til å finne prisen fra Oslo til de andre byene. Initielt Oslo blir kjent Stockholm kjent Sluttresultatet Kjent Avstand Kjent Avstand Kjent Avstand Kjent Avstand Oslo 0 T 0 T 0 T 0 Helsinki Stockholm København Munchen Milano 50 30 T 50 30 50 110 T T T T T 50 30 50 0 100 Anta at prisen fra A til B er n. Det gis av og til flere mulige reiseruter fra A til B med pris n. Hvis N er en nabonode til B og prisen fra A til N er mindre eller lik n, tillater selskapet at man reiser via N uten tillegg i prisen. Man må da velge en reiserute fra A til N som har minimal kostnad, og etterpå reise direkte fra N til B. Vi sier da at ruten fra A til B via N er en valgbar reiserute fra A til B. Hvis C er på en valgbar reiserute fra A til B, kan man gå avicog fortsette reisen senere uten tillegg i prisen. VisierdaatmanreiserfraAtilBmedstoppiC. Hvis C ikke besøkes i en valgbar reiserute fra A til B, kan man ikke reise fra A til B med stopp i C uten å løse ny billett. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 29 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 30 / 47 Oppgave 3 b Oppgave 3 3 b Oppgave 3 c Oppgave 3 3 c (i) Hvorfor er en reiserute med minimal kostnad alltid valgbar? Ta en reiserute fra A til B med minimal kostnad og la N være den siste noden som besøkes før B. Merk at N kan være A. Da er denne ruten en reise fra A til B via N, dvs. at ruten er valgbar. (ii) Hva er prisen fra Oslo til München med stopp i Helsinki? Prisen til München er 0 Helsinki er nabo til München med pris 0. Helsinki er derfor på en valgbar vei fra Oslo til München. Svaret er derfor 0. (iii) Kan man reise fra Oslo til München med stopp i Milano? Nei, for Milano ligger ikke på en valgbar reiserute fra Oslo til München. Dette fordi Milano er nabo til München, men prisen til Milano er større ennprisentilmünchen. Representasjonen av flyselskapets graf skal bruke nabolister (i en eller annen form). Definer en datastruktur for flyrute-grafen i form av Java-klasser. class By { String navn; VektetKant nabo; // sortert etter stigende kostnad boolean kjent; int pris; // til Dijkstra // til Dijkstra (avstand) By sti; // brukes i 3-d Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 31 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 32 / 47

class Kant { Kant neste; By til; Oppgave 3 3 c Oppgave 3 3 c Tegn så med piler og bokser hvordan en del av eksempelgrafen representeres i din datastruktur. Graf Kant( By b, Kant k ) { til = b; neste = k; class VektetKant extends Kant { int kostnad; Oslo nabo Helsinki nabo Stockholm nabo Kobenhavn nabo 30 50 40 40 50 20 30 0 20 30 40 VektetKant( By b, VektetKant k, int n ) { super( b, k ); kostnad = n; Munchen nabo Milano nabo 20 30 40 20 0 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 33 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 34 / 47 Oppgave 3 d Oppgave 3 3 d Programmer Dijkstras algoritme for å finne prisen fra en by til alle andre byer. class Graf { By[] by; int antallukjente; void initialiser( By start ) { antallukjente = by.length; for ( int i = 0; i < by.length; i++ ) { by[i].kjent = false; by[i].pris = UENDELIG; by[i].sti = null; // brukes i 3-d by[i].stiliste = null; // brukes i 3-e start.pris = 0; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 35 / 47 Oppgave 3 3 d By minukjent ( ) { int min = 0; for ( int i = 1; i < by.length; i++ ) { if (!by[i].kjent && by[i].pris < by[min].pris ) { min = i; by[min].kjent = true; antallukjente--; return by[min]; boolean flereukjente () { return ( antallukjente > 0 ); Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 36 / 47

Oppgave 3 3 d void dijkstra( By start ) { By v, w; VektetKant kant; initialiser( start ); while ( flereukjente() ) { v = minukjent(); for ( kant = v.nabo; kant!= null; kant = kant.neste ) { int d = v.pris + kant.kostnad; w = kant.til; if(!w.kjent && d<w.pris ){ w.pris = d; w.sti = v; Oppgave 3 e Oppgave 3 3 e Skisser en algoritme for en metode som tar inn tre byer A, B, C. Metoden skal skrive ut alle valgbare reiseruter fra A til B med stopp i C, samt prisen. Vi tillater at C kan være lik null. Metoden skal da skrive ut alle valgbare reiseruter fra A til B, samt prisen. Merk: Dijkstras algoritme beregner avstandsfeltet pris og lagrer én reiserute til startnoden med minimal kostnad. Selv om prisen til en node kan leses direkte fra verdien i nodens pris felt, må gjøre bruk av pris verdien til alle nabonodene for å finne frem til de valgbare reiserutene. Via-noden C hånderer vi under gjennomløpet av de valgbare rutene. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 37 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 3 / 47 Skisse til løsning Oppgave 3 3 e Oppgave 3 f Oppgave 3 3 f via(b): Mengde av nabonoder til B som det går valgbare ruter fra A gjennom Beregn prisen p fra A til B or hver nabonode N til B, beregn prisen p A til N. Hvis p < p, legg N til via(b) inn prisen fra A til C og en rute r 1 fra A til C med minimal kostnad. or hver N i via(b), finn en rute r 2 fra C til N med mininal kostnad. Hvis kostnaden ved r 1, r 2 ikke overstiger prisen til N, og r 3 er kanten fra N til B, er r 1, r 2, r 3 en løsning LaKværeenkantfraAtilBmedkostnadk.Kantenerfeilprisetdersom det finnes en annen reiserute fra A til B med kostnad mindre eller lik k. (i) inn alle feilprisede kanter i eksempelgrafen. Kanten fra Stockholm til Milano er feilpriset. Kanten har kostnad 0, mens minste kostnad mellom de to byene er 70. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 39 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 40 / 47

Oppgave 3 3 f Oppgave 3 3 f (ii) Programmer en metode som finner alle feilprisede kanter i en graf. Strukturen i løsningen er en ytre løkke som kaller opp en (variant av) Dijkstras algoritme for hver node: Kjør Dijkstras algoritme fra N. or hver kant i nabolisten til N, test om kant.til.pris <= kant.kostnad. Isåfall er kanten feilpriset. Avskjæring: Stans algoritmen når kostnaden til minukjent() er større enn kostnaden til alle nodens utkanter. Avskjæring: Sorter utkantene fra en node etter stigende kostnad. Vi kaller opp testpris(n) forhvernoden. void testpris( By start ) { int d; By v,w; VektetKant kant; VektetKant minnabo = start.nabo; initialiser( start ); while ( flereukjente() ) { v = minukjent(); while ( v.pris > minnabo.kostnad ) { // hvis minnabo er feilpriset, kan det oppdages naa: if ( minnabo.til.pris <= minnabo.kostnad ) { rapportereil( start, minnabo ); minnabo = minnabo.neste; if ( minnabo == null ) return; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 41 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 42 / 47 Oppgave 3 3 f Oppgave 4 Oppgave 4 for (kant = v.nabo; kant!= null; kant = kant.neste ) { d = v.pris + kant.kostnad; w = kant.til; if ( d < w.pris ) w.pris = d; void rapportereil( By start, VektetKant kant ) { System.out.print( start.navn + " -> " + kant.til.navn + " feil: " ); System.out.println( kant.til.pris + "/" + kant.kostnad ); Gitt et N N-brett der hver rute kan være enten hvit eller sort. boolean[][] brett = new boolean[n][n] En sort sky er en mengde av sorte felter slik at (1) en sky inneholder minst ett sort felt, (2) hvis en sky har mer enn ett felt, er ethvert felt i skyen nabo til et annet felt i skyen, (3) alle sorte felt på brettet som er nabo til et felt i skyen, er selv med i skyen. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 43 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 44 / 47

Oppgave 4 Oppgave 4 (i) Tegn en figur som illustrerer begrepet om en sort sky. iguren inneholder 6 skyer (sorte felt diagonalt nær hverandre er ikke naboer ifølge definisjonen i oppgaveteksten). (ii) Programmer en metode som finner ut hvor mange sorte skyer det finnes på et gitt brett. Metoden har lov til å ødelegge representasjonen av brettet underveis. Løsning: dybde-først-søk fra alle feltene på brettet, hvor sorte felt viskes ut underveis. int antallskyer() { int antall = 0; for (int i = 0; i < N; i++ ) { for (int j = 0; j < N; j++ ) { antall += viskut( i, j ); return antall; Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 45 / 47 Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 46 / 47 Oppgave 4 int viskut( int i, int j ) { if ( i<0 j<0 i>=n j>=n ) return 0; if (! brett[i][j] ) return 0; else { brett[i][j] = false; viskut( i-1, j ); viskut( i+1, j ); viskut( i, j-1 ); viskut( i, j+1 ); return 1; Returverdien fra viskut benyttes ikke av de rekursive kallene. Ellers angir denne tilbake til hovedmetoden at parameter-feltet var svart, og at vi altså fant en ny sky. Institutt for informatikk (UiO) IN2220 Algoritmer og datastrukturer 10.11.200 47 / 47