Datalogiövning 31/7 2007

Relevanta dokument
::= HIHI HIHIHI ::= HAHA HAHAHA

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Tildatenta Lösningsskiss

Övning 4. Hashning, sortering, prioritetskö, bästaförstsökning. Hitta på en perfekt hashfunktion för atomer. Hur stor blir hashtabellen?

Föreläsning 7: Prioritetskö, trappa heapsort, hashning

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Fredag 10 juni 2016 kl 8 12

Exempeltenta GruDat 2002/2003

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 9 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

Träd Hierarkiska strukturer

Lösningar Datastrukturer TDA

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

Tentamen kl Uppgift 4. Uppgift 5

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Tentamen Datastrukturer för D2 DAT 035

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer och Algoritmer D0041D

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer, DAT037 (DAT036)

Seminarium 13 Innehåll

13 Prioritetsköer, heapar

Övning 4 - Tillämpad datalogi 2013

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

DD1320 Tillämpad datalogi. Lösnings-skiss till tentamen

Övning 4 - Tillämpad datalogi 2012

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Föreläsning 13 Innehåll

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Programkonstruktion och. Datastrukturer

Tentamen Datastrukturer D DAT 035/INN960

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning Datastrukturer (DAT036)

Tentamen, Algoritmer och datastrukturer

Tentamen Datastrukturer (DAT036)

Grundläggande Datalogi för F

Algoritmer, datastrukturer och komplexitet

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Lösningsförslag DD1320/DD

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Föreläsning Datastrukturer (DAT036)

Algoritmer, datastrukturer och komplexitet

Tentamen Datastrukturer (DAT036)

DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Facit Tentamen TDDC kl (6)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning Datastrukturer (DAT036)

Föreläsning 5: Grafer Del 1

Föreläsning 13 Innehåll

Övning 7 - Tillämpad datalogi DD1320, TENTAMEN I TILLÄMPAD DATALOGI Tisdagen den 12 januari 2010 kl 14 18

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

Tentamen i Algoritmer & Datastrukturer i Java

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

Datastrukturer och algoritmer

Föreläsning 13. Träd

Grafer, allmänt. Med datastrukturen graf menas vanligen: en mängd av noder (vertices) och en mängd av bågar (edges).

Föreläsning 10 Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning Datastrukturer (DAT037)

Träd. Rot. Förgrening. Löv

Hashtabeller! (& kanske lite sortering)

Teoretisk del. Facit Tentamen TDDC (6)

Tentamen TEN1 HI

Föreläsning 13 Datastrukturer (DAT037)

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Föreläsning 13 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Datastrukturer. Föreläsning 5. Maps 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Föreläsningsanteckningar F6

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Tentamen TEN1 HI

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Transkript:

Datalogiövning 31/7 2007 Heap, prioritetskö, bästaförstsökning. En heap kan implementeras som ett slags binärträd med en speciell "heap"-egenskap: en nod är alltid "bättre" än sina barn. Observera att heaps oftast implementeras som arrayer (listor), där noden i har barnen 2i och 2i+1 om roten har index 1. (Om roten har index 0 så blir barnen 2i+1 och 2i+2.) Varför? Därför att det är ett enkelt och minnessnålt sätt. Om man istället använder ett "vanligt" binärträd med binärträdsnoder och pekare, så måste man också skriva speciell kod för att hitta var nya noder ska sättas in. När man sätter in ett nytt element följer man detta recept: 1 Lägg till elementet längst ner i heapen. 2 Jämför det nya elementet med sin förälder och avsluta om de är i rätt ordning. 3 Om inte, byt plats för förälder och barn och fortsätt från steg 2. Detta kommer att ske i O(log N) i värsta fallet, men ofta går det mycket snabbare eftersom ett nytt element oftast inte behöver flyttas så långt. Uppgift: (tenta 040313) 4. Heap Komplexiteten för att stoppa in ett element i en heapvektor är O(log N). Beskriv hur man stoppar in ett element i en heapvektor och motivera varför det blir O(log N). Visa hur en heapvektor ser ut efter varje insättning om man i en tom heapvektor stoppar in elementen 133, 520, 800, 13, 87, 900. Lägst nummer har högst prioritet! 133 133 520 (520 sätts in sist och man kollar heap property) 133 520 800 (se ovan) 13 133 800 520 (13 sätts in sist. När man jämför den med sin förälder ser man att de är i fel ordning; därför byter man plats och fortsätter uppåt. 13 byter också plats med 133.) 13 87 800 520 133 (87 sätts in sist och byts med 133) 13 87 800 520 133 900 (900 sätts in sist i heapen) Uppgift: (tenta 050312) 6. Önskelistan Lillebror har gjort en önskelista över saker han helst vill få på sin födelsedag. Mest av allt önskar han sig ett Briolok. Den övriga listan ser ut så här: Briolok 299:- Järnvägsövergång 399:- Harry Potter legotåg 499:- Radiostyrd Bil 295:- Cykel 1500:- Legoriddare 99:- Drake i plast 69:- Färglåda 50:- Pokemonfigur 49:- (1p) (a) Pappa har sorterat om önskelistan i plånboksordning och lagt dem i en kö (billigast först). Hur ser kön ut? (8p) (b) Storasyster tycker synd om lillebror och ersätter pappas kö med en prioritetskö (heap) genom att plocka ut ett element i taget ur kön och stoppa in dem i heapen m.hj.a lillebrors ursprungliga värderingar. Visa hur prioritetskön ser ut i vektorform efter varje insättning.

