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

Like dokumenter
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

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Løsningsforslag

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

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

UNIVERSITETET I OSLO

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

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

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

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

EKSAMEN med løsningsforslag

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

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Algoritmer og datastrukturer Eksamen 22. februar 2011

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

Binære trær: Noen algoritmer og anvendelser

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

København 20 Stockholm

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Definisjon av binært søketre

LO118D Forelesning 12 (DM)

Algoritmer og datastrukturer Løsningsforslag

Object [] element. array. int [] tall

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

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

INF Algoritmer og datastrukturer

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

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

PG4200 Algoritmer og datastrukturer Forelesning 7

Løsningsforslag til INF110 h2001

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Quicksort. Fra idé til algoritme.

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

EKSAMEN. Algoritmer og datastrukturer

INF1010 Binære søketrær ++

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

KONTINUASJONSEKSAMEN

Rekursjon. Binærsøk. Hanois tårn.

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

INF1010 notat: Binærsøking og quicksort

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen

INF1020 Algoritmer og datastrukturer GRAFER

UNIVERSITETET I OSLO

IN2010: Forelesning 11. Kombinatorisk søking Beregnbarhet og kompleksitet

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Algoritmer og datastrukturer Eksamen

Algoritmer og Datastrukturer

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

Grunnleggende Grafteori

Definisjon: Et sortert tre

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Obligatorisk oppgave 1 INF1020 h2005

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

Algoritmer og Datastrukturer

KONTINUASJONSEKSAMEN

Oppgave 1. Sekvenser (20%)

Notater til INF2220 Eksamen

IN 115 Fasitforslag til Eksamen 1997 Omskrevet til Java. 1. april 2000

Algoritmer og Datastrukturer IAI 21899

Algoritmer og datastrukturer Eksamen

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

Det matematisk-naturvitenskapelige fakultet

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF Algoritmer og datastrukturer

Del 1(8%) 5 h. Del 2(42%)

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Ekstra ark kan legges ved om nødvendig, men det er meningen at svarene skal få plass i rutene på oppgavearkene. Lange svar teller ikke positivt.

Dagens tema INF1010 INF1010 INF1010 INF1010

INF2220: Forelesning 2

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Norsk informatikkolympiade runde

UNIVERSITETET I OSLO

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

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

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Trær. En datastruktur (og abstrakt datatype ADT)

UNIVERSITETET I OSLO

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

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

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

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Vi skal se på grafalgoritmer for:

Løsningsforslag eksamen INF1020 høsten 2005

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

EKSAMEN. Emne: Algoritmer og datastrukturer

INF2220: Forelesning 2

Transkript:

Løsnings forslag i java In115, Våren 1998 Oppgave 1 // Inne i en eller annen klasse private char S[]; private int pardybde; private int n; public void lagalle(int i) if (i==n) bruks(); else /* Sjekker om det er plass til flere stjerner og man i tillegg * får plass til de sluttparantesene det er påkrevd å ha. */ if (pardybde <= n-i-1) S[i] = * ; lagalle(i+1); // Avslutter evt parantes og fortsetter rekursivt utover i arrayen. if (pardybde > 0) S[i] = ) ; pardybde--; lagalle(i+1); pardybde++; // Sjekker om det er plass til ett nytt parantes par i arrayen if (pardybde+1 <= n-i-1) S[i] = ( ; pardybde++; lagalle(i+1); pardybde--; // Kallet som setter det hele igang...... lagalle(0); Oppgave 2a Vi ser på binære trær, satt sammen av noder på formen: class Node Node vsub, hsub // Høyre og venstre subtre... // Evt andre variable

Ønsker her å traversere treet infiks og sende med nodens dybde +1 til nodens barn. Starter med kallet på roten med dybde null. public void DIsekvens(Node n, int d) if (n==null) return; // Returnerer dersom noden er null DIsekvens(n.vsub, d+1); System.out.print(d + " "); DIsekvens(n.rsub, d+1); // Det hele starter med kallet: (som det ikke var spurt om) DIsekvens(root, 0); Oppgave 2b Indreprosedyrer finnes ikke i Java, så vi løser det heller med å la variablene ligge globalt i objektet og lar hovedmetoden være konstruktør og den indre metoden en metode i objektet. Ideen med metoden under er å bygge subtrærne ved å dele sekvensen inn i subtrær etter den laveste dybden, nemmelig roten, altså indeksen med verdi 0. Deretter har vi to områder som hver har en ener i seg, som vi deler ved eneren, og slik forsetter vi innover. En standard Divide and Conquer metode som til slutt har bygget treet via rekusrive kall.

