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.

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

Flerveis søketrær og B-trær

KONTINUASJONSEKSAMEN

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

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

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

Emnekode: LV121A Dato: Alle skrevne og trykte hjelpemidler

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

EKSAMEN med løsningsforslag

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

Definisjon: Et sortert tre

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

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

Definisjon av binært søketre

EKSAMEN. Algoritmer og datastrukturer

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:

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

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

UNIVERSITETET I OSLO

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

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

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

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

UNIVERSITETET I OSLO

Eksamen i Algoritmer og Datastrukturer Torsdag 12. januar 1995, Kl

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

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

Obligatorisk oppgave 1 INF1020 h2005

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer IAI 21899

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

København 20 Stockholm

Løsningsforslag til INF110 h2001

Algoritmer og datastrukturer Eksamen 22. februar 2011

Et eksempel: Åtterspillet

KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET ER FULLSTENDIG

EKSAMEN. Emne: Algoritmer og datastrukturer

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Kapittel 1. Potensregning

MAT1030 Forelesning 30

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

EKSAMEN. Emne: Algoritmer og datastrukturer

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

A 1 B 1 D 1 H 1 H 2 D 2 B 2 E 1 E 2 I 1 I 2...

Rekursiv programmering

Framgangsmåte for å løse oblig 4 i INF1000

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

UNIVERSITETET I OSLO

Ny EKSAMEN. Operativsystemer og nettverk

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Oppgave 1. Sekvenser (20%)

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

TDT4102 Prosedyreog objektorientert programmering Vår 2016

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

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

UNIVERSITETET I OSLO

Løsningsforslag EKSAMEN

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

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

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

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

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

VEILEDNING BRUK AV NY LØSNING FOR PERIODISERING AV BUDSJETTER I MACONOMY

Forelesning 9 mandag den 15. september

GJØVIK INGENIØRHØGSKOLE

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

UNIVERSITETET I OSLO

Datastrukturer for rask søking

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

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

KONTINUASJONSEKSAMEN

Lars Vidar Magnusson

UNIVERSITETET I OSLO

Repetisjon: høydepunkter fra første del av MA1301-tallteori.

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Anvendelser av grafer

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

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

UNIVERSITETET I OSLO

Transkript:

Eksamen i ALGORITMER OG DATASTRUKTURER Høgskolen i Østfold Avdeling for Informatikk og Automatisering Onsdag 11.desember, 1996 Kl. 9.00-15.00 Tillatte hjelpemidler: Alle trykte og skrevne. Kalkulator. Oppgavesettet består av 6 sider, inkludert forsiden, og er delt i 3 deler som kan løses helt uavhengig av hverandre. All programkode skal skrives i C++. Koden bør være oversiktlig og godt kommentert. Les oppgavetekstene nøye før du begynner på besvarelsen. Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 1

DEL 1 - Et hjelpeprogram for løsing av kryssord (30 %) Problemet i del 1 av dette oppgavesettet er beslektet med noen av de problemene vi har sett på i forbindelse med emnet "rekursjon og backtracking". Oppgavene dreier seg om å skrive programmer som kan lage og skrive ut forslag til ord som kan passe som løsninger i kryssord. Som en deloppgave i løsing av kryssord inngår å finne norske ord av en gitt lengde. Et ord er en sekvens av de 29 store bokstavene A - Å. I det følgende skal vi ikke betrakte bokstaver direkte, men i stedet representere dem ved heltallene 1-29, slik at bokstaven A svarer til tallet 1, B til tallet 2, C til 3, osv. Til å lagre ordene som skal skrives ut, skal det brukes en global heltallsvektor (array): int ord[n]; Denne vektoren er tilgjengelig for alle programmene du skal skrive. n er her en globalt definert konstant, som angir lengden på ordet. Hvis f.eks. konstanten n har verdien 5, og innholdet av vektoren ord er: 2 1 14 1 14 svarer dette til at ordet BANAN er lagret i vektoren ord (B=2, A=1, N=14). Merk altså at vektoren ikke er en permutasjonsvektor, siden samme bokstav (representert som et tall) kan forekomme flere ganger i et ord. Oppgave 1.1 Lag en enkel funksjon: void skriv_ord(); som skriver ut, til standard utenhet (skjerm), det ene ordet som er lagret i den globale vektoren ord. Ordet skal skrives ut med norske bokstaver på en egen linje på skjermen. (Slutt på oppgave 1.1) Når man løser kryssord, er det ofte slik at man kjenner bare en eller noen få av bokstavene i et løsningsord. Til å representere disse bokstavene som allerede er bestemt/fastlagt i ordet, skal vi bruke enda en globalt tilgjengelig heltallsvektor av lengde n : int bestemt[n]; Vektoren bestemt vil inneholde de bokstavene vi vet skal være i løsningsordet, satt inn på riktig plass i ordet og representert med tall fra 1 til 29, på samme måte som for vektoren ord. De bokstavene i ordet som vi ikke har funnet, representeres ved at det står en 0 (null) i den tilsvarende posisjonen i vektoren bestemt. Hvis f.eks. konstanten n har verdien 5, og innholdet av vektoren bestemt er: 0 2 0 14 0 betyr dette at første, tredje og femte bokstav i ordet vi skal finne er ukjente, mens vi vet at andre bokstav skal være en B og fjerde bokstav skal være en N. I de to neste oppgavene skal vi anta at vektoren bestemt er satt opp riktig på forhånd, slik at den inneholder alle de kjente bokstavene som skal være i alle forslagene til løsningsord som programmene våre skal skrive ut. Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 2