(9p) (4p) (c) Rita storasysters heap i trädform. Hur skulle trädet skrivas ut om man skrev ut det i pre- resp. postorder? Beskriv kortfattat en algoritm och de datastrukturer som behövs. (d) Antag att man skulle vilja skriva ut hela trädet nivå för nivå. Beskriv utförligt den algoritm och de datastrukturer som behövs. Kommentar: Använd leksakernas initialbokstäver istället för att skriva ut hela leksaksnamnet (1p) (a) Pappa har sorterat om önskelistan i plånboksordning och lagt dem i en kö (billigast först). Hur ser kön ut? (8p) (b) Visa hur prioritetskön ser ut i vektorform efter varje insättning. För att lösa den här uppgiften kan det vara bra att numrera lillebrors önskningar. Lillebrors och pappas värderingar ser ut så här: Lillebrors lista Pappas lista 1_Bri 299:- 9_Pok 49:- 2_Jär 399:- 8_Fär 50:- 3_Har 499:- 7_Dra 69:- 4_Rad 295:- 6_Leg 99:- 5_Cyk 1500:- 4_Rad 295:- 6_Leg 99:- 1_Bri 299:- 7_Dra 69:- 2_Jär 399:- 8_Fär 50:- 3_Har 499:- 9_Pok 49:- 5_Cyk 1500:- Insättning i heap: 9_Pok 8_Fär 9_Pok 7_Dra 9_Pok 8_Fär 6_Leg 7_Dra 8_Fär 9_Pok 4_Rad 6_Leg 8_Fär 9_Pok 7_Dra 1_Bri 6_Leg 4_Rad 9_Pok 7_Dra 8_Fär 1_Bri 6_Leg 2_Jär 9_Pok 7_Dra 8_Fär 4_Rad 1_Bri 3_Har 2_Jär 6_Leg 7_Dra 8_Fär 4_Rad 9_Pok 1_Bri 3_Har 2_Jär 5_Cyk 7_Dra 8_Fär 4_Rad 9_Pok 6_Leg (9p) (c) Rita storasysters heap i trädform. Bri Har Jär Cyk Dra Fär Rad Pok Leg Hur skulle trädet skrivas ut om man skrev ut det i pre- resp. postorder? Bri Har Cyk Pok Leg Dra Jär Fär Rad Pok Leg Cyk Dra Har Fär Rad Jär Bri Beskriv en algoritm och de datastrukturer som behövs för det. Om man gör det iterativt med en slinga behövs en stack. Den rekursiva lösningen behöver bara nodklassen. void print(nod p) { if (p!= null) { if (preorder) System.out.println(p); print(p.right); print(p.left); if (postorder) System.out.println(p); } } Kommentar: Det går att svara med en rekursiv tanke precis som i hemtal 3. (4p) (d) Antag att man skulle vilja skriva ut hela trädet nivå för nivå. Beskriv en algoritm och de datastrukturer som behövs för det. En bredden-först algoritm (se andra X-tentor) som inte avbryter utan håller på tills kön är tom.