public class ByggTre private int DI[]; private Node root; public ByggTre(int di[]) DI = di; root = rekbygg(0, DI.length-1, 0); public Node rekbygg(int fra, int til, int d) Node rn = new Node(); if (fra > til) return null; boolean done = false; int i=fra-1; while(++i<=til &&!done) if (DI[i] == d) done = true; if (done) rn.vsub = rekbygg(fra, i-1, d+1); rn.hsub = rekbygg(i+1, til, d+1); else // Feil tilfelle, ikke spurt om.. throw new Exception("Feil i sekvensen"); return rn; Oppgave 2c Analysen ligner mye på den for QuickSort, i og med at det fra ett kall som behandler et visst segment gjøres rekusive kall som tar seg av de to "halvdelene" (ikke nødvendigvis like store) av dette segmentet, og at behandlingen i hver proseedyre er proposjonal med lengden av det feltet den skal behandle. Vi får da at et rimelig balansert tre vil gi oss O(n logn). Er treet venstre tungt derimot, må vi lete gjennom hele feltet i hvert kall på rekbygg, som medfører at vi får lete lengder: n, n-1, n-2,..., 3, 2, 1. Denne summen summerer opp til O(n 2 ) Oppgave 2d Denne varianten arbeider rekursivt, slik at den gjør lesning i innfiks rekkefølge etter som treet bygges. Videre er det slik at når vi skaper en node A så vil vi ha lest nøyaktig så langt i DI som frem til den "venstereste" noden i subtreet med rot A. Vi vil altså ofte skape noden lenge før vi har lest frem til denne noden i DI sekvensen. Prosedyren kan gå som følger:

// Inne i en klasse som forrige oppgave private int DI[]; private int i; // for posisjon public Node rekbygg2(int d) Node n = new Node(); if (DI[i] > d) // Venstre subtre ikke tomt n.vsub = rekbygg2(d+1); if (DI[i]!= d) // Test, faller naturlig, men ikke krevet throw new Exception (" Feil "); i++; if (i <=DI.length && DI[i] > d ) n.hsub = rekbygg2(d+1); return n; Det som gjøres i hver av nodene, utenom de rekursive kallene, er av tid O(1). Den totale tiden blir da O(n) Oppgave 3a Rosa tilsvarer fargekode 3, altså har vi følgende: Graf 1: (1, 2, 3), (1, 4, 3), (2, 4, 3) Graf 2: Node 3 Graf 3: (5, 6, 3) Fargen er da denne er en del av definisjonen. Noden 3 er en graf ut ifra definisjone om at en node er en subgraf med farge f dersom det er en singel node som ikke har kanter med fargen f koblet til seg. Oppgave 3b Vi skal her programmere en metode: public void fargesubgrafer(node G[], int f, int N) som finner samtlige fargesubgrafer i G. Man kan anta at man i tillegg har en metode: public void skrivkant(kant k) Nok en gang kommer vi over tilfellet der oppgaven benytter seg av indre klasser, og dette løser vi ved å legge de aktuelle variablene ut på klassenivå. // Definisjon av klassene node og kant class Node int merke; Kant nabo1; class Kant

int nr, nabo, farge; Kant neste; class FargeSubGrafer Node G[]; int f, N; /* Går gjennom alle fargenekantene til denne noden, og dersom * fargen ikke finnes er dette en Singel node og altså en * gyldig subfargegraf. */ public boolean ersingel(node n) boolean funnet = false; Kant hj = n.nabo1; while ( hj!= null &&!funnet ) if ( hj.farge == f ) funnet = true; hj = hj.neste; return!funnet; /* Bruker dybde først søk for å finne fargegrafene. Merk at * at man her like gjerne kunne brukt ett bredde først... */ public dfsfarge(node u, Node fra) Kant hj; if ( u.merke == 0 ) u.merke = 1; hj = n.nabo1; while (hj!= null) if ( G[hj.nabo]!= fra && hj.farge == f && hj.nabo.merke!= 2 ) skrivkant(hj); dfsfarge(g[hj.nabo], u); hj = hj.neste; u.merke = 2; public FargeSubGrafer(Node G_[], int f_, int N_) G = G_; f = f_; N = N_; int k=0; for (int i=0; i<n; i++) if ( G[i].merke == 0 )

k++; System.out.print("Subgraf nr " + k + ": "); if ( ersingel(g[i] ) System.out.print(i); else dfsfarge(g[i]), null); Oppgave 3c, d, e Dette stoffet er ikke lenger pensum i kurset... Oppgave 4 Dette problemet med kabel A blir identisk med å løse Traveling Salesman. Det er del av pensum å vite at dette er NP-komplett, og at slike problemer neppe kan løses i polynomisk tid. Dermed er uttalelsen til Ola gal. Problemet med å legge kabel B slik at minst mulig kabel blir brukt blir imidlertid identisk med å finne et minimalt spenntre mellom husene. For dette problemet finnes to algoritmer, Prim og Kruskal. Om man bruker en proioretskø med kanter i kø bruker disse algoritmene tid O(E logn). Siden vårt problem har antall kanter som er O(n 2 ), gir dette tid O(n 2 logn), og det er mer enn Kari påstår. Når man er mange kanter er det imidlertid en annen enklere utgave av Prim, en som ikke bruker prioritetskø, men holder nodene i randa i en enkel liste. Denne får tid O(n 2 ), og ut fra det er det helt rimelig påstand Kari kommer med. Noen tilsvarende utgave av Kruskal (med tid O(n 2 ) ) finnes ikke.