Oppgave 1.2 Skriv en rekursiv funksjon: void lag_ord(int i); som skriver ut, til standard utenhet (skjerm), alle mulige forslag til løsningsord med n bokstaver. Ordene som skrives ut skal alle inneholde, på riktig plass, de bokstavene som er fastlagt i vektoren bestemt. Funksjonen du lager skal fungere slik: alle forslagene til ord skal bygges opp og lagres i den globale vektoren ord. parameteren i skal tilsvare en indeks i vektoren ord, slik at funksjonen skal sette inn alle mulige bokstaver (representert som tall) på indeks i i ord, og deretter rekursivt sette inn alle mulige bokstaver i resten av vektoren. Kallet lag_ord(0) vil da lage og skrive ut alle løsningsforslagene. ordene skal skrives ut i alfabetisk rekkefølge. Hvis f.eks. vektoren bestemt inneholder de fastlagte bokstavene som er gitt i eksemplet på forrige side, skal første forslag til ord som skrives ut være ABANA, og det siste skal være ÅBÅNÅ. (Slutt på oppgave 1.2) Løsningen i oppgave 1.2 vil fungere dårlig, fordi funksjonen vil skrive ut svært mange "ord" som ikke finnes i det norske språket. F.eks. er det rimelig sjelden at et norsk ord inneholder tre Å'er i rekkefølge. For at vi skal kunne lage en bedre versjon av lag_ord, har en eller annen smarting programmert følgende funksjon: int lovlig(char c_1, char c_2, char c_3); Denne funksjonen returnerer TRUE (1) hvis tegnene c_1, c_2 og c_3 er tre bokstaver som kan forekomme i denne rekkefølgen direkte etter hverandre i norske ord. Hvis denne tegnsekvensen ikke kan forekomme i norske ord, returnerer funksjonen FALSE (0). Vi antar at funksjonen lovlig er ferdig programmert (du skal ikke lage denne selv) og globalt tilgjengelig, slik at den kan kalles direkte fra funksjonen du skal skrive i neste oppgave. Oppgave 1.3 Skriv om funksjonen lag_ord fra oppgave 1.2. Funksjonen skal nå bare skrive ut "ord" som er slik at enhver sekvens av tre påfølgende bokstaver i ordet er en tegnsekvens som forekommer i norske ord. Funksjonen bør også kunne håndtere ord med mindre enn tre bokstaver på en fornuftig måte. (Slutt på oppgave 1.3) Oppgave 1.4 Hva er arbeidsmengden til funksjonen skriv_ord i oppgave 1.1, uttrykt med O-notasjon? Hvorfor er det, på bakgrunn av opplysningene gitt i denne oppgaven, vanskelig å bestemme arbeidsmengdene til funksjonene du har skrevet i oppgavene 1.2 og 1.3? (Slutt på oppgave 1.4) Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 3