Kommentar: Frågan avsåg egentligen ett allmänt träd men eftersom det specifika trädet är härlett från en heap så är det OK att svara att man skriver ut heapvektorn. När man tar ut det bästa elementet gör man istället så här: 1 Ta ut rotelementet och ersätt det med det sista elementet i heapen. 2 Jämför rotelementet med sina barn. Om heapvillkoret är uppfyllt, avsluta. 3 Byt annars plats på förälder och "bästa" barnet samt fortsätt från steg 2. Detta var alltså datastrukturen heap. Man använder den t ex för att implementera en prioritetskö, en typ av kö som inte är FIFO utan där varje element har ett värde "stämplat" på sig. Uttagningen ur kön sker i enlighet med denna stämpling. Uppgift: (tenta 050302) 6. Kösystem I ett stort varuhus finns det femtio Kassor. De kunder som har haft få varor i korgen är oftast inte nöjda med den långa väntetiden. Den kundnöjdhetsansvarige vill använda sig av ett mer rättvist kösystem för att få fler nöjda kunder. De beställer in en speciell nummerlappsautomat och femtio nummerdisplayer, en för varje kassa. Nummerlappsautomaten trycker ut ett nummer först när man har matat in det antal varor man har i sin korg. Använd dig av algoritmer och datastrukturer som du har lärt dig i kursen för att göra ett rättvist kösystem som uppfyller följande krav: 1. De som har färre varor ska i princip betjänas före den som har fler varor. 2. Den som har fler antal varor ska betjänas tidigare än den som har färre ifall personen har väntat tillräckligt länge. (8p) 6) Datastrukturen som skulle kunna användas här är en prioritetskö. Prioriteten bestäms av två parametrar antal varor i korgen och kundensväntetid. Ju fler vara desto mindre prioritetstal. Omräkning av prioritetstalet ska göras så fort en ny kund kommer in i systemet, d.v.s. då en kund får en nummerlapp från automaten. Ett exempel på funktion för beräkning av prioritetstal kan vara följande: Väntetid + 1 Ptal = ---------------------- Antal varor Där högre prioritetstal ger snabbare betjäning. En annan användning av heap/prioritetskö är i samband med sökningar i träd. (egentligen grafer) Vi har tidigare pratat om djupetförst och breddenförst; med hjälp av priokö kan vi göra något som kallas bästaförstsökning. Det innebär att vi hittar bästa (billigaste, kortaste,...) vägen mellan två noder, när förbindelserna (kanterna) har någon form av vikt eller kostnad. Exempel: om vi har ett träd med flygrutter så kommer breddenförst att hitta en väg mellan stad X och stad Y med minimalt antal byten, medan bästaförst kommer att hitta rutten med lägst pris. Det är inte helt självklart att detta funkar och det finns några extra subtiliteter i den här typen av sökning. Vi tar ett utförligt exempel från en tenta. Uppgift (tenta 020406): Under en seglingstävling vill varje båt hitta den snabbaste vägen till målet. Problemet är att en segelbåt inte kan segla hur som helst och att den seglar olika snabbt beroende på vindriktning och styrka. Antag att havet förenklat består av en massa jämnt fördelade punkter med information om vindstyrka, vindriktning och vilka punkter som finns runt om. Beskriv utförligt en algoritm som på ett så effektivt sätt som möjligt tar reda på vilka punkter som ligger utefter den snabbaste seglingsvägen givet en startpunkt och en slutpunkt. :

Bästaförstsökning med priokö som prioriterar på lägsta seglade väg. Varje nod innehåller total seglingstid + faderspekare. 1 Lägg startpunktsnoden med totaltiden noll och ingen faderspekare i priokön 2 Upprepa 3-4 så länge kön inte är om 3 Plocka ut fadersnod ur kön. Om detta är en slutpunkt, avsluta och skriv ut rekursivt. 4 Generera en son i taget genom att för varje punkt omkring fadersnoden skapa en sonnod med seglingstiden ökad beroende på vindstyrka, vindriktning och placering i förhållande till fadersnoden. Lägg in sonnoden i priokön. Om dumsöner hålls reda på måste man ta hänsyn både till punkten och totala seglingstiden till den punkten; alla söner med sämre tider till samma punkt är dumsöner. Andra uppgifter om det finns mer tid: Arbeta med Pokémon (051019) 7. Du är så uppskattad i ditt arbete som pokémontränare att du kan välja och vraka bland erbjudandena. Givet ett antal förslag (anbudsgivare, startdag, slutdag, arvode) vill du planera nästa månad så att den blir så lönsam som möjligt. (4p) Rita först upp problemträdet (roten och några noder i de första två nivåerna räcker). (12p) (4p) (12p) Föreslå en algoritm som finner det schema som ger störst inkomster. Motivera ditt val av algoritm och beskriv hur du skulle implementera algoritmen. 7. Arbeta med Pokémon Du är så uppskattad i ditt arbete som pokémontränare att du kan välja och vraka bland erbjudandena. Givet ett antal förslag (anbudsgivare, startdag, slutdag, arvode) vill du planera nästa månad så att den blir så lönsam som möjligt. Rita först upp problemträdet (roten och några noder i de första två nivåerna räcker). Föreslå en algoritm som finner det schema som ger störst inkomster. Motivera ditt val av algoritm och beskriv hur du skulle implementera algoritmen. I varje nod finns schema och totalinkomst. Tomt schema i roten, barnen har varsitt anbud i schemat, barnbarnen har två. Man kan använda djupetförstsökning för att gå igenom alla möjligheter och använda en maxinkomst-variabel som uppdateras varje gång vi hittar ett lönsammare schema. Breddenförstsökning fungerar också, men man får inte avbryta direkt när den hittar ett fullt schema - vi söker ju inte efter ett schema med så få anbud som möjligt. Bästaförstsökning fungerar också, om man går igenom hela trädet, men det är mindre ee ktivt eftersom prioritetskö inte är lika snabb som stack/kö. I beskrivningen av implementationen måste just det här problemets klurigheter tas med, t ex hur sönerna representeras, hur man går igenom anbuden, hur man vet att schemat är fullt osv. Många har en girig lösning (ibland maskerad som en bästaförst-sökning som bryter så fort den kommer till slutet). Ibland är lösning girig rakt igenom (söker bara en stig i trädet), och ibland söker den hela trädet fram till näst sista nivån men bryter så fort den fyllt schemat. Det ger inte nödvändigtvis den bästa lösningen eftersom det kan finnas krockande anbud som skulle givit större inkomster. Man brukar få mellan två och sex poäng för en sådan lösning. (Man kan dessutom få fyra poäng för problemträdet om det är riktigt.) Exempel på en rent girig lösning som är felaktig: Anbud 1: 1/1-8/1, 5000 kr Anbud 2: 1/1-5/1, 3000 kr Anbud 3: 7/1-12/1, 7000 kr Anbud 4: 14/1-17/1, 2000 kr Om man är girig söker man bara i grenen som börjar med anbud 1, men då får man en lägre totalsumma.

