Mästarprov 1: Algoritmer

Algoritmer, datastrukturer och komplexitet
hösten 2011
Mästarprov 1: Algoritmer
Mästarprovet ska lösas individuellt och redovisas både skriftligt och muntligt. Inget samarbete är tillåtet, se vidare hederskodexen. Du ska alltså inte diskutera lösningar med någon
annan fram till dess att alla muntliga redovisningar är avklarade.
Skriftliga lösningar ska lämnas senast måndag 10 oktober klockan 9.15 på föreläsningen eller senast klockan 9.00 samma dag i kursens inlämningslåda på studentexpeditionen
på Osquars backe 2, plan 2. Det är viktigt att du lämnar in i tid! Skriv ditt namn och personnummer överst på framsidan. Se till att spara en kopia av dina lösningar så att du kan läsa på
inför den muntliga redovisningen som kommer att ske 17–21 oktober för någon av lärarna. Boka tid för en femton minuters muntlig redovisning på kurswebbsidan senast 10 oktober
klockan 9. Bokningslistorna läggs upp senast 5 oktober. Om du inte hinner göra uppgiften så
avbokar du enkelt din bokning.
Det är viktigt att du förbereder dig inför den muntliga redovisningen. För att en uppgift
ska godkännas ska du kunna förklara och motivera algoritmen muntligt och reda ut eventuella
oklarheter.
Läs uppgifterna mycket noga så att du inte råkar basera dina lösningar på en missuppfattning. Fråga en lärare på kursen om något är oklart.
Mästarprovet är ett obligatoriskt moment i kursen. Det består av tre uppgifter som motsvarar betygskriterierna för E, C respektive A. För godkänt (betyg E) krävs helt rätt på en av
uppgifterna. Helt rätt på två av uppgifterna ger betyg C och alla rätt ger betyg A. Ett mindre
fel på en uppgift sänker betyget ett steg. Läs mer om betyg på kursens webbsida.
1. Multiplikation av binära tal
Betygskriterium: utveckla algoritmer med datastrukturer för enkla problem givet en konstruktionsmetod.
På föreläsningen om dekompositionsmetoder gick vi igenom hur man kan multiplicera
två heltal i binär form genom att dela binärutvecklingarna mitt itu. I denna uppgift ska
du konstruera en algoritm som delar talen i tre delar.
Konstruera en algoritm M ultiply(x, y, n) som multiplicerar n-bitstalen x och y. Indata
är två bitarrayer x och y indexerade från 0 till n − 1, där x[0] och y[0] är de minst
signifikanta (dvs högraste) bitarna i talen x och y. Returvärdet är en bitarray med 2n
bitar.
Algoritmen ska använda dekomposition genom att dela upp talens binärutvecklingar i
tre lika stora delar.
Du kommer att behövs skriva en hjälpfunktion Add(x, y, n) som adderar två n-bitsheltal
i linjär tid.
Beskriv algoritmen med pseudokod. Analysera algoritmens tidskomplexitet (med bitkostnad). Den får inte vara större än tidskomplexiteten för den vanliga multiplikationsalgoritmen (skolboksmetoden), alltså O(n2 ).
Vänd!
1
2. Hotellönskemål
Betygskriterium: utveckla algoritmer med datastrukturer för icketriviala problem.
Till OS i London kommer förutom idrottsutövare ett stort antal (n stycken) journalister,
och därför har arrangörerna förbokat ett stort antal (m > n) hotellrum. Tyvärr är
det inte alldeles enkelt att fördela rummen eftersom de olika journalisterna har diverse
behov, önskemål och smak. Ett rum kan vara rökfritt, ha internetanslutning, mini-bar,
och/eller kabel-TV. En journalist i sin tur kan vara rökare eller icke-rökare, behöva eller
inte behöva internetanslutning, behöva(?) eller inte behöva mini-bar och/eller kabel-TV.
En journalist som är icke-rökande absolutist, behöver internetanslutning och aldrig tittar
på TV är nöjd så länge rummet är rökfritt och han kan koppla upp sin dator. Det spelar
ingen roll om det finns mini-bar eller kabel-TV.
Arrangörerna vill vara så många journalister som möjligt till lags (annars blir det dålig
PR), och vill därför att så många som möjligt ska få alla sina behov tillfredsställda. Hjälp
dem genom att konstruera och analysera tidskomplexiteten för en effektiv algoritm som
fördelar rummen så att så många som möjligt får ett rum som stämmer med deras
önskemål. Din algoritm får anropa kända algoritmer från kurslitteraturen.
Motivera att algoritmen är korrekt.
3. Träning i sjukhuskorridorer
Betygskriterium: utveckla algoritmer med datastrukturer för svårare problem med den
metod som passar bäst.
Chefen för ett nybyggt sjukhus har kommit på att patienter som behöver motionera bör
göra det genom att gå från receptionen upp till översta våningen och sen tillbaka. Det
finns många trappor att välja på från en våning till nästa, men chefen vill att patienterna
ska använda den jobbigaste vägen. Hjälp henne att räkna ut denna väg!
Sjukhuset består av n stycken våningar numrerade från 1 till n. Varje våning består
av en m meter lång korridor. Var trapporna ligger i huset beskrivs av heltalsmatrisen
S[1..n, 1..m]. Om S[i, j] > 0 så finns det en trappa från våning i till våning i + 1, och
den trappan startar j meter in i korridoren på våning i och kommer fram j meter in i
korridoren på våning i + 1. Det finns alltså som mest m trappor upp från våning i till
våning i + 1, en per meter. Värdet S[i, j] anger hur jobbigt det är för en patient att ta
den trappan (uttryck i arbetsenheter, ae). Dessutom kostar det 1 arbetsenhet per meter
för patienten att gå i en korridor.
Du ska konstruera en så effektiv algoritm som möjligt som givet S räknar ut vilken som
är den jobbigaste vägen från sjukhusentrén i början på korridoren på bottenplanet (dvs
vid meter 1 på våning 1) upp till chefens kontor längst bort på översta våningen (dvs
vid meter m på våning n) och sedan tillbaka igen. Anta att det finns minst en trappa
upp från varje våning till nästa, så att problemet säkert är lösbart.
Analysera tidskomplexiteten (uttryckt i n och m) för en så effektiv algoritm som möjligt
som löser problemet och returnerar det maximala jobbet.
Du ska kunna motivera att din algoritm är riktig.
2