DEL 2 - Valg av datastruktur (30 %) I denne delen av eksamen skal du, for noen forskjellige problemstillinger, komme med forslag til hvilken type datastruktur (sortert/usortert vektor, liste, søke/avl-tre, nabomatriser, osv.) som egner seg best til å lagre dataene internt i programmet for hvert enkelt problem. Oppgave 2.1 Hvert av punktene a) - f) nedenfor beskriver et program som skal lages for å håndtere en mengde med data. For hvert delpunkt skal du angi hvilken datastruktur du tror er best å bruke til å lagre dataene, og også gi en kort begrunnelse for valget av datastruktur. Du kan bare foreslå datastrukturer som er omtalt i pensumet for dette kurset. For hvert problem gjelder at alle dataene får plass i maskinens primærhukommelse (RAM). Det skal i hovedsak legges vekt på effektivitet av programmene, dvs. at operasjonene som skal gjøres kan utføres raskt. I tillegg er det i hvert av punktene nedenfor angitt ekstra krav som skal kunne oppfylles ved riktig valg av datastruktur. a) Data om samtlige innbyggere i Norge fra år 1900 til 1990 skal brukes i et program. Ved oppstart av programmet leses alle datene inn i RAM fra en diskfil, og de skal ikke forandres eller oppdateres under kjøring av programmet. Alle innbyggerne har et entydig fødselsnummer, og brukerne av programmet skal kunne søke effektivt etter informasjon om en innbygger ved å angi innbyggerens fødselsnummer. Det er svært lite ekstra plass tilgjengelig i maskinens hukommelse for pekere og hjelpevariable. b) Opplysninger om flere hundre tusen studenter skal registreres i et interaktivt registreringsprogram.vi vet ikke på forhånd hvor mange registreringer som vil bli gjort, men det er god plass i maskinens hukommelse til f.eks.å lagre pekere o.l. sammen med dataene for hver student. Dataene vil bli registrert/tastet inn i helt tilfeldig rekkefølge, og skal på en eller annen måte ligge sortert etter studentenes entydige fødselsnummer. Det er viktig for brukerne av programmet at innsetting, fjerning og gjenfinning av data kan utføres raskt. Programmet skal lages av det beryktede software-firmaet "Bugs-While- U-Wait", som helst ikke bør få i oppgave å implementere svært kompliserte algoritmer. c) Nesten samme problem som i punkt b) ovenfor, men under registrering av opplysninger vil nå svært mange av student-dataene bli tastet inn i sortert rekkefølge. Selve programmeringsjobben skal denne gangen utføres av en tidligere student fra Høgskolen i Østfold, som er meget flink og nøyaktig. d) Igjen nesten samme problem som i punkt b) ovenfor, men vi vet nå på forhånd hvor mange studenter som skal registreres. Dette skal utnyttes slik at innsetting, søking og fjerning av data kan gjøres nesten like raskt uansett hvor mange studenter som er registrert. Du kan som i punkt c) anta at det er en noenlunde kompetent person som skal lage programmet. e) I et interaktivt system for kundebehandling hos en bedrift som selger datautstyr, skal det fortløpende registreres opplysninger om kunder som venter på å få tilsendt bestilte varer. Kunden som har bestilt varer for det største beløpet skal alltid behandles først. Programmet skal kunne registrere nye bestillinger effektivt og også kunne finne igjen og fjerne/betjene neste kunde meget raskt. Det kan være et svært stort antall kunder som venter på behandling av sine ordre, og det er ikke plass i maskinen til å lagre ekstra pekere o.l. for hver kunde. f) Et program skal representere og behandle informasjon om et stort antall datamaskiner som er koblet sammen i et nettverk. For hver maskin (eller node i nettverket) skal det bl.a. finnes informasjon om hvilke andre maskiner som denne noden er direkte koblet opp mot og også hvor lang tid det tar å sende et signal over hver av disse direkte koblingene. Vi vet ikke på forhånd hvor mange maskiner det er i nettverket, men vi vet at nettet maksimalt kan ha N noder. Informasjonen skal helst lagres så effektivt som mulig. Programmet skal kunne legge inn informasjon om nye maskiner som kobles inn i nettverket, og skal være i stand til bl.a å kunne finne den raskeste veien som et signal kan følge mellom to noder. (Slutt på oppgave 2.1) Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 4

