DD1320 Tillämpad datalogi
Repetition inför tentan
- Repetition
- Datalogi
- Abstraktion
- Datastrukturer
- Algoritmer
- Instuderingstips
- Tentan
Repetition
Detta är en repetitionsföreläsning. Den täcker inte hela kursen,
men är en snabbgenomgång av det mesta. Kursen kan sägas
bestå av en teori- och en praktikdel.
Teoridelen täcks av föreläsningsanteckningar och kursbok.
Praktikdelen av kursen går ut på att kunna tillämpa de "metoder"
som beskrivits. Mängden tillämpningar är obegränsad.
All tillämpning bör motiveras - man måste kunna tala om
varför man valt att göra på ett visst sätt.
Datalogi
Vad var datalogi nu igen?
Datalogi är läran om datastrukturer och algoritmer,
dvs hur man kan
organisera och hålla reda på data samt hur dessa data kan utnyttjas
enligt en steg-för-steg-beskrivning för att (effektivt) lösa
något problem.
Ytterligare ett centralt begrepp i kursen är abstraktion.
Abstraktion
I Nationalencyklopedin står det så här:
- Abstrakt:
"En föreställning är abstrakt om den syftar till att fånga det allmängiltiga
hos företeelsen i fråga och bortse från eventuella tillfälligheter.
Föreställningen om cirkelns begrepp är t.ex. en abstrakt föreställning
till skillnad från föreställningen om en enskild cirkel."
- Abstrakt tänkande:
"Abstrakt tänkande är tankeprocesser som grundar sig på
abstrakta begrepp och allmänna principer och inte på enskilda föremål eller
konkreta företeelser, och där olika begrepp kan sammanställas till nya
helheter, i vilka oväsentliga delar utelämnats."
I datalogi:
- I definitionen av en abstrakt datatyp (ADT) anger man vilka
operationer som finns (t ex
insert(x), exists(x)
),
dvs man definerar ett gränssnitt.
- Vid konstruktion av algoritmen behöver man inte tänka på implementationen
av datastrukturerna.
- Det här gör det lättare för programmerare att samarbeta i ett projekt:
- Den som skriver ADT:en kan ändra implementationen,
så länge allt fungerar likadant.
- Den som använder ADT:en behöver inte bry
sig om hur den är konstruerad, utan behöver bara förstå gränssnittet.
- Förenklar kodåtervinning (tänk på labbarna i kursen!).
Ett exempel: en abstrakt ordlista kan tex defineras med ett gränssnitt
bestående av två operationer: insert(x), exists(x)
.
Vi har sett åtminstonde två implementationer av detta under kursen.
I labb 3 använde ni ett binärt sökträd för att implementera en abstrakt
ordlista. På föreläsning 6 om hashning talade vi om en ordlista implementerad
med hjälp av ett bloomfilter.
Datastrukturer
Datastrukturer används för att lagra och använda data.
I kursen har åtminstonde följande datastrukturer tagits upp:
- Små objekt för egendefinierade saker (t ex Noder av olika slag)
- Länkade listor bestående av noder med en next-pekare
- Stack (implementerad med en länkad lista)
- Kö (implementerad med en länkad lista)
- Allmänna träd (implementerade med noder med två pekare)
- Binära träd (implementerade med noder med två pekare)
- Hashtabeller (implementerade med en vektor)
- Booleska hashtabeller och bloomfilter
- Trappa/heap (implementerad med en vektor som tolkas som ett binärträd)
- Prioritetskön (implementerad med en trappa)
Vi har definerat dessa datastrukturer abstrakt - vi är överens om hur
de bör funka. Dessutom har vi implementerat dem. Sedan har vi använt
dem på ett abstrakt vis - utan att behöva bry oss om hur de var
implementerade. I kursen ingår både och - att förstå hur de funkar
och använda dem på ett abstrakt plan.
Algoritmer
Algoritmer används för att lösa problem. En algoritm utnyttjar en
eller flera olika typer av datastrukturer och det är rätt datastruktur
i kombination med rätt algoritm som gör algoritmen effektiv.
I kursen har åtminstonde följande algoritmer tagits upp:
- Sökning, tex:
- Linjärsökning
- Binärsökning
- Problemträdssökning, tex:
- Breddenförstsökning
- Djupetförstsökning
- Bästaförstsökning
- Rekursiva algoritmer, tex:
- Listrekursion
- Trädrekursion
- Binärträdssökning, -utskrift
- Rekursiv medåkning för syntaxkontroll
- Sortering, tex:
- Urvalssortering
- Insättningssortering
- Bubbelsortering
- Räknesortering (Distribution count)
- Radixsortering (Hålkortssortering)
- Damernaförstsortering
- Kvicksortering (Quicksort)
- Samsortering (Mergesort)
- Trappsortering (Heapsort)
- Hashning, med tillämpningar:
- Data för atomer
- Bloomfilter
- Textsökning, tex:
- KMP-automat för textsökning
- Boyer-Moore
- Rabin-Karp
- Reguljära uttryck
- Komprimeringsalgoritmer, tex
- Följdlängdskodning (RLE)
- Huffmankodning
- Lempel-Ziv-kodning (LZ), speciellt LZW
- Krypteringsalgoritmer, tex
- Transpositionschiffer
- Caesarchiffer
- rot13
- Bokchiffer
- RSA
Det finns också en mängd namnlösa småalgoritmer som ingår i de
ovanstående. Givetvis är det viktigt att förstå hur ett binärt träd
byggs upp innan man kan söka i det, hur en hashtabell eller en boolesk
hashtabell fylls i innan sökning kan ske och så vidare.
Hur man sätter in något i en datastruktur kan ju också beskrivas
med en algoritm!
Algoritmer jämförs genom antalet operationer som måste utföras givet
ett antal element eller mer grovt med komplexitetsberäkningar, där
komplexiteten anges med en funktion av viss storleksordning, Ordo, O(f(N)).
Här är en på intet sätt uttömmande tabell över några
algoritmer och deras tidskomplexitet. Kom ihåg att det inte
räcker att kunna dessa utantill - man måste även kunna resonera
om varför det är så, och när det inte gäller.
Komplexitet |
Algoritmer |
O(n2) | enkla sorteringsalgoritmer, quicksort |
O(n*log(n)) | mergesort, heapsort, quicksort |
O(n) | linjärsökning, räknesortering |
O(log(n)) | binärsökning, sökning och insättning i binärträd |
O(1) | insättning och sökning i hashtabell |
1 | en addition, en multiplikation, en jämförelse |
När man anger ordoklassen behöver man bara ta med den
största termen, och kan strunta i multplikation eller division med konstant,
t ex är O(log(n)-1) = O(log(n)).
Man mäter komplexitet i enkla operationer (tex: en addition,
en multiplikation eller en jämförelse). Man måste naturligtvis
definera vad man menar med de i uttrycket ingående variablerna
och vilka förutsättningar som gäller.
Samma algoritm har olika
tidskomplexitet vid olika förutsättningar. Ofta (men inte alltid)
är man intresserad av det värsta fallet, de förutsättningar som
gör att algoritmen tar längst tid.
Här är en tabell över hur lång tid det tar (hur många jämförelser det
går åt) för att hitta ett värde i ett binärt sökträd i några olika fall:
Sökning i balanserat binärträd |
Tidsåtgång |
Om det sökta finns, i bästa fall | 1 |
Om det sökta finns, i värsta fall | log(n) |
Om det sökta finns, i snitt | log(n)-1 |
Om det sökta ej finns | log(n) |
Om man vet att det sökta finns och bara vill konstatera
var i trädet det finns behöver man inte kontrollera den
sista noden. Då blir värsta fallet: log(n)-1
och snittet ungefär: log(n)-2.
Men om insättningen i det binära trädet gick dåligt ligger alla värden
i en tarm och då blir sökningen som i en enkellänkad lista:
Sökning i enkellänkad lista |
Tidsåtgång |
Om det sökta finns, i bästa fall | 1 |
Om det sökta finns, i värsta fall | n |
Om det sökta finns, i snitt | n/2 |
Om det sökta ej finns | n |
Om man vet att det sökta finns och bara vill konstatera
var i listan det finns behöver man inte kontrollera den
nedersta noden. Då blir värsta fallet: n-1
och snittet: (n-1)/2.
OBS. Oftast har man ingen aning om huruvida det sökta finns eller inte...
Instuderingstips
För varje datastruktur och algoritm gäller att åtminstonde kunna:
- Förstå
- Abstrakt: hur använder man den?
- Konkret: hur implementerar man den? (Kunna beskriva i ord.)
- Analysera
- Hur snabb/effektiv är den? Tidsomplexitet/minnesåtgång.
- Vad har den för fördelar/nackdelar? Begränsningar?
- När är den lämplig/olämplig, jämfört med andra algoritmer/datastrukturer?
Betygskriterier
För betyg E
ska man kunna avgöra vilken algoritm som löser ett givet problem, kunna beskriva algoritmen och demonstrera den steg för steg med givna data, samt implementera den. Motsvarande gäller för datastrukturer.
För betyg C
ska kraven för betyg E vara uppfyllda, och dessutom ska man kunna jämföra algoritmer och datastrukturer och bedöma dessas lämplighet för ett givet problem. Här ställs också krav på tidsplanering.
För betyg A
ska kraven för betyg C vara uppfyllda, och man ska dessutom kunna modifiera/kombinera algoritmer och datastrukturer för att lösa nya problem. Här ställs också höga krav på tydlighet i algoritmbeskrivningar.
Tentan
Mest problemfrågor, tex:
- Hur löser man problemet?
- Vilken algoritm/datastruktur passar?
- Varför är just den algoritmen mer lämplig i sammanhanget?
Men också teorifrågor.
Kom ihåg:
- Viktigt att motivera svaren!
- Viktigt att motiveringar är tydliga.
- Inte viktigt att skriva programkod.
- Rita gärna, så blir det lättare för oss rättare.
Bonus och hjälpmedel
- Alla sju labbarna kan ge bonus (även de två labbarna efter tentan).
- Total bonus motsvarar ca 10% av tentan.
- Varje enskild bonus är värdefull (det finns ingen gräns för hur många bonusar man måste ha för att få tillgodoräkna dom till tentan).
- Bonus med ett visst betyg kan bara tillgodoräknas på denna betygsnivå och lägre. Betyg C på en labb kan alltså inte hjälpa dig att höja till betyg A, men i A-bonusen ingår även bonus för betyg E och C.
- Bonusen läggs till tentaresultatet - bonus för en labb ska inte ersätta en liknande uppgift på tentan.
- Hjälpmedel:
- Det egenhändigt skrivna formelbladet, en A4.
Man får skriva precis vad man vill på fram- och baksidan.
- En valfri algoritmbok (t ex kursboken),
men inte föreläsningsanteckningar eller extentor (för främjande av god studieteknik).
Tid och plats:
- Ordinarietentan ges fredag 24 okt 2014 09:00-13:00
- Omtenta torsdag 8 januari 2015 kl 14:00-18:00