Algoritmer og Datastrukturer

Like dokumenter
EKSAMEN. Dato: 9. mai 2016 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.

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

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

Algoritmer og Datastrukturer

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

Algoritmer og Datastrukturer

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

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

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

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

Algoritmer og Datastrukturer

E K S A M E N. EKSAMENSDATO: 15. desember 1994 TID: Kladd og oppgavearkene leveres sammen med besvarelsen. Kladd merkes med "KLADD".

Obligatorisk oppgave 1 INF1020 h2005

København 20 Stockholm

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oppgave 1. Sekvenser (20%)

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Eksamen

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

Definisjon av binært søketre

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

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

Definisjon: Et sortert tre

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

ALGORITMER OG DATASTRUKTURER

EKSAMEN. Emne: Algoritmer og datastrukturer

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

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

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

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

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

Løsningsforslag til INF110 h2001

Stack. En enkel, lineær datastruktur

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

EKSAMEN med løsningsforslag

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Ordliste. Obligatorisk oppgave 1 - Inf 1020

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer IAI 21899

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

UNIVERSITETET I OSLO

EKSAMEN. Algoritmer og datastrukturer

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

Inf1010 oppgavesamling

UNIVERSITETET I OSLO

PG 4200 Algoritmer og datastrukturer Innlevering 2

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

UNIVERSITETET I OSLO

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

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

KONTINUASJONSEKSAMEN

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

UNIVERSITETET I OSLO

Løsningsforslag EKSAMEN

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

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

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

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

Vanlige datastrukturer. I dette lysarksettet

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

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

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

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

UNIVERSITETET I OSLO

Binære trær: Noen algoritmer og anvendelser

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

Velkommen til INF1010

Inf 1020 Algoritmer og datastrukturer

Lenkelister. Lister og køer.

Transkript:

Eksamen i Algoritmer og Datastrukturer Høgskolen i Østfold Avdeling for informatikk og automatisering Torsdag 10. desember 1998, kl. 09.00-15.00 Hjelpemidler: Alle trykte og skrevne hjelpemidler. Kalkulator. Oppgavesettet består av i alt 6 sider, inkludert forsiden, og er delt i tre deler som kan løses uavhengig av hverandre. All programkode i besvarelsen din skal skrives i Java. Koden bør være oversiktlig og godt kommentert. Du behøver ikke legge vekt på generelle prinsipper for tilgang til og beskyttelse av data i objektorientert programmering, men kan anta at du har ubegrenset tilgang (friendly access) til alle data og metoder i alle klasseobjekter. Les oppgavetekstene nøye før du begynner på besvarelsen. Lykke til.

