KTH, Nada, Alexander Baltatzis DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18 Maxpoäng 100p, godkänt 50p. Bonus max 10p adderas. Resultatet anslås på mina sidor. Hjälpmedel : Pythonkramaren del1 samt handskrivna formelblad på officiellt papper. (16p) 1. Lek med vatten En vattenballong går sönder om man släpper ner den från en viss höjd annars är den helt oskadd. Kalle vill undersöka från vilket våningsplan i sitt trapphus vattenballongerna börjar gå sönder. Han har endast två ballonger att prova med för att ta reda på det. (a) Beskriv en algoritm för att lösa problemet med så få släpp som möjligt. Antag att det finns 15 våningar. Utför din algoritm och skriv hur många ballongsläpp det blir samt från vilka våningsplan om lösningen är (b) 4:e våningsplanet (d.v.s ballongen går sönder fr.o.m 5:e) (c) 8:e våningsplanet (d) 12:e våningsplanet Det gäller att släppa ballong nummer ett på ett listigt sätt när den väl går sönder kan bara prova sekventiellt med ballong nummer två. Antag att vi släpper ballong 1 på våning N. Om den går sönder söker vi sekventiellt från 1 till N-1 d.v.s maximalt N provningar. Om ballongen håller släpper vi nästa N - 1 våningar högre upp (vi har redan ödslat ett släpp tidigare). Det här går att lösa matematiskt. N + N-1 + N-2 + N-3... + 1 = N * (N + 1) / 2 jmfr Gauss, första elementet plus sista (medelvärdet) genom två * antalet element. Med antal våningar = 15 blir det N*(N+1)/2=15N*(N+1)=30N=5=>5* (5+1) = 30 Släppen blir på
N 5 N + N-1 9 N - N-1 + N-2 + N-3 12 N - N-1 + N-2 14 Man kan också använda dynamisk programmering gör att komma fram till hur släppvektorn ska bli. (16p) 2. Tomten är borta Flera rykten cirkulerar om att tomten är försvunnen i år. Ett stort TV-bolag tror sig ha hittat säker information om detta. Informationen är komprimerad med ett Huffmanträd se figur. D A P N M Å (a) Var befinner sig Tomten? 10111 100110100111011100101000 PÅ PAPPAMÅNAD (b) Hitta på en statistisk fördelning för bokstäverna som skulle kunna bygga huffmanträdet ovan. Beskriv kortfattat hur huffmanträdet byggs upp och rita ut alla summeringar som gjorts i trädet. Varje bokstav har en vikt (statistisk fördelning, hur många gånger bokstaven förekommer). Huffmanträdet byggs upp genom att slå ihop de lättaste bokstäverna till en ny vikt. De som är lättast i detta träd är M och Å som slås ihop till en ny nod med den sammanlagda vikten t.ex. 7 + 6 = 13. Nästa som ska slås ihop är D och N och de måste då vardera ha mindre vikt än 13 men större vikt än M och Å. T.ex D=9 och N=8 ger DN=17 som sammanslagen vikt. Därefter ska MÅ(13) slås ihop med P som måste ha mindre vikt än DN=17. T.ex. P=16 adderat med MÅ 13 ger PDN=29. Därefter ska DN=15 slås ihop med A som måste vara mindre än 29 t.ex. 21. P A D N M Å 16 21 9 8 7 6
(16p) 3. På TV Titti Ruta vill varje vecka lägga in alla tevekanalers programtablåer i ett program för att inte missa något. Hon vill på datorns skärm kunna se vilka program som går i veckan och genom att trycka på dem få programmet att spela in dem när de börjar visas. Hon har lyckats ordna så att hennes dator automatiskt laddar ned hennes kanalers program. Kanalerna är just nu TV4, TV6, SVT1, SVT2, barnkanalen och SVT24 men det kan bli fler. Titti överväger att köpa ett större kanalpaket under julen. (a) Beskriv utförligt datastrukturer för att hålla reda på programinformationen och inspelningarna. Man kan lätt tänka sig en programvektor för varje kanal sorterad på starttid. Insättning i vektor är inte så lätt och därför är kanske träd med starttid som nyckel smartare. Sedan behövs en till vektor (eller hashmap) där vektorelementen är en post med kanalnamn och pekare till programvektorn (eller kanalträd). Inpspelningarna borde kunna ligga som poster i en kö (eller smartare prioritetskö prioriterat på starttid) där varje post åtminstone har kanalnamn, starttid, sluttid (eller längd). (b) Beskriv en algoritm för att ta reda på om två inspelningar krockar. Använd dina datastrukturer. Exemplifiera algoritmen med exempel SVT2 24/12 19:25 Ghostbusters (slutar 21:10) TV4 24/12 21:00 Tomten är far till alla barnen Om ett program krockar så gäller att den senare programmet börjar innan det första slutat d.v.s krockande starttid < sluttid samt att sluttiden är efter att första börjat d.v.s. krockande sluttid > starttid. Ett sätt att kolla alla krockar är att kopiera hela inspelningskön och samtidigt räkna elementen. Plocka ut första elementet i kopiekön, jämföra med alla element i ursprungliga kön (plocka ur och stoppa tillbaka sist N ggr). Ett smartare sätt vore att ha en prioritetskö. Vi plocka ur från prioritetskön (till någon temporär lista) och behöver egentligen bara jämföra med nya
översta elementet i prioritetskön. Om det inte är någon krock där så kan det inte vara krock med någon annan. Efteråt stoppar vi tillbaka alla elementen i prioritetskön. Det är lite oklart vad som händer om tre program krockar men det går att lösa. (c) Ibland kommer det en tablåändring. Beskriv en algoritm för att lägga till ett extrainsatt program i din datastruktur. SVT1 26/12 Extrainsatt Rapport med anledning av katastrofen i Långtbortistan Leta upp kanalen i kanalvektorn (eller hashmap). Gå igenom programtidsvektorn tills duhittar tiden den ska läggas in. Är det en sorterad vektor så är binärsökning smart. Lägg in det nya programmet. Här är det mycket smartare att använda ett träd istället för programtidsvektor eftersom insättning i träd är mycket billigare (d) Beskriv en algoritm för att flytta på program, se till så att eventuella inspelningar inte påverkas (om krock sker spela in den ena). TV4 22-Nyheterna sänds 22:10 när matchen är klar Långfilmen börjar 10-minuter senare än angivet... Ta reda på tidsförkjutning, exempel 10 minuter.slå upp kanalens programtidsvektor. Leta upp (med binärsökning) första programmet som drabbas. Ändra på start och sluttid i posten. Gör samma sak med efterföljande poster ända till nya nya sluttiden (sluttid + förskjutning) är mindre än nästa programs starttid (nattuppehåll). Kvalitativa och läsbara lösningar ger mer poäng. (12p) 4. Quicksort Det är så mycket som ska fixas och sorteras innan jul. Som tur är har mamma läst tilpro och kan illustrera hur quicksort fungerar. a) Rita upp steg för steg hur quicksort sorterar: 8 1 0 3 5 2 4 7 96->0123456789
Pivotelementet antas vara elementet längst till höger i varje delvektor. (d.v.s pivot = 6 första gången). b) Hur effektiv är quicksort i allmänhet med avseende på snabbhet och minnesåtgång. Vad är worst case? (12p) 5. Fiskdamm På kalaset är det dags för fiskdammen. Bakom ett skynke sitter Adam med en stor hög små presenter, framför skynket står Eva med ett metspö som ett barn i taget får fiska upp en present med. Eftersom presenterna är fler än barnen och olika värdefulla har de kommit överens om följande regler: Den som fått minst (i kr) är den som får fiska nästa gång. Om fler fått lika litet får den yngsta av dom fiska. Om man fiskar upp en sak som man redan fått får man kasta tillbaka den och genast börja fiska igen. Beskriv en algoritm och ange lämpliga datastrukturer, dels för alla barnen, dels för alla presenter! Presenterna läggs i en kö och barnen i en prioritetskö sorterad på värde+ålder där värdet mäts i ören. (12p) 6. En överraskning Eva ger en överraskningspresent till Adam men innan han öppnar den säger han att han redan vet vad som är i för det har han fått reda på från två operoende håll. Eva blir bestört. Hon har bara talat om det för sin bästa vän. Eva är fast besluten att ta reda på vilka som skvallrat. Det visar sig att varje person enbart talat om det i största förtroende till 1-2 bästisar. Hjälp Eva med att utförligt beskriva en algoritm för att snabbt och effektivt få reda på den kortaste skvallerkedjan. Ange vilka datastrukturer som behövs. Bredden först lösning, se lab5
(16p) 7. Länkar Givet p, q som pekar på länkade noder def write(p): if p!= None: write(p.next) print p.data Vad skriver funktionen write ut om man anropar med p L U J None q G S class Nod: init (self, x): self.data = x self.next = None (a) write(p) (b) write(q.next) (c) Hur ser minnet ut efter följande satser w = p.next p.next = w.next p.next.next = w w.next = q q.next.next.data = A