Algoritmer og datastrukturer Eksamen

Like dokumenter
Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen 22. februar 2011

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

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

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

Algoritmer og datastrukturer Løsningsforslag

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

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

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

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

Algoritmer og datastrukturer Kapittel 9 Delkapittel 9.2

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Algoritmer og datastrukturer Binære søketrær

Algoritmer og datastrukturer Kapittel 4 Delkapittel 4.2

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

EKSAMEN. Algoritmer og datastrukturer

Algoritmer og Datastrukturer

EKSAMEN med løsningsforslag

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

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.2

INF1010 Binære søketrær ++

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

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

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

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.2

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

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

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

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

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

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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.1

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

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

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

UNIVERSITETET I OSLO

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

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

UNIVERSITETET I OSLO

Binære trær: Noen algoritmer og anvendelser

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.1

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

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

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

Algoritmer og datastrukturer E Løkker i Java

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

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

INF1010 siste begreper før oblig 2

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Oppgave 1. Sekvenser (20%)

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

EKSAMEN. Emne: Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Liste som abstrakt konsept/datatype

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

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

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

UNIVERSITETET I OSLO

Eksamen IN1010/INF1010 våren 2018

UNIVERSITETET I OSLO

Definisjon av binært søketre

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

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

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

Transkript:

1 Algoritmer og datastrukturer Eksamen 29.11.2011 Eksamenstid: 5 timer Hjelpemidler: Alle trykte og skrevne + håndholdt kalkulator som ikke kommuniserer. Faglærer: Ulf Uttersrud Råd og tips: Bruk ikke for lang tid på et punkt i en oppgave hvis du ikke får det til innen rimelig tid. Gå isteden videre til neste punkt. Hvis du i et senere punkt får bruk for det du skulle ha laget i et tidligere punkt, kan du fritt bruke resultatet som om det var løst og at løsningen virker slik som krevd i oppgaven. Prøv alle punktene. Det er ikke lurt å la noen punkter stå helt blanke. Til og med det å demonstrere i en eller annen form at du har forstått hva det spørres etter og/eller at du har en idé om hvordan det kunne løses, er bedre enn ingenting. Det er heller ikke slik at et senere punkt i en oppgave nødvendigvis er vanskeligere enn et tidlig punkt. Alle de 10 bokstavpunktene teller likt! Hvis du skulle ha bruk for en datastruktur fra java.util eller fra kompendiet, kan du fritt bruke det uten å måtte kode det selv. Men du bør kommentere at du gjør det. Oppgave 1 1A. Metoden public static int min(char[] a) står i vedlegget. Hva blir verdien til variabelen m når flg. kodebit utføres? Gi en begrunnelse for svaret ditt. char[] a = 'D','H','B','C','G','J','A','E','I','F'; int m = Tabell.min(a); 1B. En liste har de metodene som er satt opp i grensnittet Liste (se vedlegget). I flg. kodebit brukes en DobbeltLenketListe (den klassen som ble laget i oblig 2). Hva blir utskriften? Begrunn svaret! Bruk tegninger eller tekst. Liste<Character> liste = new DobbeltLenketListe<>(); liste.legginn('a'); liste.legginn('b'); liste.legginn(1,'c'); liste.legginn(1,'d'); liste.fjern(2); liste.legginn(0,'e'); liste.fjern(1); System.out.println(liste); 1C. Lag metoden public static <T> void snu(liste<t> liste). Den skal snu rekkefølgen i en liste. Det er ikke kjent hvilken listeimplementasjon parameteren listehører til. Det kan være TabellListe, DobbeltLenketListeeller noe annet. Det betyr at i kodingen er det kun metodene i grensesnittet Liste(se vedlegget) som kan brukes mot listen. Det tas som gitt at de virker som beskrevet. Hvor effektiv blir metoden hvis den brukes på en TabellListe? Hvor effektiv blir den hvis den brukes på en DobbeltLenketListe? Flg. eksempel viser hvordan metoden skal virke:

2 Liste<Integer> a = new TabellListe<>(); a.legginn(1); a.legginn(2); a.legginn(3); Liste<Character> b = new DobbeltLenketListe<>(); b.legginn('a'); b.legginn('b'); b.legginn('c'); System.out.println(a + " " + b); snu(a); snu(b); System.out.println(a + " " + b); // Utskrift: // [1, 2, 3] [A, B, C] // [3, 2, 1] [C, B, A] 1D. I Figur 1 under er det satt opp en minimumsheap: Figur 1 : En minimumsheap Sett først inn verdien 6 i minimumsheapen i Figur 1. Tegn treet! Sett så inn verdien 15 i det treet du nå har. Tegn treet!. Ta så ut den minste fra minimumsheapen. Tegn treet. Avslutt med igjen å ta ut den minste. Tegn treet! Oppgave 2 I denne oppgaven skal vi lage klassen EnkelPrioritetskø ved å bruke en vanlig kø som intern datastruktur. Se vedlegget. Den interne køen skal holdes sortert slik at minst verdi ligger først. Dermed er det lett å finne den minste verdien. Men det krever at køen holdes sortert. Det skal ikke legges inn noen instansvariabler eller ekstra hjelpestrukturer i klassen. Flg. eksempel viser hvordan det skal virke: Character[] a = 'D','H','B','C','G','J','A','E','I','F'; Comparator<Character> c = Komparator.naturlig(); Kø<Character> kø = new TabellKø<>(); PrioritetsKø<Character> prkø = new EnkelPrioritetskø<>(kø,c); for (char d : a) prkø.legginn(d); while (!prkø.tom()) System.out.print(prkø.taUt() + " "); // Utskrift: A B C D E F G H I J 2A. Lag kode for metodene public T kikk() og public T taut()i klassen EnkelPrioritetskø. Se vedlegget. Det skal i begge kastes en NoSuchElementException hvis det er tomt. Den første metoden skal returnere den minste verdien uten at den fjernes. Den andre skal returnere (og fjerne fra køen) den minste verdien. Se beskrivelsen i innledningen til Oppgave 2.

