Algoritmer og datastrukturer Løsningsforslag

Like dokumenter
Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

Emnekode: I-Dato: I ~ Antall oppgaver: I I Aiie -sk:i=rftlige - bme trykte og håndskrevne, samt alle typer

EKSAMEN med løsningsforslag

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

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

EKSAMEN. Algoritmer og datastrukturer

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

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

Fagnr: A. Ant. vedlegg: 1 (2 sider)

Algoritmer og datastrukturer Kapittel 4 Delkapittel 4.2

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

Binære trær: Noen algoritmer og anvendelser

Algoritmer og datastrukturer Kapittel 9 Delkapittel 9.2

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.2

Definisjon av binært søketre

Fagnr: A. Ant. vedlegg: 1 (2 sider)

Fagnr: SO 131 A. Ant. vedlegg: 1 (2 sider)

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

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

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

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

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

INF1010 Binære søketrær ++

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

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

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

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

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

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.1

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

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

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

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

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

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

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

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

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Object [] element. array. int [] tall

INF2220: Forelesning 1

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

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

EKSAMEN. Emne: Algoritmer og datastrukturer

INF2220: Forelesning 1

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

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

Algoritmer og Datastrukturer IAI 21899

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Binære søketrær

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.4

INF Algoritmer og datastrukturer

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

Algoritmer og datastrukturer Vedlegg A.2 BitOutputStream

Algoritmer og datastrukturer A.1 BitInputStream

UNIVERSITETET I OSLO

Algoritmer og datastrukturer E Løkker i Java

Liste som abstrakt konsept/datatype

INF1020 Algoritmer og datastrukturer. Dagens plan

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

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

INF1010 siste begreper før oblig 2

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

INF1020 Algoritmer og datastrukturer GRAFER

Et eksempel: Åtterspillet

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

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 Kapittel 1 - Delkapittel 1.3

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.2

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

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

Transkript:

1 Algoritmer og datastrukturer Løsningsforslag Eksamen 29. november 2011 Oppgave 1A Verdien til variabelen m blir lik posisjonen til den «minste»verdien i tabellen, dvs. bokstaven A, og det blir 6. Oppgave 1B OBS: Metodene legginn og fjern oppfører seg nøyaktig slik metodene add og remove gjør i List-klassene i Java. Metodekall Resultat -------------------------------------- legginn('a'); A legginn('b'); AB legginn(1,'c'); ACB legginn(1,'d'); ADCB liste.fjern(2); ADB liste.legginn(0,'e'); EADB liste.fjern(1); EDB println(liste); [E, D, B] Oppgaven gikk ut på å avgjøre hva utskriften ble. I alle listeklassene som har blitt laget (inklusiv klassen DobbeltLenketListe i Oblig 2) og alle andre aktuelle klasser, har metoden tostring blitt laget slik at tegnstrengen har hakeparenteser og komma + mellomrom mellom hvert element. Slik er det også i java.util. Setningen System.out.println(liste) gjør implisitt et kall på tostring-metoden. Svaret på oppgaven skal derfor være: [E, D, B] Oppgave 1C Her kan vi bruke samme idé som den som brukes når innholdet i en tabell skal snus. Da går vi fra begge ender i tabellen mot midten og bytter verdier på veien. int v = 0, h = liste.antall() - 1; while (v < h) T vtemp = liste.hent(v); T htemp = liste.hent(h); liste.oppdater(v, htemp); liste.oppdater(h, vtemp); v++; h--; Idéen over kan skrives med kortere kode:

2 for (int v = 0, h = liste.antall() - 1; v < h; v++, h--) liste.oppdater(v,liste.oppdater(h,liste.hent(v))); Det er en viktig del av denne oppgaven å kunne redegjøre for effektiviteten til metoden når den brukes på henholdsvis en TabellListe og DobbeltLenketListe. Den første klassen er detaljert beskrevet i kompendiet og den andre var emne for Oblig 2. Metoden(e) over virker ok hvis den kjøres på en TabellListe. Både hent-metoden og oppdater-metoden har da direkte aksess til verdiene i den underliggende tabellen. De er med andre ord av konstant orden. Det betyr at snu-metoden blir av lineær orden (dvs. av orden n der n er antallet verdier i listen) siden ombyttingene skjer i en løkke. Hvis metoden(e) brukes på en DobbeltLenketListe blir det annerledes. Der er bådehentmetoden og oppdater-metoden av lineær orden siden det må letes etter rett posisjon enten fra venstre eller fra høyre ende av listen. Det betyr at snu-metoden blir av kvadratisk orden (dvs. av orden n 2 der n er antallet verdier i listen). Er det mulig av lage en løsning som blir av lineær orden i begge tilfellene, dvs. både fortabellliste og for DobbeltLenketListe? Java-klassen Collectionshar en snu-metode for lister (dvs. List). Den hetercollections.reverse(list<?> list). Men alle listeklassene i Java har enlistiterator. En slik iterator kan gå begge veier i listen og samtidig både fjerne, legge til og oppdatere verdier under itereringen. Med slike muligheter er det mulig å lagereverse slik at den får lineær orden i alle tilfellene. Det er mulig å få til det samme med våre listeklasser, men da på en mer primitiv eller «brutal»måte. Vi kan traversere listen ved hjelp av en iterator (lineær orden) og legge verdiene fortløpende over i en hjelpestruktur (f.eks. en stakk). Så «tømmer» vi listen ved hjelp av metodennullstill ((lineær orden) og til slutt bygger vi opp listen på nytt ved å legge inn verdiene i motsatt rekkefølge (lineær orden). Sammenlagt blir dette av lineær orden: Stakk<T> s = new TabellStakk<>(); for (T t : liste) s.legginn(t); // for-alle-løkke liste.nullstill(); while (!s.tom()) liste.legginn(s.taut()); Hvis vi ikke vil bruke metoden nullstill, kan vi få til samme effekt ved hjelp avfjernmetoden. Det å fjerne den siste i listen er av konstant orden for begge listeklassene. Kø<T> kø = new TabellKø<>(); while (!liste.tom()) kø.legginn(liste.fjern(liste.antall()-1)); while (!kø.tom()) liste.legginn(kø.taut()); Oppgave 1D

3 6 er lagt inn 15 er lagt inn Den minste (3) er tatt ut Den minste (5) er tatt ut Oppgave 2A Her er det viktig å legge merke til at parameteren til konstruktøren i klassen EnkelPrioritetsKø er av typen Kø. Grensesnittet Kø var satt opp i vedlegget. Det betyr at det kun er de metodene som grensesnittet har, som kan brukes i kodingen. Når klassen senere skal brukes, må det finnes en instans av en kø-klasse som skal gå inn som parameter. Men hva slags kø-klasse det er, er selvfølgelig helt ukjent når metodene i klassen EnkelPrioritetsKø kodes. Men selv om det skulle være kjent hvilken kø-klasse det er, er det likevel kun klassen offentlige metoder som kan benyttes og det er de som er satt opp i grensesnittet Kø. Med andre ord er det umulig å komme i kontakt med klassens indre, dvs. de private delene. public T kikk() if (tom()) throw new NoSuchElementException(); return kø.kikk(); // kaller en metode i kø public T taut() if (tom()) throw new NoSuchElementException(); return kø.taut(); // kaller en metode i kø Oppgave 2B Her må vi kikke (så ta ut og legge inn bakerst) så lenge som den verdien vi ser, på er mindre enn den nye verdien. Så legges den nye verdien inn (bakerst) og deretter resten av køen. Her vil det være helt unødvendig og dermed ikke optimalt å bruke hjelpestrukturer (det vil medføre trekk). public void legginn(t verdi) int n = kø.antall(), i = 0; while (i < n && c.compare(verdi,kø.kikk()) > 0)

4 kø.legginn(kø.taut()); i++; kø.legginn(verdi); while (i < n) // tar med resten kø.legginn(kø.taut()); i++; Oppgave 3A Verdiene i postorden: 6, 5, 8, 7, 2, 10, 9, 14, 13, 17, 19, 16, 12 Treet har 5 bladnoder. Sortert rekkefølge: 6, 8, 10, 14, 17 Oppgave 3B For å finne første bladnode går vi vekselsvis mot venstre og høyre. Dvs. mot venstre hvis det er et venstre barn og ellers mot høyre. Hvis noden hverken har venstre eller høyre barn, er det en bladnode. Legg merke til at første bladnode er lik første node i postorden: public T førstebladverdi() if (tom()) return null; Node<T> p = rot; while (true) if (p.venstre!= null) p = p.venstre; else if (p.høyre!= null) p = p.høyre; else return p.verdi; // p er første bladnode Det er også mulig å bruke rekursjon selv om det hverken gir mer effektiv eller enklere kode: public T førstebladverdi() if (tom()) return null; return førstebladverdi(rot);

5 private static <T> T førstebladverdi(node<t> p) if (p.venstre!= null) return førstebladverdi(p.venstre); else if (p.høyre!= null) return førstebladverdi(p.høyre); else return p.verdi; Oppgave 3C Denne oppgaven kan løses på flere måter. Vi kan f.eks. bruke rekursjon med «splitt og hersk».da bruker vi generelt at antall bladnoder i et binærtre er lik summen av antallene i rotnodens to subtrær. Basistilfellene er at et tomt tre har ingen bladnoder og et tre med én node har én bladnode: return antallbladnoder(rot); private static int antallbladnoder(node<?> p) if (p == null) return 0; // ingen bladnoder i et tomt tre else if (p.venstre == null && p.høyre == null) return 1; else return antallbladnoder(p.venstre) + antallbladnoder(p.høyre); Oppgave 3C kan også løses ved å bruke en vanlig traversering og så telle opp de bladnodene som passeres. Da kan vi f.eks. bruke en heltallstabell med med lengde 1 til opptellingen. Flg. metode traverserer i postorden. Legg merke til at bladnodene kommer i samme rekkefølge enten vi traverserer i preorden, inorden eller postorden: int[] ant = 0; if (!tom()) antallbladnoder(rot, ant); return ant[0]; private static void antallbladnoder(node<?> p, int[] ant ) if (p.venstre!= null) antallbladnoder(p.venstre, ant); if (p.høyre!= null) antallbladnoder(p.høyre, ant); if (p.venstre == null && p.høyre == null) ant[0]++; OBS: Noen forsøker å bruke flg. type rekursiv traversering (som ikke vil virke): int antall = 0; if (!tom()) antallbladnoder(rot, antall); return antall; private static void antallbladnoder(node<?> p, int antall) if (p.venstre!= null) antallbladnoder(p.venstre, antall); if (p.høyre!= null) antallbladnoder(p.høyre, antall);

6 if (p.venstre == null && p.høyre == null) antall++; Hvis man tror at koden over virker, har man en fundamental misforståelse av hvordan parameteroverføring skjer i Java. Parameteren antall i den rekursive metoden har det som kalles verdioverføring. Det betyr at det opprettes en lokal variabel med navnet antall og med verdien til parameteren som verdi. En oppdatering av denne får da kun lokal effekt, mens den variabelen som inngår som parameter når metoden kalles, blir helt uberørt. Vi kan også traversere og telle opp iterativt ved hjelp av en stakk. Flg. metode traverserer i preorden: if (tom()) return 0; int antallbladnoder = 0; Stakk<Node<T>> stakk = new TabellStakk<>(); // en stakk stakk.legginn(rot); // starter med å legge rot på stakken while (!stakk.tom()) Node<T> p = stakk.taut(); // henter fra stakken if (p.venstre == null && p.høyre == null) antallbladnoder++; if (p.høyre!= null) stakk.legginn(p.høyre); // først høyre if (p.venstre!= null)stakk.legginn(p.venstre); // så venstre return antallbladnoder; Oppgave 3D private class BladnodeIterator implements Iterator<T> private Stakk<Node<T>> s = new TabellStakk<>(); private Node<T> p; // Flg. hjelpemetode finner den første bladnoden i det treet // som har p som rotnode. Hvis en node som passeres på veien // dit, har et høyre barn og vi går mot venstre, legges dette // barnet på stakken. Det betyr at når vi tar en node p fra // stakken, vil neste bladnode være den første bladnoden i // treet med p som rot private Node<T> førstebladnode(node<t> p) while (true) if (p.venstre!= null) if (p.høyre!= null) s.legginn(p.høyre); p = p.venstre; else if (p.høyre!= null) p = p.høyre; else return p;

7 private BladnodeIterator() if (tom()) return; p = førstebladnode(rot); // p er første bladnode i treet public boolean hasnext() return p!= null; public T next() if (!hasnext()) throw new NoSuchElementException("Ingen flere verdier"); T tempverdi = p.verdi; p = s.tom()? null : førstebladnode(s.taut()); return tempverdi; public void remove() throw new UnsupportedOperationException();