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

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

EKSAMEN med løsningsforslag

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og Datastrukturer

EKSAMEN. Algoritmer og datastrukturer

Algoritmer og datastrukturer Eksamen

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

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

Algoritmer og datastrukturer Løsningsforslag

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

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

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

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

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

Algoritmer og Datastrukturer IAI 21899

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

UNIVERSITETET I OSLO

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

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

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

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

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

Kap.8 Sortering og søking sist oppdatert 16.03

PG4200 Algoritmer og datastrukturer Forelesning 7

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

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

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

Algoritmer og datastrukturer Eksamen

INF2220: Forelesning 1

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

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

Løsningsforslag EKSAMEN

Algoritmer og datastrukturer Løsningsforslag

INF2220: Forelesning 1

UNIVERSITETET I OSLO

EKSAMEN. Emne: Algoritmer og datastrukturer

Binære trær: Noen algoritmer og anvendelser

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Løsningsforslag eksamen INF1020 høsten 2005

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Algoritmer og datastrukturer Eksamen

LO118D Forelesning 12 (DM)

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

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

Generelle trær BINÆRTRÆR. Binærtrær

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

Oppgave 1. Stabler og Køer (30%)

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

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 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

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

ADT og OO programmering

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

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

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

Definisjon av binært søketre

INF Algoritmer og datastrukturer

Del 3: Evaluere uttrykk

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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Eksamen 22. februar 2011

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

Notater til INF2220 Eksamen

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

INF1010 våren januar. Objektorientering i Java

Dagens tema INF1010 INF1010 INF1010 INF1010

Inf 1020 Algoritmer og datastrukturer

INF1010 Binære søketrær ++

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

IN1010 våren Repetisjon av tråder. 15. mai 2018

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Algoritmeanalyse. (og litt om datastrukturer)

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

INF 1010, vår 2005 Løsningsforslag uke 11

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Transkript:

