Innehåll Föreläsning 1-2 Kurspresentation och information Innehållsöversikt, upplägg, kursmaterial, kursutvärdering, förväntade studie resultat etc... Föreläsning Programbyggnadskonst o Olika ansatser o Viktiga begrepp Listor o Specifikation, Konstruktion o Algoritmmönster Riktade listor, länkade celler o Specifikation, Konstruktion o Dynamiska resurser Att läsa: Kapitel 1-4 Kursens innehåll Kursens innehåll Abstrakta Datatyper (ADT) Abstrakta datatyper Begrepp, definition, konstruktion Algoritmer Tids- och rumsfrågor Designprinciper Sökning Sortering Introduktion till projektarbete enligt LIPSmodellen Både teoretiskt och praktiskt Många olika ADT kommer att diskuteras! Stack, Kö, Listor, Träd, Graf, Prioritetskö, Heap, Tabell, Sträng, Mängd, Sökträd, Tries, mm Grundbegrepp Vad är en organisation, modell, gränsyta, sorterad ADT, mm Primär vs. sekundär struktur Absolut vs. relativ komplexitet Varje ADT beskrivs på ungefär samma sätt Organisation, Modell, Gränsytan (formell, informell) Sätt att implementera o +/-, när var hur, komplexitet för de viktigaste operationerna Vart hittar vi ADT typiskt, vilka typproblem? o Hur hänger ADT ihop med andra ADT? o Algoritmer på ADT Kursens innehåll Algoritmer Kursens innehåll Algoritmer Tids och rumsfrågor Exekvering, implementering, underhåll Tids- och rumskomplexitet o Fokus på tidskomplexitet T(n) för en alg => O(n) o Experimentell och asymptotisk analys Att beskriva algoritmer Designprinciper Brute force, Divide&conquer, Greedy och dynamisk programmering Sökning (traversering) Vad är traversering Linjär- och Binärsökning o +/- o Krav på implementationen av ADTn Sortering Varför sorterar vi? Sorterad ADT vs sortering av data 5-6 olika algoritmer, inklusive analys o +/- o Stabil sortering
Kursens innehåll Projektarbete enligt LIPS-modellen Kursens upplägg LIPS utvecklad i Linköping http://www.liu.se/cul/resurser/lips En introduktion och sedan får ni arbeta med en delmängd av modellen Bilden tagen från websidan ovan Föreläsningar (16 st) Teoripresentation och lite praktiska inslag Gruppövningar (4 st) 3 grupper, SI-stil OBS! Obligatorisk närvaro på gruppövning 4! Individuell handledning i datorsal eller på handledarens rum Examination Tentamen (moment 1) 6 obligatoriska uppgifter (moment 2) Tentamen Obligatoriska uppgifter Ordinarie tentamen 5/6 9-15 i Noliahallen på Nolia! Anmälan krävs! https://www.cs.umu.se/information/tenta/ Senast 10 dagar innan tentan ges Enligt rektors beslut kodas tentamen Kan tyvärr leda till längre tid innan resultat anslås pga administrativt trassel! o Max 15 arbetsdagar (för första tentan blir det 30/6) Ett urval av gamla tentamina från tidigare år finns på kurssidan. 2 OU utförs enskilt och 4 OU utförs parvis Ordinarie sista redovisningsdag står på varje uppgifts webbsida. OU bedöms med G, K, O eller U Komplettering inom 5 arbetsdagar från första tillfälle för uthämtning Finns ett uppsamlingstillfälle (augusti). Måste göra om alla uppgifter Kan vara nya uppgifter/nya handledare Obligatoriska uppgifter OU2 En uppgift som är 5 minuter sen är för sen! Ansökan om uppskov pga exvis sjukdom ska ske minst en dag före sista inlämningsdag. Kursansvarig bedömer uppskoven. Notera att det ingår i examinationen att ni ska lära er att hinna blir klar med uppgifterna i tid. o Jag hinner inte kommer inte att godtas som enda skäl till uppskov. Resultat anslås på kursens hemsida. Implementera tabeller Individuell, inlämnas 15/4 klockan 12.00 Syfte: Du ska börja få en förståelse varför man använder sig av abstrakta datatyper, analysera för- och nackdelar med olika implementationer av ADT:n Tabell, öva dig i att hantera dynamiska strukturer, öva dig i skriftlig presentation.
OU4 Projektet Analysera algoritmer Experimentellt (individuell) Asymptotiskt (gruppövning med individuell redovisning) Inlämnas 8/5 klockan 12.00 Syfte: Du ska få prova på att testa och utvärdera implementationer av okända algoritmer. öva er på att analytiskt utvärdera algoritmer. Implementera mjukvaran i en Router Utförs parvis och delredovisas vid 4 tillfällen. Syftet: Ni ska få praktiska kunskaper om användandet av datatyper och algoritmer. utföra ett arbete under tidspress och lära er planera ert arbete och prioritera bland olika lösningar för att få en färdig produkt som uppfyller givna krav. få en introduktion till en projektmodell och träna att arbeta utifrån den öva er att redovisa ett större arbete muntligt och skriftligt. Projektets delredovisningar Kursens (och bokens) strategi: OU1 inlämnas 3/4 klockan 12.00 Skapande av en projektgrupp OU3 inlämnas 21/4 klockan 12.00 Skapande av en projektplan OU5 inlämnas 15/5 klockan 17.00 Muntlig redovisning av pågående arbete på gruppövning 4 och reviderad projektplan OU6 inlämnas 5/6 klockan 12.00 Slutredovisning av färdig produkt och dokumentation av projektet Beskriva datastrukturer och ansatser så neutralt och språkoberoende som möjligt. Kunskaperna mer generella och allmänt tillämpbara. Flesta studenterna har Java som bakgrund, några har C som bakgrund. Läser du DV, ID, eller TDV eller har läst TDBA63, TDBA62, 5DV081 eller 5DV090 ska du implementera koden i Java. Läser du ett annat studieprogram, eller läst TDBA66, TDBA39 eller 5DV035 så får du lösa uppgiften i C även om vi rekommenderar att den görs i Java. Oftast pseudokod på föreläsningarna Kursmaterial Kursmaterial Kurslitteratur Janlert L-E., Wiberg T., Datatyper och algoritmer, 2:a uppl., Studentlitteratur, 2000, ISBN9144-01364-7 Föreläsningsunderlag (finns på websidan) Referenslitteratur: Mark Allen Weiss, "Datastructures and Algorithm Analysis in Java", 2 ed, Pearson, Addison Wesley ISBN 0-321-37319-7 Mark Allen Weiss, "Datastructures and Algorithm Analysis in C Addison Wesley Longman ISBN 0-321-18995-7 Allt material som ev. delas ut under kursen http://www.cs.umu.se/kurser/5dv043// Mycket information skickas via mail. Läs dina cs-mail minst en gång om dagen! Gör forward: https://support.cs.umu.se/userinfo/info/index.html Mail som skickas till hela gruppen lagras i ett arkiv http://support.cs.umu.se/mail/archive/5dv043
Mina målsättningar Vad krävs för att nå dit? Rolig och viktig kurs Bli en bättre programmerare och inse att man blivit det Känna till kända lösningar på typiska problem Konstruera robusta och korrekta program Konstruera och beskriva algoritmer och datatyper Planera sitt arbete så att projekt blir klar i tid Förstå komplexitetsbegreppet Tid och rum Bli bättre på att kommunicera resultat Ge kursen en ärlig chans Kom i tid till föreläsningarna Läs boken, förstå vad som står där Gör övningar Börja med laborationerna i tid Utnyttja handledningen Säg till om det är något som inte funkar Hur kan man lägga upp sina studier? Hur kan jobbet fördelas? En 7,5 hp kurs motsvarar 200h total studietid för normalstudenten. 5 veckor ger ca 40h/vecka. Delta på undervisningen Läsa boken Göra obligatoriska uppgifter Repetera/ tentaplugga Ofta samma sak som att arbeta med OU... 30h läsa boken+lips-material 5 min*max 370 sidor 40h övrigt tentaplugg 40h schemalagd undervisning (F/G) 90h kvar till de obligatoriska uppgifterna 15h till OU2 25h till OU4 50h till projektet (* 2 personer = 100h) PLANERING AV ARBETET VIKTIGT! Översikt över kursen Kursutvärdering från ifjol Vecka 14 15 16 17 18 19 20 21 22 F/G 6 6 4 4 2 6 6 4 2 Plugg 7 7 7 7 7 7 7 7 7 OU 7 7 9 9 11 7 7 9 11 OU1 0.5h Projektet 50h OU2 15h OU3 8h OU4 25h OU5 8h OU6 33,5h 23 0 7 13 Bara 37 av 114 (32%) som svarade skriftligt Muntlig utvärdering genomfördes på sista föreläsningen (ca 40) 90 studenter aktiva hela kursen igenom Sammanfattning finns på sidan http://www.cs.umu.se/~kursv/tdba36/vt-07/index.html Projektet 50h * 2 personer = 100h!
Till den som ska planera kursen nästa gång: Förändringar på kursen sen förra året Komplexitetsuppgiften (OU3) Lägg gruppövningen (gö) längre ifrån inlämningsdagen. Var tydlig med att uppgiften kräver enskilt arbete utöver gö och att man bör ha försökt lösa uppgiften före gö för att få optimal hjälp från gö. Routerlabben (OU2 och OU4) Gör om OU2 så att den till exempel går ut på att skriva en problembeskrivning för OU4. o Tanken att "tvinga" studenterna att läsa OU4 och bearbeta specifikationen lyckades inte helt. Skriv om specifikationen av OU4 från grunden eftersom den fortfarande är svår att övergripa. Fundera på om Routerlabben ska bytas ut mot något annat, exempelvis träd. Handledning och rättning av obligatoriska uppgifter Gemensamma rättningsmallar för att minimera "orättvisor". Uppmuntra grupphandledning och sköt inte handledningen via mail. o Samma frågor ställs flera gånger och mailandet tar för mycket tid från personlig handledning. Komplexitetsuppgiften (OU3 i år OU4) En vecka mellan gruppövning och inlämnande Info i specifikationen om förberedelse och tidsåtgång Routerlabben (OU2 och OU4) Drivs i projektform med 4 avstämningar Uppgiften och specifikation ordentligt genomarbetad Handledning och rättning av obligatoriska uppgifter Gemensamma mallar/diskussioner Handledningsresursen räcker inte till mailsvar kring kodfrågor Mängden föreläsningar om träd minskar och en föreläsning om projekt och projektmodellen LIPS införs. Registrering Förkunskaperna innebär i praktiken Sker på studentexpeditionen eller hos Pedher Johansson. Alla som antagits med villkor (alla studenter på C/DV/ID) måste visa att man uppfyller förkunskapskraven. Skriv ut ett Ladokutdrag! o Gå till http://www.student.umu.se/ o Logga in (med ert UMDAC-student konto + lösenord) o Välj fliken Expedition Markera gärna förkunskaperna (5DV081/5DV090) med överstrykningspenna... Ingen examination förrän man är registrerad Regga dig innan första uppgiften ska vara inlämnad (på torsdag)! Studenten ska kunna implementera en godtycklig algoritmbeskrivning i JAVA/C. ha god erfarenhet av problemlösning. Kursens mål FSR (1) Kursens mål FSR (2) Efter avslutad kurs ska studenten kunna: redogöra för grundläggande begrepp relaterade till datastrukturer och algoritmer redogöra för organisation och specifikation för grundläggande abstrakta datatyper såsom lista, stack, kö, träd, mängd, graf och tabell redogöra för grundläggande algoritmer, deras komplexitet och karakteristiska egenskaper välja lämpliga datatyper och algoritmer för ett givet problem välja och utföra lämpliga implementationer (konstruktioner) av de valda datatyperna och algoritmerna Efter avslutad kurs ska studenten kunna: analysera enklare algoritmer praktiskt och teoretiskt med avseende på prestanda använda sig av grundläggande problemlösningsstrategier (som till exempel divide and conquer, brute force, greedy och dynamisk programmering) på nya problem tillämpa de teoretiska kunskaperna och objektorienteringsparadigmen praktiskt på ett programmeringsprojekt, dvs. konstruera en komplett programvara inklusive dokumentation (med systembeskrivning och webbaserad API) utifrån givna riktlinjer utforma en enkel arbetsplan för ett programmeringsprojekt som utförs i grupp samt dokumentera, följa upp och skriftligt utvärdera den gjorda planeringen.
Inblandade personer MIT-huset, våning 4 Föreläser Lena Kallin Westin (kallin@cs.umu.se) Ola Ringdahl (ringdahl@cs.umu.se) Håller i gruppövningar: Ola Ringdahl Linus Jonsson (linusj@cs.umu.se) Oskar Lindgren (oskarl@cs.umu.se) Handleder och rättar obligatoriska uppgifter: Linus Jonsson Oskar Lindgren Johan Westerlund (johanw@cs.umu.se) Studievägl. Pedher Lablådor Student exp. Lena Oskar Johan support Studievägl. Lena P MIT-huset, våning 2 Linus Ola Programbyggnadskonst, Listor Att bygga program bygga hus/broar Husbygge Specifikation/Beskrivning Material Verktyg Utvärdering/uppföljning Programmering Problembeskrivning Systemdesign Modelleringsverktyg o Datatyper representera datat i programmet o Algoritmer stegvis plan för att utföra något, modellera hur man löser problemet o Kontrollstrukturer för att modellera flödet Utvärdering/uppföljning o Komplexitetsanalys o Valideringskriterier Metaforer och världsbilder för programbyggnad Metaforer för programbyggnad Instruktionsmetaforen Problemlösningsmetaforen Adaptionsmetaforen Världsbilder/ansatser Manipulativa ansatsen Funktionella ansatsen Objektorienterade ansatsen Låg nivå nära datorn Hög nivå
Terminologi Terminologi Inte alltid enhetlig! Viktigt sätta grunden för bokens och kursens innehåll. Data bär information genom att representera något. x 12 y 52.1 3.4 hej 7 a true Datatyp = objekt + operationer Objekten finns i en värdemängd/objektmängd Operationerna kan vara funktioner, relationer och predikat 12-345 -3 heltal = 0 52 34 + 7 15 98 % udda - * + jämn > / <= Heltal: 1,2,3,4 till exempel enkel Lista av heltal: 1 7 3 5 till exempel homogen... kan vara... Relation (personinfo) kan vara sammansatt namn ålder kön till exempel heterogen Står det bara datatyp så menar man abstrakt datatyp abstrakt När man pratar om en datatyp utan att bry sig om och hur den är realiserad i programspråk/hårdvara Kan anses vara abstrakt eftersom... fysisk datatyp... kan vara... implementerad En fysisk datatyp är... En datatyp som är impl i en fysik datatyp är... konkret... kan vara... konstruerad När man besrkivit hur objekten ska representeras och hur operationerna skulle kunna implementeras (algoritmer) datatyp Implementerad i språket/hårdvaran tex int, char Komplett konstruerad från grunden och redo att användas i ett program Mer terminologi: Mer terminologi: Element Beståndsdel i en sammansatt datatyp Består av värde och position 23 53 2 Värde: 2 Position: 3 0-2 c a d f g h i j Värde: d Position: 2:a barn till roten e Struktur Bortser från elementvärden Ändras när element läggs till eller tas bort Listan (1, 2) och ((1,2,3), (4,5,6)) har samma struktur Position Plats i strukturen Positionsbeskrivningar förändras när element sätts in eller tas bort Hur man anger positioner avgörs vid konstruktionen av datatypen. Strukturförändrande operationer behöver returnera nytt positionsvärde
Genomgång av en datatyp - Beskrivningar Genomgång av en datatyp Modell - vardaglig, det man modellerar Organisation Grundläggande natur på objekten, linjärt ordnade, före och efter relation etc. Informell beskrivning Gränsytan (de operationer som hör till datatypen) Informell beskrivning av operationernas funktion Signaturdiagram Ofta den mest omfattande beskrivningen! Formell beskrivning rent matematisk-logisk (axiom och slutsatser) Konstruktioner och implementationer Olika sätt att konkretisera datatypen o Lista som en array vs Lista som en dynamisk struktur Komplexitetsanalys Exemplen i boken i huvudsak Java eller ML Tillämpningar och algoritmer Typproblem och algoritmer som löser dem Komplexitetsanalys Lista ADT:n Lista är en Modell Pärm o Bläddra, inspektera, lägga till, ta bort Organisation Diskret linjärt ordnad o Ändligt antal linjärt ordnade element o Första / sista element o Före / efter relation av element (inte värden) o Alla element (utom det sista) har en efterföljare o Alla element (utom det första) har en föregångare Dynamisk datatyp Struktur och storlek förändras under datatypens livslängd Generisk datatyp (polytyp) Lista av typ o Typ kan vara av vilken typ som helst o Lista av heltal, Lista av tecken, etc Homogen datatyp Alla element har samma typ Lista Specifikation: Gränsyta abstract datatype List(val) auxiliary pos Empty() List(val) Insert(v:val,p:pos,l:List(val)) (List(val),pos) Isempty (l:list(val)) Bool Inspect (p:pos,l:list(val)) val First (l:list(val)) pos End (l:list(val)) pos Next(p:pos,l:List(val)) pos Previous(p:pos,l:List(val)) pos Remove((p:pos,l:List(val)) (List(val),pos) Bild från sidan 47 i Janlert L-E., Wiberg T., Datatyper och algoritmer, Studentlitteratur, 2000
Varför är specifikationen viktig? Implementation av gränsyta till Lista Nu kan vi skapa algoritmer för listor utan att behöva bry oss om hur listan verkligen implementeras. Ex, Söka efter elementet med värdet v i listan list: If not isempty(list) Then p:= first(list) While Not (Next(p,list) = End(list) Or v = inspect(p, list)) Do p:= next(p, list) End End public interface List{ public boolean isempty(); public Pos insert(object v, Pos p); public Object inspect(pos p); public Pos first(); public Pos end(); public Pos next(pos p); public Pos previous(pos p); public Pos remove(pos p); } Implementation av gränsyta till Pos Implementation av gränsytan i C public interface Pos { public boolean eq(pos p); } /* Funktionsprototyper */ list_t *list_empty(); pos_t *list_insert(void *v, pos_t *pos, list_t *list); int list_isempty(list_t *list); void *list_inspect(pos_t *pos, list_t *list); int list_isend(pos_t *pos, list_t *list); pos_t *list_first(list_t *list); pos_t *list_next(pos_t *pos, list_t *list); pos_t *list_remove(pos_t *pos, list_t *list); Lista Konstruktion: Statiskt Lista som Fält + Snabb inspektion av element - Fast reserverat utrymme - Kostsamt sätta in och ta bort element Bild från sidan 51 i Janlert L-E., Wiberg T., Datatyper och algoritmer, Studentlitteratur, 2000 Lista Konstruktion: Dynamiskt Länkade strukturer + Insättning / borttagning går snabbt + Minnesutrymmet är proportionellt mot storleken + Allokera minne när det behövs - Länkarna behöver också minnesutrymme - Kommer bara åt listelement genom att traversera från listans början Huvudlös eller med huvud Cirkulär eller linjär
Länkad Lista Dubbellänkad lista Länkar mellan elementen Elementen är en cell som består av länkar och värde Dubbel eller enkellänkad Före insättning Dubbellänkad lista Skapa ny nod för insättning nodebefore nodeafter newnode newnode skapas nodeafter = noden som ska vara efter den nya noden nodebefore = nodeafter:s bakåt länk newnode:s framåt länk = nodeafter newnode:s bakåt länk = nodebefore nodebefore:s framåt länk = newnode nodeafter:s bakåt länk = newnode Dubbellänkad lista Efter insättning och före borttagning Dubbellänkad lista Dubbellänkad lista Ta bort ett element nodebefore nodetoremove nodebefore = nodetoremove:s bakåt länk nodeafter = nodetoremove:s framåt länk nodebefore:s framåt länk = nodeafter nodeafter Efter borttagning nodeafter:s bakåt länk = nodebefore
Algoritmmönster Algoritmmönster Traversering Besöker systematiskt alla element Sökning Söker det första elementet som uppfyller ett bestämt villkor Filtrering Filtrerar ut alla element som uppfyller ett bestämt villkor Reduktion Beräknar en funktion av objektets elementvärden o Ex. Summera alla tal i en lista Mappning Transformera varje elementvärde i en datastruktur o Ex. multiplicera alla talen i en lista med 4 Riktad Lista Riktad Lista Specialisering Modell Slalombana Man kan ta sig till starten Man passerar portarna i en riktning Man kan åka om en del av banan Organisation Specialisering av Lista Har endast en riktning från början av listan och framåt. Rekursiv definition: En riktad lista är tom eller har ett första element som följs av en riktad lista Man tar bort operationer ur gränsytan, utan att mängden objekt som kan konstrueras förändras. Två objekt som är lika, ska vara lika också i specialiseringen. Previous och end behövs ej och Isend lagts till Java: Kan ej ta bort en del av gränsytan Exceptions för previous och end Riktad Lista som helt ny klass - Ingen återvinning av kod... Gränsyta till Riktad Lista Riktad Lista konstruktion abstract datatype DList(val) auxiliary pos Empty() DList(val) Insert(v:val,p:pos,l:DList(val)) (DList(val),pos) Isempty (l:dlist(val)) Bool Inspect (p:pos,l:dlist(val)) val First (l:dlist(val)) pos Isend (p:pos,l:dlist(val)) Bool Next(p:pos,l:DList(val)) pos Remove((p:pos,l:DList(val)) (DList(val),pos) Konstruerad som Fält Dubbellänkad Lista Enkellänkad Lista Enkellänkad Lista Mer (rums)ekonomisk behöver ju ändå inte bakåtlänkarna
Riktad Lista som Enkellänkad Lista Enkellänkad Lista Problem vid insättning Lösning: Representera position mha en länk till föregångarelementet o Fysisk och logisk referens Listhuvud o Tomma objekt o Gränspositioner Konstruktion utan huvud Stopplänkvärde (nil, null) Insättning före elementet X o Skapa en ny cell o Sätt in den efter X o Kopiera X:s värde till den nya cellen o Sätt X:s värde till v n-länkad Cell 1-Cell Tippel som består av ett värde n st länkar Byggmaterial för andra datatyper n-länkad struktur Objekt konstruerade med n-länkade celler o Listor, träd Cell är en implementationsdetalj i ADT:en Lista som kan gömmas för listans klient Cell kan alltså definieras i klassen som implementerar listan (intern klass), deklareras privat behöver inte ha set & get metoder private class Cell { private Object data; //data portion private Cell next; //link to next node private Cell(Object dataportion) { data = dataportion; next = null; } //end constructor private Cell(Object dataportion, Cell NextCell) { data = dataportion; next = NextCell; } //end constructor } //end Cell Cell används för positioner Länk private class Cell implements Pos { } // se förra sidan för konstruktorer public boolean eq(pos p) { if (((Cell)p).next == this.next) return true; else return false; } Referens, pekare En fysisk datatyp i många språk Objekt som refererar till annat objekt Konstrueras oftast som index i fält (kursor) Billigare kopiera länkar till objekt än objekten själva
Dynamiska resurser Skapar dataobjekt för tillfälliga behov Kill lösgör resurser Create reserverar resurser Vålnader döda celler som går igen uppkommer om man dödar celler som det fortfarande finns länkar till. använd Kill med försiktighet! Sophämtning administrativ procedur identifierar och återvinner objekt som inte utnyttjas (JAVA)