3 2B. Lag kode for metodene void legginn(t verdi). Den skal leggeverdi inn på rett sortert plass i den interne køen. Oppgave 3 3A. Gitt følgende heltall: 12, 16, 9, 2, 19, 7, 5, 10, 13, 17, 8, 6, 14. Legg dem inn, i den oppgitte rekkefølgen, i et på forhånd tomt binært søketre av vanlig type. Tegn treet. Skriv opp treets verdier i postorden. En bladnode i et binærtre er en node som ikke har barn. Hvor mange bladnoder er det i treet du tegnet? Skriv opp bladnodenes verdier i sortert rekkefølge. Vedlegget inneholder et «skjelett» for klassen SBinTre - et binært søketre av vanlig type. Den private klassen Node har tre instansvariabler - nodens verdi og pekere til venstre og høyre barn. Det skal ikke legges inn flere variabler i denne klassen. Klassen SBinTrehar også tre instansvariabler - en rotpeker, antall og en komparator. Det skal ikke legges inn flere variabler i klassen. Noen av metodene er ferdigkodet. Du bestemmer selv om du vil lage private hjelpemetoder. 3B. Lag kode for metoden public T førstebladverdi(). Den skal returnere verdien til første bladnode (den av dem som har minst verdi). Hvis treet er tomt, returneres null. 3C. Lag kode for metoden public int antallbladnoder(). Den skal returnere antallet bladnoder i treet. Et tomt tre har ingen noder og dermed ingen (dvs. 0) bladnoder. 3D. Lag det som mangler i den private klassen BladnodeIterator (se vedlegget) for at den skal fungere som en iterator. Iteratoren skal «besøke» bladnodene (i inorden). Kall på next() skal derfor kun gi bladnodeverdier. Se flg. eksempel: int[] a = 12, 16, 9, 2, 19, 7, 5, 10, 13, 17, 8, 6, 14; SBinTre<Integer> tre = new SBinTre<>(Komparator.<Integer>naturlig()); for (int k : a) tre.legginn(k); // bygger opp treet for (Iterator<Integer> i = tre.bladiterator(); i.hasnext(); ) System.out.print(i.next() + " "); // Utskrift: 6 8 10 14 17 Vedlegg - Eksamen i Algoritmer og datastrukturer public static int min(char[] a) int m = 0; char minverdi = a[0]; for (int i = 1; i < a.length; i++) if (a[i] < minverdi) minverdi = a[i]; m = i; return m;

4 public interface Liste<T> extends Beholder<T> public boolean legginn(t verdi); // Ny verdi bakerst public void legginn(int indeks, T verdi); // Ny verdi på indeks public boolean inneholder(t verdi); // Er verdi i listen? public T hent(int indeks); // Hent verdi på indeks public int indekstil(t verdi); // Hvor ligger verdi? public T oppdater(int indeks, T verdi); // Oppdater verdi på indeks public boolean fjern(t verdi); // Fjern verdi public T fjern(int indeks); // Fjern verdi på indeks public int antall(); // Antallet i listen public boolean tom(); // Er listen tom? public void nullstill(); // Nullstilles (tømmes) public Iterator<T> iterator(); // En iterator public interface Kø<T> // eng: Queue public void legginn(t t); // legger inn bakerst public T kikk(); // ser på det som er først public T taut(); // tar ut det som er først public int antall(); // antall i køen public boolean tom(); // er køen tom? public void nullstill(); // tømmer køen public class EnkelPrioritetskø<T> implements PrioritetsKø<T> private Kø<T> kø; private Comparator<? super T> c; public EnkelPrioritetskø(Kø<T> kø, Comparator<? super T> c) this.kø = kø; this.c = c; public void legginn(t verdi) public T kikk() public T taut() public int antall() return kø.antall(); public boolean tom() return kø.tom();

5 public void nullstill() kø.nullstill(); public class SBinTre<T> // et standard binært søketre private static final class Node<T> // en indre nodeklasse private T verdi; // nodens verdi private Node<T> venstre, høyre; // venstre og høyre barn private Node(T verdi) // konstruktør this.verdi = verdi; // class Node private Node<T> rot; private int antall; private final Comparator<? super T> comp; public SBinTre(Comparator<? super T> c) rot = null; antall = 0; comp = c; // peker til rotnoden // antall noder // komparator // konstruktør public int antall() return antall; public boolean tom() return antall == 0; public void legginn(t verdi) if (verdi == null) throw new NullPointerException("Nullverdier er ulovlig!"); Node<T> p = rot, q = null; int cmp = 0; while (p!= null) q = p; cmp = comp.compare(verdi, p.verdi); if (cmp < 0) p = p.venstre; else p = p.høyre; p = new Node<>(verdi); if (q == null) rot = p;

6 else if (cmp < 0) q.venstre = p; else q.høyre = p; antall++; public T førstebladverdi() public int antallbladnoder() private class BladnodeIterator implements Iterator<T> // eventulle variabler, eventuelle hjelpestrukturer // og eventuelle hjelpemetoder skal inn her private BladnodeIterator() public boolean hasnext() public T next() public void remove() throw new UnsupportedOperationException(); public Iterator<T> bladiterator() return new BladnodeIterator(); // class SBinTre