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