Del 1 - Bruk av stack og kø I denne første delen av eksamen skal du skrive programkode som bruker klasser for stack og kø til å løse noen enkle problemer. Til å representere en stack bruker vi objekter av følgende klasse: class Stack { boolean isempty() {...} // Returnerer true hvis stacken er tom, false ellers Object top() {...} // Returnerer en referanse til objektet på toppen av stacken void pop() {...} // Fjerner øverste element på stacken Object topandpop() {...} // Fjerner øverste element på stacken. Returnerer en // referanse til elementet som ble fjernet. void push(object X) {...} // Legger objektet X øverst på stacken void makeempty() {...} // Gjør stacken tom / fjerner alle elementer }... Hele implementasjonen av Stack-klassen er ikke vist her, men bare de metodene som du kan trenge i programmene du skal skrive. Det er brukt... til å angi ufullstendig programkode. Du skal altså ikke programmere noe av innmaten i denne klassen, men bare bruke den. Merk at Stack-classen lagrer datatypen Object, slik at den kan brukes for alle slags objekter. Du kan anta at ingen av metodene i klassen genererer noen Exception. Oppgave 1.1 Skriv en iterativ metode void fjern(stack S) som fjerner annethvert element på stacken S. Hvis stacken f.eks. inneholder tallene (regnet fra toppen av stacken) 1, 2, 3, 4, 5, 6, 7, skal den etter et kall på fjern inneholde 1, 3, 5, 7. Her er det lurt å bruke en ekstra stack som hjelpe -datastruktur. (slutt på oppgave 1.1) Oppgave 1.2 Skriv en rekursiv versjon av metoden fjern fra oppgave 1.1. Hva er arbeidsmengden (uttrykt med O-notasjon) til fjern hvis stacken inneholder n elementer? (slutt på oppgave 1.2) 2

Oppgave 1.3 boolean sjekk(string tekst) som returnerer true bare hvis tegnstrengen tekst (som skal inneholde bare store bokstaver) er av formen xcy, der x er en tegnstreng som består bare av bokstavene A og B, og y er lik x i omvendt rekkefølge. F.eks. skal sjekk returnere true hvis parameteren tekst inneholder strengen ABABBACABBABA (her er x lik ABABBA og y lik ABBABA). Det skal brukes en Stack internt i metoden, og tegnstrengen skal leses gjennom kun én gang. (slutt på oppgave 1.3) Resten av del 1 av dette oppgavesettet handler om køer og simulering. Følgende klasse brukes til å representere vanlige køer: class Queue { boolean isempty() {...} // Returnerer true hvis køen er tom, false ellers Object getfront() {...} // Returnerer en referanse til første element i køen Object dequeue() {...} // Fjerner første element i køen. Returnerer en // referanse til elementet som ble fjernet. void enqueue(object X) {...} // Setter inn objektet X sist i køen void makeempty() {...} // Gjør køen tom / fjerner alle elementer }... Antagelsene og bemerkningene som ble gitt for klassen Stack gjelder også for Queue. Oppgave 1.4 Lag et enkelt program for tidsdrevet simulering av tre timers virksomhet ved Vinmonopolet i Halden, der du lar tiden gå i steg på ett minutt. Hvis du synes det er for tidkrevende å skrive et komplett program, kan du gjerne lage bare en programskisse med kvasikode. Anta at det er to (2) kasser (betjeningsskranker) som er åpne på polet, og at alle kunder som ankommer stiller seg i en og samme kø (f.eks. ved at de trekker kølapper). Kundeankomster og betjeningstider skal trekkes tilfeldig i programmet. Antallet kundeankomster er Poissonfordelt med et gjennomsnitt på 0.3 kunder pr. minutt. Betjeningstidene er uniformt fordelte heltall mellom 1 og 10 (minutter). Til trekningen av tilfeldige tall kan du anta at du har tilgjengelig følgende to metoder: int poisson(float gjennomsnitt); // Trekker Poissonfordelte heltall med et gitt gjennomsnitt 3

int randomint(int nedre, int oevre); // Trekker uniformt fordelte helttall, nedre <= randomint <= oevre Simuleringsprogrammet skal bruke classen Queue til å representere en kø med kunder. Etter at simuleringen er ferdig, skal programmet skrive ut gjennomsnittlig ventetid i kø for betjente kunder. Hint: Lag en egen klasse for kundene som kan lagre ankomsttid, slik at du kan legge slike kundeobjekter inn i kø. Kassene kan representeres som boolean variable som angir om en kasse er ledig eller opptatt. (slutt på oppgave 1.4) Del 2 - Sorteringsalgoritmer Vi skal her se på problemet med å velge riktig sorteringsalgoritme i noen ulike situasjoner. I hvert av punktene a) - g) nedenfor skal du foreslå en algoritme som kan brukes for å løse problemet effektivt. Hovedkriteriet for valg av sorteringsalgoritme er kjøretid (arbeidsmengde), andre krav til metoden som skal brukes er gitt i hver enkelt oppgave. Gi en kort begrunnelse for hvert valg. Det er er tilstrekkelig å henvise til metoder og resultater som er gitt i pensum, du behøver ikke programmere eller beregne noe i denne oppgaven. a) Flere tusen enkeltarrayer, hver med over over femti tusen heltall, skal sorteres så raskt som mulig. Innholdet av hver enkelt array er godt blandet, slik at ingen av de sorteringsmetodene vi kjenner til får noen spesielle fordeler eller ulemper. Det er god plass i RAM til ekstra datastruktur, men vi vet ikke noe om hvor store tallene kan være. Det er her den totale kjøretiden for alle sorteringene som er av størst betydning. b) Samme situasjon som i punkt a), men hver array inneholder nå bare omkring 10 heltall. c) Samme situasjon som i punkt a), men hver array inneholder nå bare omkring 1000 heltall. I tillegg er alle arrayene nesten riktig sortert, det er bare noen få elementer som står feil i hver array. d) I et interaktivt program må brukerne ofte vente på at programmet skal sortere ca. femti tusen reelle tall. Det er svært lite RAM tilgjengelig i programmet, og ikke minst er det viktig at man kan garantere at sorteringen vil gå meget raskt. e) Flere millioner tegnstrenger skal sorteres. Strengene består av maksimalt 12 tegn. Tidsforbruket til sorteringen skal være proporsjonalt med antall strenger som skal sorteres. f) Flere hundre tusen heltall skal sorteres. Det er et krav at sorteringsmetoden som brukes er raskere enn f.eks. instikksortering, men den skal være ikke-rekursiv og samtidig enkel å programmere. g) En array inneholder hundre tusen positive heltall, alle mindre enn 1000. Arrayen skal sorteres i lineær tid, med så lite ekstra forbruk av RAM som mulig. (slutt på del 2) 4

Del 3 - Binære søketrær og hashtabeller Statistisk Sentralbyrå har bestemt seg for å lage et register over hjemmedatamaskiner som er tilknyttet internettet i Norge. Registeret vil etterhvert kunne inneholde data om flere hundre tusen maskiner. Følgende data skal registreres om hver maskin (du kan for å forenkle problemet anta at en person bare kan eie én datamaskin): fabrikat (Dell, Compaq, IBM, Mac, etc) operativsystem (lagret som et heltall) fødselsnummer for eier av maskinen plass på harddisk, i gigabytes størrelse på RAM, i megabytes hastighet på nettforbindelse, i Kbit/s navnet på internettleverandør antall registrerte systemfeil pr. år String int (0: Windows, 1: Unix/Linux 2: MacOs, 3: Annet) long (heltall med 11 desimale siffer) float int float String int Dataene om hver maskin skal lagres som en node i et vanlig (ikke AVL) binært søketre. Dette søketreet skal være sortert på eierens fødselsnummer. Man skal kunne ha tilgang til treet gjennom en referanse til den noden som er rot i søketreet. Oppgave 3.1 Definer en class node for en node i et binært søketre, som kan brukes til å lagre informasjonen om en datamaskin som er angitt ovenfor. I tillegg til dataene om en maskin, må klassen inneholde referanser til nodens barn i treet. Du behøver ikke skrive konstruktører eller metoder for å sette inn eller lese av verdier i klasseobjektene. (slutt på oppgave 3.1) Oppgave 3.2 node sett_inn( node rot, node ny) som setter inn objektet ny (som vi antar inneholder korrekt informasjon om en datamaskin) riktig i det binære søketreet som har rot i noden rot. Metoden skal returnere roten i treet. Du kan selv velge om du vil lage metoden sett_inn iterativ eller rekursiv. (slutt på oppgave 3.2) Oppgave 3.3 void skriv_unix(node rot) som skriver ut fødselsnummer til eier og navnet på internettleverandøren, for alle maskiner som bruker Unix/Linux som operativsystem. Utskriften skal være sortert på fødselsnummer. Parameteren rot er roten i søketreet med informasjon om datamaskiner. (slutt på oppgave 3.3) 5

Oppgave 3.4 void sett_ms_standard(node rot) som setter antall registrerte systemfeil pr. år lik 100 for alle maskiner i søketreet som bruker Windows som operativsystem. (slutt på oppgave 3.4) Oppgave 3.5 Anta at det er n noder i søketreet. Hva er arbeidsmengden, uttrykt med O-notasjon, til hver av metodene som du har laget i oppgavene 3.2, 3.3 og 3.4? (slutt på oppgave 3.5) Antallet registrerte maskiner blir etterhvert så stort at Statistisk Sentralbyrå trenger å flytte dataene til en struktur som er enda raskere enn det binære søketreet. De bestemmer seg for å bruke en hashtabell, med lineær probing for løsning av kollisjonsproblemet. Denne hashtabellen skal inneholde referanser til objekter av typen node, som du har laget tidligere i denne oppgaven (dette betyr at objektene i hashtabellen vil inneholde to referanser til barn som ikke brukes, men det er uten betydning her). Hashindeksene skal beregnes ut i fra fødselsnummeret til eier av maskinen. Du kan anta at arrayen som skal inneholde hashtabellen ligger globalt tilgjengelig som: node hashtabell[]; I utgangspunktet skal alle elementene i arrayen hashtabell være lik null. Oppgave 3.6 Skissér eller programmer en metode void hash_soeketre(node rot, int n) som legger dataene om alle maskiner i søketreet med rot i noden rot, inn i arrayen hashtabell. Parameteren n er lik antall noder i søketreet. Vis spesielt hvordan programmet ditt beregner hashindekser og gjør innsetting (med løsing av kollisjoner ved bruk av lineær probing). Disse to operasjonene bør du skille ut som egne metoder. Programmet skal også opprette (sette av plass til) hashtabellen før innsettingen begynner. Du kan her anta at du har tilgjengelig en metode int neste_primtall(int i) som returnerer minste primtall som er større eller lik parameteren i. (slutt på oppgave 3.6) 6