Uppgift (060308): 9. Tolkning av bilder Stockholmsförsöket använder ett OCR-program (Optical Character Recognition) för tolkning av kamerabilder till tecken. OCR-programmet klarar inte av att tolka alla tecken i ett registreringsnummer på bilder med dålig kvalitet. Vissa bilder måste därför tolkas manuellt. För varje bild som skickas till OCR-programmet får man ett tal och en sträng. Talet talar om hur många tecken som gick att tolka och strängen innehåller tolkade tecken samt tecknet # för de tecken som inte gick att tolka. Om tolkningen lyckas läggs registreringsnumret i en hashvektor. Exempel: talet=6, strängen= AGA 912 (lyckad tolkning) talet=5, strängen= AGA 9#2 (misslyckad tolkning) Eftersom manuell tolkning tar lång tid räknar man med att en del misslyckade registreringsnummer inte kommer att hinna tolkas i tid. Därför vill man börja med att tolka de registreringsnummer som har färre misslyckade tecken (d.v.s. få antal # i strängen). Dessutom har erfarenhet visat att det går snabbare att tolka ett misslyckat tecken om tecknet är en sir a, därför vill man att registreringsnummer med fel i sie rdelen ska prioriteras före dem som har fel i bokstavsdelen. I kursen datalogi har vi gått igenom en datastruktur som skulle kunna passa bra för detta ändamål. Nämn och förklara hur datastrukturen fungerar. Om det redan finns något registreringsnummer i hashvektorn som skulle kunna passa vill man gärna få veta det. Förklara hur sökningen går till om talet är 5, d.v.s. bara ett # i strängen. : Prioritetskö Kön ska prioritera misslyckade registreringsnummer med högre tolkningstal först. Ett förslag på beräkning av tolkningstal kan se ut som nedan: Varje fel poängsätts enligt följande: o Ett fel i sifferdelen ger -2 poäng o Ett fel i bokstavsdelen ger -5 poäng Om man följer ovanstående poängsättning får man följande ordning: 1s>2s>1b>3s>1s+1b>2s+1b>2b>3s+1b>1s+2b>2s+2b>3b>3s+2b>1s+3b>2s+3b där 1s betyder 1 fel i sifferdelen, och 1b betyder 1 fel i bokstavsdelen. Eftersom det inte går söka sekvenser i en hashtabell kan man ersätta felet som är markerad med # med ett bokstav eller en siffra beroende på typ av felet. Uppgift (060308): 5. Hashning Vi funderar på att lagra informationen om alla 500000 passeringar i en hashvektor. Hur stor hashvektor ska man välja? En hashfunktion har föreslagits som är summan av registreringsskyltens bokstävers ASCII-nummer gånger det tresir iga talet. Är detta en lämplig hashfunktion? Beskriv två generella sätt att undvika krockar i hashvektorer. Om man använder ASCII-summan gånger talet blir det maximala hashvärdet 153*3*999 = 458541. Då använder man mindre än 50% av vektorn. Primtalsstorlek, 50% luft.