Fakultet for naturvitenskap og teknologi EKSAMENSOPPGAVE Eksamen i: INF-1101 Datastrukturer og algoritmer Dato: 18.05.2016 Klokkeslett: 09:00 13:00 Sted: Teorifagbygget, hus 3, 3.218 Tillatte hjelpemidler: Ingen Type innføringsark (rute/linje): Antall sider inkl. forside: Kontaktperson under eksamen: 5 Robert Pettersen Telefon/mobil: 47 24 75 52 NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen Postboks 6050 Langnes, N-9037 Tromsø / 77 64 40 00 / postmottak@uit.no / uit.no
Bokmål Side 2 av 5 sider Eksamen INF-1101 Datastrukturer og algoritmer Vår 2016 Eksamenssettet består av 4 oppgaver. Les oppgaveteksten grundig og disponer tiden slik at du får tid til å svare på alle oppgavene. I noen oppgaver kan det være nødvendig å tolke oppgaveteksten ved å gjøre noen antagelser - gjør i så fall rede for hvilke antagelser du har gjort, men pass på å ikke gjøre antagelser som trivialiserer oppgaven. Der du skal utvikle eller beskrive en algoritme anbefales det at du først beskriver algoritmen på et høyt abstraksjonsnivå, f.eks. med figurer, før du går videre med detaljer og eventuell pseudokode. Dersom det spørres etter en implementasjon i C kreves det ikke 100% syntaktisk korrekt kode. Dersom det spørres etter pseudokode kan du kan også skrive rein C-kode om du ønsker. Dersom du blir bedt om utvikle en algoritme er det implisitt at en algoritme med best mulig kompleksitet er å foretrekke. Husk også at du kan referere tilbake til funksjoner du tidligere har definert. Oppgave 1-25% Gitt to array A og B som begge inneholder N heltall. Du kan anta at et tall ikke forekommer mer enn en gang i hvert array. (a) Skisser i pseudo-kode en funksjon som avgjør hvor mange tall som forekommer i både A og B. (b) Skisser i pseudo-kode en funksjon som avgjør om det finnes en sekvens av 3 etterfølgende heltall som forekommer i både A og B. For eksempel, dersom A inneholder 1, 4, 5, 7, 2 og B inneholder 3, 1, 4, 5, 9, ser vi at sekvensen 1, 4, 5 forekommer i både A og B. INF-1101 Datastrukturer og algoritmer
Bokmål Side 3 av 5 sider Oppgave 2-25% (a) Gitt en heap som inneholder tallene 5, 7, 12, 13, 18, 8, 0. Vis med figur hvordan en slik gyldig heap kan se ut: (1) Representert som et tre. (2) Representert som et array. Merk: du behøver ikke ta hensyn til innsettingsrekkefølge. (b) En prioritetskø ADT kan også implementeres ved hjelp av en binomisk kø ( binomial queue ). Forklar kort hvordan operasjonene insert og delmin utføres på en binomisk kø. INF-1101 Datastrukturer og algoritmer
Bokmål Side 4 av 5 sider Oppgave 3-25% Anta at du har fått i oppgave å lage en SMS meldingstjeneste for en bedrift som tilbyr en web-basert kalendertjeneste til sine kunder: 30 minutter før en avtale i en kundes kalender skal det sendes en SMS med informasjon om avtalen til kunden. Sentralt i implementasjonen av denne SMS tjenesten er en abstrakt datatype (ADT) som orkestrerer når en SMS skal sendes. Anta at følgende funksjoner inngår i ADT grensesnittet: // Registrer ny alarm void insertalarm(void *avtale, int alarmtime); // Returner antall sekunder til første alarm int firstalarm(void); // Fjern og returner første alarm void *removefirstalarm(void); Du kan anta at det eksisterer en funksjon gettimeofday() som returnerer nåværende tid. Videre kan du anta at alarmtime - gettimeofday() gir deg antall sekunder til en SMS skal sendes angående korresponderende avtale. Når en kunde setter inn en ny avtale i sin kalender registreres tidspunktet for sending av SMS via insertalarm(). firstalarm() benyttes for å finne, blant alle registrerte alarmer, antall sekunder til neste SMS skal sendes. removefirstalarm() fjerner og returnerer, blant alle registrerte alarmer, første alarm som skal gå av (alarmtime - gettimeofday() må være mindre eller lik 0 for denne alarmen). Velg en underliggende datastruktur og skisser i pseudo-kode en implementasjon av hver av funksjonene i grensesnittet. INF-1101 Datastrukturer og algoritmer
Bokmål Side 5 av 5 sider Oppgave 4-25% Gitt følgende datastruktur som beskriver en node i et binærtre: typedef s t r u c t node node_t ; s t r u c t node { node_t l e f t ; // V e n s t r e s u b t r e node_t r i g h t ; // Høyre s u b t r e } ; (a) Hva er definisjonen av dybden til et tre? Skriv en rekursiv funksjon i C som beregner dybden i et binærtre, med følgende signatur: // Returner dybden til et binærtre, gitt rota av treet int depth(node_t *root); (b) Skriv en ikke-rekursiv variant av funksjonen i a). pseudokode om ønskelig. Du kan benytte (c) Hva er forskjellen på et binærtre og et binært søketre? Utvid definisjonen av struct node slik at den kan brukes til å representere en node i et binært søketre med heltall som nøkler. (d) Implementer i C eller pseudokode en algoritme for å skrive ut alle nøklene i et binært søketre i motsatt sortert rekkefølge. Anta at nøklene er heltall - utskriften skal altså begynne med det største tallet og avslutte med det minste. Du kan bruke rekursjon om ønskelig. INF-1101 Datastrukturer og algoritmer
Fakultet for naturvitenskap og teknologi EKSAMENSOPPGÅVE Eksamen i: INF-1101 Datastrukturar og algoritmar Dato: 18.05.2016 Klokkeslett: 09:00 13:00 Stad: Teorifagbygget, hus 3, 3.218 Lovlege hjelpemiddel: Ingen Type innføringsark (rute/linje): Antall sider inkl. forside: Kontaktperson under eksamen: 5 Robert Pettersen Telefon/mobil: 47 24 75 52 NB! Det er ikkje lov å levere inn kladd saman med svaret Postboks 6050 Langnes, N-9037 Tromsø / 77 64 40 00 / postmottak@uit.no / uit.no
Nynorsk Side 2 av 5 sider Eksamen INF-1101 Datastrukturar og algoritmar Vår 2016 Eksamenssettet består av 4 oppgåver. Les oppgåveteksten grundig og disponer tida slik at du får tid til å svara på alle oppgåvene. I nokre oppgåver kan det vera naudsynt å tolka oppgåveteksten ved å gjera nokre føresetnader (antakelser) - gjer i så fall greie for kva slags føresetnader du har gjort, men pass på å ikkje gjera føresetnader som trivialiserer oppgåva. Der du skal utvikla eller skildra ein algoritme tilrådast det at du først skildrar algoritmen på eit høgt abstraksjonsnivå, t.d. med figurar, før du går vidare med detaljar og eventuell pseudokode. Dersom det vert spurt etter ein implementasjon i C krev det ikkje 100% syntaktisk korrekt kode. Dersom det vert spurt etter pseudokode kan du òg skriva rein C-kode om du ynskjer. Dersom du vert beden om å utvikla ein algoritme er det implisitt at ein algoritme med best mogleg kompleksitet er å føretrekka. Husk òg at du kan referera attende til funksjonar du tidlegare har definert. Oppgåve 1-25% Gitt to array A og B som begge inneheld N heiltal. Du kan anta at eit tal ikkje finst meir enn ein gong i kvart array. (a) Skisser i pseudo-koden ein funksjon som avgjer kor mange tal som finst i både A og B. (b) Skisser i pseudo-koden ein funksjon som avgjer om det finst ein sekvens av 3 etterfølgjande heiltal som finst i både A og B. Til dømes, dersom A inneheld 1, 4, 5, 7, 2 og B inneheld 3, 1, 4, 5, 9, ser vi at sekvensen 1, 4, 5 finst i både A og B. INF-1101 Datastrukturar og algoritmar
Nynorsk Side 3 av 5 sider Oppgåve 2-25% (a) Gitt ein heap som inneheld tala 5, 7, 12, 13, 18, 8, 0. Vis med figur korleis ein slik gyldig heap kan sjå ut: (1) Representert som eit tre. (2) Representert som eit array. Merk: du treng ikkje ta omsyn til innsetjingsrekkefølgje. (b) Ein prioritetskø ADT kan òg implementerast ved hjelp av ein binomisk kø ( binomial queue ). Forklar kort korleis operasjonane insert og delmin vert utført på ein binomisk kø. INF-1101 Datastrukturar og algoritmar
Nynorsk Side 4 av 5 sider Oppgåve 3-25% Anta at du har fått i oppgåve å laga ei SMS meldingsteneste for eit føretak som tilbyr ei web-basert kalenderteneste til kundane sine: 30 minutt før ein avtale i ein kunde sin kalender skal det sendast ein SMS med informasjon om avtalen til kunden. Sentralt i implementasjonen av denne SMS tenesta er ein abstrakt datatype (ADT) som orkestrerer når ein SMS skal sendast. Anta at følgjande funksjonar inngår i ADT grensesnittet: // Registrer ny alarm void insertalarm(void *avtale, int alarmtime); // Returner mengd sekund til første alarm int firstalarm(void); // Fjern og returner første alarm void *removefirstalarm(void); Du kan anta at det eksisterer ein funksjon gettimeofday() som returnerer noverande tid. Vidare kan du anta at alarmtime - gettimeofday() gjev deg mengd sekund til ein SMS skal sendast andsynes korresponderande avtale. Når ein kunde set inn ein ny avtale i kalenderen sin vert tidspunktet registrert for sending av SMS via insertalarm(). firstalarm() nyttast for å finna, blant alle registrerte alarmar, mengd sekund til neste SMS skal sendast. removefirstalarm() fjernar og returnerer, blant alle registrerte alarmar, første alarm som skal gå av (alarmtime - gettimeofday() må vera mindre eller lik 0 for denne alarmen). Vel ein underliggende datastruktur og skisser i pseudo-kode ein implementasjon av kvar av funksjonane i grensesnittet. INF-1101 Datastrukturar og algoritmar
Nynorsk Side 5 av 5 sider Oppgåve 4-25% Gitt følgjande datastruktur som skildrar ein node i eit binærtre: typedef s t r u c t node node_t ; s t r u c t node { node_t l e f t ; // V e n s t r e s u b t r e node_t r i g h t ; // Høgre s u b t r e } ; (a) Kva er definisjonen av djupna til eit tre? Skriv ein rekursiv funksjon i C som bereknar djupna i eit binærtre, med følgjande signatur: // Returner djupna til eit binærtre, gjeve rota av treet int depth(node_t *root); (b) Skriv ein ikkje-rekursiv variant av funksjonen i a). pseudokode om ynskjeleg. Du kan nytta (c) Kva er skilnaden på eit binærtre og eit binært søketre? Utvid definisjonen av struct node slik at han kan brukast til å representera ein node i eit binært søketre med heiltal som nøklar. (d) Implementer i C eller pseudokode ein algoritme for å skriva ut alle nøklane i eit binært søketre i motsett sortert rekkjefølgje. Anta at nøklane er heiltal - utskriften skal altså byrja med det største talet og avslutta med det minste. Du kan bruka rekursjon om ynskjeleg. INF-1101 Datastrukturar og algoritmar