Løsningsforslag til eksamensoppgave ITF20006 Algoritmer og datastrukturer 22.05.2007 Oppgave 1 A. Postorden traversering: 1-16-11-2-35-61-81-47-30 B. velformet = sann ; Stack s = new Stack(); while(<flere elementer på filen og velformet er sann>){ element = HTMLleseren.nesteElement(); if(<element er en start-tagg>) s.push(element); else if(<element er en slutt-tagg>){ if( s.isempty()) velformet = usann; else{ starttagg = s.pop(); if (<element.navn!= starttagg.navn>) velformet = usann; if(!s.isempty() velformet=usann; C. 1. Algoritme1 skriver summen av de n første heltallene til skjerm, som også er antallet ganger innerste løkke gjentas. For n=10 blir dette 55. Algoritme2 skriver de n første heltallene til skjerm, i stigende rekkefølge. For n=10: 1 2 3 4 5 6 7 8 9 10.

2. Algoritme 1: Innerste løkke gjentas n ganger for i=0, n-1 ganger for i=1 o.s.v. Totalt gjentas setningen i innerste løkke n(n+1)/2 ganger. O(N 2 ). Algoritme 2: Lineær, rekursiv algoritme. O(N). 3. Algoritme 1: Nei. Siden algoritmen er kvadratisk, vil vi før oppgradering kunne forvente en 4-dobling av tidsbruken hvis vi dobler problemets størrelse: T(2N) = c(2n) 2 =4cN 2 = 4T(N). Hvis hver operasjon utføres på halve tiden etter oppgradering, vil vi følgelig kunne forvente en dobling av tidsbruken. Algoritme 2: Ja, siden algoritmen er lineær. T(2N) =2cN = 2T(N). Oppgave 2 A. public T fjernminste() throws Exception{ if (start == null) throw new Exception("Tom liste."); Node<T> minst = start; start = start.neste; antall--; return minst.verdi; B. public void skriv() { Node<T> n = start; while(n!= null){ System.out.print(n.verdi+" "); n=n.neste; C. public void settinn(t verdi ){ if (verdi == null) throw new NullPointerException(); antall++; if(start == null start.verdi.compareto(verdi) > 0 ){ start = new Node<T>(verdi, start); return; Node<T> n = start; while(n.neste!= null){ if(n.verdi.compareto(verdi) <= 0 && n.neste.verdi.compareto(verdi)>0){ n.neste = new Node<T>(verdi, n.neste); return; Side 2 av 6

n=n.neste; n.neste = new Node<T>(verdi, null ) ; D. Her er det fristende å bruke metoden sett Inn fra oppgave 2C, og å bygge opp den nye listen ved å sette inn ett og ett element fra de to listene som skal flettes sammen. Denne algoritmen har arbeidsmengde O(N 2 ), hvor N er summen av elementene i de to listene. En implementasjon er vist nedenfor: public SortertListe<T> flett (SortertListe<T> l){ SortertListe<T> flettet = new SortertListe<T>(); flettet.antall = antall + l.antall; Node<T> n = this.start; while(n!= null){ flettet.settinn(n.verdi); n = n.neste; n = l.start; while (n!= null){ flettet.settinn(n.verdi); n = n.neste; return flettet; En mer effektiv flette-algoritme er vist nedenfor. Vi starter opp med referanser til første element i hver av de to listene som skal flettes sammen, finner ut hvilken liste neste element skal velges fra og flytter tilhørende referanse ett hakk bakover i listen. Nye elementer settes sist i ny, flettet liste. Arbeidsmengde O(N). public SortertListe<T> flett (SortertListe<T> liste) { SortertListe<T> flettet = new SortertListe<T>(); flettet.antall = antall + liste.antall; flettet.start = new Node<T>(null,null); // hjelpenode Node<T> p = start, q = liste.start, r = flettet.start; while (p!= null && q!= null) { if (p.verdi.compareto(q.verdi) <= 0) { r = r.neste = new Node<T>(p.verdi,null); p = p.neste; else { r = r.neste = new Node<T>(q.verdi,null); q = q.neste; if (p == null) p = q; while (p!= null) // tar med resten { r = r.neste = new Node<T>(p.verdi,null); p = p.neste; flettet.start = flettet.start.neste; // fjerner hjelpenoden return flettet; Side 3 av 6

E. public class ListePrioritetsKø <T extends Comparable<? super T>> implements PrioritetsKø<T> { private SortertListe<T> liste; public ListePrioritetsKo () { liste = new SortertListe(); public void settinn(t verdi) { liste.settinn(verdi); public T taut () { return liste.fjernminste(); public int antall (){return liste.hentantall(); Oppgave 3 A. Foreldrenoden: k/2 (heltallsdivisjon) Venstre barn: 2k Høyre barn: 2k+1 B. Etter at operasjonene er utført: Side 4 av 6

C. public boolean erkomplett(t [] heap){ boolean komplett = true; for (int i=1; i<heap.length && heap[i]!= null; i++) antall++; for (int i = antall+1; i<heap.length && komplett; i++) komplett = heap[i] == null; return komplett; // Iterativ løsning erminiheap: private boolean erminiheap(t[] heap){ int m = (antall + 1)/2; for (int i = 1; i < m; i++) // går kun halvveis i tabellen { if (heap[i].compareto(heap[2*i]) > 0) if (heap[i].compareto(heap[2*i+1]) > 0) if ((antall & 1) == 0) // en ekstra node hvis antall er et partall if (heap[m].compareto(heap[antall]) > 0) return true; // Rekursiv løsning: private boolean erminiheap(t [] heap){ if (!erminiheap(heap, 1)) return true; private boolean erminiheap(t [] heap, int index ){ // Venstre barn: if (2*index <= antall){ if (heap[index].compareto(heap[2*index]) > 0 ) if (!erminiheap(heap, 2*index)) Side 5 av 6

/ / Høyre barn: i f (2*index +1 <= antal l ){ i f (heap[ index]. compareto(heap[2* index+1]) > 0 ) return fa lse; i f (!ermin iheap(heap, 2*index+1)) return true; D. private void lagminiheap(t [] heap){ rot = lagsubtre(heap, 1); private Node<T> lagsubtre (T [] heap, int index){ if(index > antall ) return null; Node<T> venstre = lagsubtre(heap, 2*index); Node<T> hoyre = lagsubtre(heap, 2*index +1 ); return new Node(heap[index], venstre, hoyre ); Side 6 av 6