DEL 3 - Binære søketrær (40 %) I den siste delen av eksamen skal du programmere noen funksjoner som opererer på binære søketrær. Dataene som lagres i hver node i treet er et heltall og en enkelt bokstav. Nodene har som vanlig pekere til venstre og høyre barn. I tillegg har hver node en peker til foreldernoden (forgjengeren) i treet. Disse pekerne til foreldernoder skal kun brukes i oppgave 3.4. Nodene har også en heltallsvariabel sum som bare skal brukes i oppgave 3.3. Følgende klasse skal brukes til å lagre hver node i søketreet: class tre_node { public: tre_node(); // Konstruktør, skal ikke programmeres int verdi; // Heltallsverdi som lagres i hver node char bokstav; // Bokstav/tegn som lagres i hver node int sum; // Brukes bare i oppgave 3.3 tre_node *v, *h; // Pekere til venstre og høyre barn tre_node *forelder; // Brukes bare i oppgave 3.4 private: }; Hvis venstre og/eller høyre subtre til en node er tomt, vil pekerne v og/eller h i noden ha verdien 0 (null). Vi krever ikke at søketreet skal være balansert. Nodene i søketreet ligger ordnet/sortert på variabelen verdi i hver node, slik at alle heltallsverdier i en nodes venstre subtre er mindre eller lik verdien i noden selv (hvis venstre subtre ikke er tomt), mens alle verdier i nodens høyre subtre er større enn verdien i noden (hvis høyre subtre ikke er tomt). Det kan altså finnes flere forekomster av samme verdi i treet. Hele søketreet kan representeres med en peker til roten i treet. Oppgave 3.1 Lag en funksjon: void skriv_bokstav(tre_node *rot, int x); Parameteren rot peker her til roten i et søketre. Funksjonen skal skrive ut, til standard utenhet (skjerm), verdien av variabelen bokstav for alle de nodene i treet som har en heltallsverdi (variabelen verdi) lik verdien av parameteren x. For noder som ikke har verdi lik x, skal det ikke gjøres noen utskrift. Funksjonen du lager skal helst være så effektiv som mulig, men du kan selv velge om du vil lage den rekursiv eller iterativ. (Slutt på oppgave 3.1) Oppgave 3.2 Anta at det er totalt N noder i søketreet.bruk O-notasjon til å angi en øvre grense for arbeidsmengden til funksjonen skriv_bokstav fra oppgave 3.1, hvis: a) Søketreet er balansert. b) Alle nodene i treet (unntatt én) har bare ett subtre som ikke er tomt. (Slutt på oppgave 3.2) Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 5

Oppgave 3.3 Hver av nodene i søketreet har, i tillegg til variabelen verdi som inneholder nodens nøkkelverdi, også en heltallsvariabel sum. I denne oppgaven antar vi at variabelen sum i utgangspunktet er satt lik 0 (null) i alle noder. Lag en funksjon: void sett_sum(tre_node *rot); som, for hver node i søketreet, setter variabelen sum lik summen av alle (nøkkel)verdiene i nodens subtrær pluss verdien (av variabelen verdi) i noden selv. Parameteren rot peker her til roten i søketreet. Funksjonen sett_sum skal være rekursiv. (Slutt på oppgave 3.3) Oppgave 3.4 I denne oppgaven skal du lage en funksjon: void sett_forelder(tre_node *rot); som, for hver node i søketreet, setter pekervariabelen forelder til å peke på nodens forgjenger (foreldernode) i treet. Du kan anta at pekeren forelder i utgangspunktet har en vilkårlig (ikke bestemt) verdi i hver node. Roten i treet (representert ved parameteren rot), skal få pekeren forelder satt lik 0 (null). (Slutt på oppgave 3.4) Oppgave 3.5 Til å representere nodene i en toveis (dobbeltlenket) liste, brukes følgende klasse: class liste_node { public: liste_node(); int verdi; liste_node *neste; liste_node *forrige; private: }; // Konstruktør // Heltallsverdi/data i hver node // Peker til neste node i listen // Peker til forrige node i listen Lag en funksjon: liste_node *lag_sortert_liste(tre_node *rot); som returnerer en peker til første node i en toveis liste. Denne listen, som skal lages av funksjonen, skal inneholde det samme antall noder og de samme verdiene som i søketreet gitt ved parameteren rot (med verdier menes her tallene som ligger i variabelen verdi i hver node i søketreet). Listen som returneres skal være sortert i stigende rekkefølge på variabelen verdi. (Slutt på oppgave 3.5) Eksamen i Algoritmer og Datastrukturer, 11.desember 1996 6