Datastrukturer och algoritmer Föreläsning 1-2
Innehåll Kurspresentation och information Föreläsning Innehållsöversikt, upplägg, kursmaterial, kursutvärdering, förväntade studie resultat etc... Föreläsning Programbyggnadskonst Olika ansatser Viktiga begrepp Listor Specifikation, Konstruktion Algoritmmönster Riktade listor, länkade celler Dynamiska resurser Att läsa: Kapitel 1-4
Kursens innehåll Abstrakta datatyper Algoritmer Begrepp, definition, konstruktion Algoritmer Tids- och rumsfrågor Designprinciper Sökning Sortering Introduktion till projektarbete enligt LIPS-modellen Både teoretiskt och praktiskt
Kursens innehåll – Abstrakta Datatyper (ADT) 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 +/-, när var hur, komplexitet för de viktigaste operationerna Vart hittar vi ADT typiskt, vilka typproblem? Hur hänger ADT ihop med andra ADT? Algoritmer på ADT
Kursens innehåll – Algoritmer Tids och rumsfrågor Exekvering, implementering, underhåll Tids- och rumskomplexitet Fokus på tidskomplexitet T(n) för en alg => O(n) Experimentell och asymptotisk analys Att beskriva algoritmer Designprinciper Brute force, Divide&conquer, Greedy och dynamisk programmering
Kursens innehåll – Algoritmer Sökning (traversering) Vad är traversering Linjär- och Binärsökning +/- Krav på implementationen av ADTn Sortering Varför sorterar vi? Sorterad ADT vs sortering av data 5-6 olika algoritmer, inklusive analys Stabil sortering
Kursens innehåll – Projektarbete enligt LIPS-modellen 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
Kursens upplägg Föreläsningar (16 st) Gruppövningar (4 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 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! Max 15 arbetsdagar (för första tentan blir det 30/6) Ett urval av gamla tentamina från tidigare år finns på kurssidan.
Obligatoriska uppgifter 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 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. “Jag hinner inte” kommer inte att godtas som enda skäl till uppskov. Resultat anslås på kursens hemsida.
OU2 Implementera tabeller Syfte: Du ska 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 Analysera algoritmer Syfte: Du ska 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.
Projektet Implementera mjukvaran i en Router Syftet: Ni ska 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 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
Kursens (och bokens) strategi: 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 Kurslitteratur Referenslitteratur: 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
Kursmaterial Allt material som ev. delas ut under kursen http://www.cs.umu.se/kurser/5DV043/VT08/ 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 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
Vad krävs för att nå dit? 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? 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...
Hur kan jobbet fördelas? 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!
Projektet 50h * 2 personer = 100h! Översikt över kursen Vecka 14 15 16 17 18 19 20 21 22 23 F/G 6 4 2 Plugg 7 OU 9 11 13 Projektet 50h OU2 15h OU3 8h OU4 25h OU5 8h OU6 33,5h OU1 0.5h Projektet 50h * 2 personer = 100h!
Kursutvärdering från ifjol 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
Till den som ska planera kursen nästa gång: 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. 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. Samma frågor ställs flera gånger och mailandet tar för mycket tid från personlig handledning.
Förändringar på kursen sen förra året 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 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! Gå till http://www.student.umu.se/ Logga in (med ert UMDAC-student konto + lösenord) 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)!
Förkunskaperna innebär i praktiken Studenten ska kunna implementera en godtycklig algoritm-beskrivning i JAVA/C. ha god erfarenhet av problemlösning.
Kursens mål FSR (1) 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 grund-lä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 (konstruk-tioner) av de valda datatyperna och algoritmerna
Kursens mål FSR (2) 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 objektoriente-ringsparadigmen praktiskt på ett programmeringsprojekt, dvs. konstruera en komplett programvara inklusive doku-mentation (med systembeskrivning och webbaserad API) utifrån givna riktlinjer utforma en enkel arbetsplan för ett programmerings-projekt som utförs i grupp samt dokumentera, följa upp och skriftligt utvärdera den gjorda planeringen.
Inblandade personer Föreläser Håller i gruppövningar: 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)
MIT-huset, våning 4 Lablådor Oskar Johan support Lena Studentexp. Studievägl. Pedher Studievägl. Lena P Lena
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 Datatyper – representera datat i programmet Algoritmer – stegvis plan för att utföra något, modellera hur man löser problemet Kontrollstrukturer – för att modellera flödet Utvärdering/uppföljning Komplexitetsanalys Valideringskriterier Specifikation/beskrivning: Förståelse för hur den färdiga konstruktionen ska utnyttjas, vilken uppgift den ska fylla, driftsförhållanden, framtida behov etc Materialkännedom är viktigt, teknikkunskap och vetskap om bakomliggande teorier. Kunskap och färdighet i att använda olika verktyg operativsystem editorer Metodkunskap, förmåga att utvärdera olika konstruktionsförslag, kvalitetskriterier etc kreativitet.
Metaforer och världsbilder för programbyggnad Låg nivå nära datorn Metaforer för programbyggnad Instruktionsmetaforen Problemlösningsmetaforen Adaptionsmetaforen Världsbilder/ansatser Manipulativa ansatsen Funktionella ansatsen Objektorienterade ansatsen Hög nivå Boken ligger på en mellannivå….
Metaforer för programbyggnad Låg nivå nära datorn Instruktionsmetaforen Programmeraren är en arbetsledare Ger instruktioner till datorn Datorn följer dessa i tur och ordning till punkt och pricka. Problemlösningsmetaforen Vad ska göras och hur ska det göras? Programmeraren löser problemet (skriver en algoritm) som sedan implementeras. Adaptionsmetaforen Programmet är ett objekt som ingår och interagerar med en miljö. Programmet anpassas till miljön gradvis Hög nivå Boken ligger på en mellannivå….
Datavärldsbilder Manipulativa ansatsen Funktionella ansatsen Hantverksmetafor, man har ett (passivt) objekt som bearbetas steg för steg tills man nått målet. Imperativa språk som C, Pascal, Modula, Ada Funktionella ansatsen Matematisk funktionsmetafor, man ändrar aldrig ett objekt. Resultatobjekten är avbildningar av startobjekten. Funktionella/relationella språk som ML, Lisp, Prolog Objektorienterade ansatsen Objekten har själv egenskaper och beteenden och interagerar med andra objekt. Händelsestyrd programmering. Objektorienterade språk som Java, C++
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 3.4 12 ”hej” 7 true ’a’ y 52.1
Terminologi Datatyp = objekt + operationer Objekten finns i en värdemängd/objektmängd Operationerna kan vara funktioner, relationer och predikat -3 34 12 7 15 98 -345 52 ”udda” - * heltal = + % + ”jämn” > / <=
enkel sammansatt datatyp heterogen homogen Relation (personinfo) namn ålder kön Relation (personinfo) Lista av heltal: 1 7 3 5 till exempel Heltal: 1,2,3,4 till exempel till exempel homogen heterogen kan vara enkel sammansatt ... kan vara... datatyp
datatyp konkret abstrakt konstruerad implementerad fysisk Står det bara ”datatyp” så menar man ”abstrakt datatyp” abstrakt konkret ... kan vara... fysisk implementerad konstruerad ... kan vara ... När man pratar om en datatyp utan att bry sig om och hur den är realiserad i programspråk/hårdvara När man besrkivit hur objekten ska representeras och hur operationerna skulle kunna implementeras (algoritmer) Kan anses vara abstrakt eftersom... En fysisk datatyp är... En datatyp som är impl i en fysik datatyp är... Komplett konstruerad från grunden och redo att användas i ett program Implementerad i språket/hårdvaran tex int, char
Mer terminologi: Element Beståndsdel i en sammansatt datatyp Består av värde och position a Värde: 2 Position: 3 c d e 23 53 2 -2 f g h i j Värde: d Position: 2:a barn till roten
Mer terminologi: Struktur Position 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 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)
Genomgång av en datatyp Konstruktioner och implementationer Olika sätt att konkretisera datatypen ”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
Lista Modell Organisation Pärm Diskret linjärt ordnad Bläddra, inspektera, lägga till, ta bort Organisation Diskret linjärt ordnad Ändligt antal linjärt ordnade element Första / sista element Före / efter relation av element (inte värden) Alla element (utom det sista) har en efterföljare Alla element (utom det första) har en föregångare Två grundprinciper för konstruktion av lista dynamisk mha länkade celler statisk mha fält Mer om implementationen senare Byggblock för andra strukturer
ADT:n Lista är en Dynamisk datatyp Generisk datatyp (polytyp) Struktur och storlek förändras under datatypens livslängd Generisk datatyp (polytyp) Lista av typ Typ kan vara av vilken typ som helst 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) Insert (v,p,l) – Sätter in ett element med värdet v omedelbart före position p, returnerar positionen för v Isempty(l) – True om listan är tom Inspect(p,l) – Returnerar värdet för elementet på position p, operationen är inte definierad för listans sista pos. (End) First,End – returnerar listans första resp. sista position OBS! End pekar på positionen efter sista elementet Next(p,l) Previous(p,l) – returnerar närmast efterföljande (föregående) ej definierad för listans sista (första) position Remove(p,l) – tar bort element i positionen p, returnerar nya positionen för det element som följde omedelbart efter
Lista – Specifikation: Informell funktionsspecifikation Empty() – skapar ett nytt tomt listobjekt (konstruktor). En tom lista har en position som är First(l) = End(l) Insert (v,p,l) – sätter in ett element med värdet v omedelbart före position p, returnerar positionen för v Isempty(l) – true om listan är tom, dvs First(l) = End(l) Inspect(p,l) – returnerar värdet för elementet på position p. Operationen är inte definierad för listans sista pos First,End – returnerar listans första resp. sista position. OBS! End pekar på positionen efter sista elementet Next(p,l) Previous(p,l) – returnerar närmast efterföljande (föregående). Ej definierad för listans sista (första) position Remove(p,l) – tar bort element i positionen p, returnerar nya positionen för det element som följde omedelbart efter
Bild från sidan 47 i Janlert L-E. , Wiberg T Bild från sidan 47 i Janlert L-E., Wiberg T., Datatyper och algoritmer, Studentlitteratur, 2000
Varför är specifikationen viktig? 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
Implementation av gränsyta till Lista 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 public interface Pos { public boolean eq(Pos p); }
Implementation av gränsytan i C /* 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 Avsatt för lite / mycket utrymme Måste flytta delar av listan framåt / bakåt ADT Lista implementerad enligt specifikation och gränssnitt Kan använda ADT:ens operationer utan att veta hur den är implementerad: VAD den gör inte HUR är intressant Jämför med läskautomat: När du ska köpa läsk ser du bara gränsytan och bryr dig inte hur den funkar bara du får din läsk. Kan bara utföra de uppgifter som gränsytan presenterar Måste förstå uppgifterna (Vad måste man göra för att köpa läsk) Kan inte se insidan av maskinen Kan använda den utan att veta vad som händer på insidan Om man byter ut maskinens inre teknik med en ny version men med samma gränsyta kan du använda maskinen på samma sätt ListClient läskköparen Göra en lista som håller reda på en resultatlista. Hålla reda på löparnas placering, lägga in löparna sist i listan Antar att AList implementerar Java gränssnittet List List runnerList = new AList(); //Kan bara anropa metoder i gränssnittet VISA källkod för runnerList 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 * Kommer bara åt listelement genom att traversera från listans början (kan lösa detta genom en ”svans” om man ofta ska lägga till/ta bort i slutet av listan) Gå igenom stolarna Alltså: För att konstruera en lista behöver vi något som håller reda på referenser och elementvärden Cell kan liknas vid stolen
Länkad Lista Länkar mellan elementen Elementen är en cell som består av länkar och värde Dubbel eller enkellänkad En länk framåt och en bakåt Kan ha ett huvud för att undvika problem med första och sista elementet. Huvudet saknar värde nextel refererar till 1:a elementet prevel refererar till sista elementet Gå igenom implementationen för DLLista
Dubbellänkad lista Före insättning
Dubbellänkad lista Skapa ny nod för insättning newNode skapas nodeBefore nodeAfter 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 Ta bort ett element nodeBefore nodeAfter nodeToRemove nodeBefore = nodeToRemove:s ”bakåt” länk nodeAfter = nodeToRemove:s ”framåt” länk nodeBefore:s ”framåt” länk = nodeAfter nodeAfter:s ”bakåt” länk = nodeBefore
Dubbellänkad lista Efter borttagning
Algoritmmönster Traversering Sökning Filtrering 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 Några exempel på grundläggande algoritmer Lista kan traverseras på två sätt: från början -> slutet eller tvärtom Betydelse för problemet vilken ordning man besöker elementen Resultatobjekt initieras Traversering av listan Kolla om man nått slutet av listan eller ska avbryta av annat skäl Visa pseudokod
Algoritmmönster Reduktion Mappning Beräknar en funktion av objektets elementvärden Ex. Summera alla tal i en lista Mappning Transformera varje elementvärde i en datastruktur Ex. multiplicera alla talen i en lista med 4
Riktad Lista Modell Organisation Rekursiv definition: 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 Kan ta sig till starten Passerar portarna i bestämd riktning Kan åka om en del av banan Har riktning men bara framåt SPECIALISERING: tar bort operationer ur gränsytan, utan att mängden objekt som kan konstrueras förändras. Rekursiv def: En riktad lista är tom eller har ett första element som följs av en riktad lista Minnesutrymmet prop mot antalet element i listan
Riktad Lista – Specialisering 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... Java: Kan ej ta bort en del av gränsytan för en överordnad klass Riktad Lista som helt ny klass => Ingen återvinning av kod
Gränsyta till Riktad Lista 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)
Riktad Lista – konstruktion Konstruerad som Fält Dubbellänkad Lista Enkellänkad Lista Mer (rums)ekonomisk – behöver ju ändå inte bakåtlänkarna Enkellänkad Lista Mer ekonomisk, behöver inte bakåtlänkarna
Riktad Lista som Enkellänkad Lista Problem vid insättning Lösning: Representera position mha en länk till föregångarelementet Fysisk och logisk referens Listhuvud Tomma objekt Gränspositioner Problem vid insättning Ex på tavlan Representera position mha en länk till föregångarelementet => PROBLEM VID FÖRSTA ELEMENTET Listhuvud – handtag till listan, som länkar till det första elementet Underlätta konstruktionen för datatypens operationer när det gäller Tomma objekt: Har fortfarande huvudet kvar Gränspositioner: I ”ändarna” av objektet Lagra info om dataobjektet (huvudet av annan typ än elementen)
Enkellänkad Lista Konstruktion utan huvud Stopplänkvärde (nil, null) Insättning före elementet X Skapa en ny cell Sätt in den efter X Kopiera X:s värde till den nya cellen Sätt X:s värde till v Slutpositionen identifieras genom ett stopplänkvärde Insättning av ett nytt element med värde v före elementet X så här: skapa en ny cell sätt in den i listan efter X Kopiera X:s värde till den nya cellen Sätt X:s värde till v Kopieringen tar olika tid beroende på språk Java: Kopierar referens => snabbt Java jobbar med referenstilldelning, dvs cellens värde är en referens till objektet med det egentliga värdet
n-länkad Cell Tippel som består av Byggmaterial för andra datatyper ett värde n st länkar Byggmaterial för andra datatyper n-länkad struktur Objekt konstruerade med n-länkade celler 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 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
”1-Cell” 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) next = NextCell; } //end Cell
Cell används för positioner 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; } Det finns olika typer av listor Dubbellänkade Enkellänkade Riktade
Länk Referens, pekare Objekt som refererar till annat objekt 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 Ex på sid 82 Länk som index i fält Fysisk datatyp i många programspråk Tillämpning: Flytta och kopiera länkar till stora dataobjekt i st f att kopiera objektet
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) Skapar dataobjekt för tillfälliga behov Kill, Create för att lösgöra resp skapa resurser som behövs Ex Vid kopiering Cell och lista implementerade som dynamiska resurser se figur 4.14 Upptar resurser, utrymme och administrativa kostnader Dynamisk datatyp: Kan modifiera objektets struktur (storlek) Dynamisk resurs: skapar nya objekt vid behov som hämtas ur ett förråd och outnyttjade objekt återgår till detta förråd Cell statisk datatyp som är en dynamisk resurs Vålnader: döda celler som ”går igen” om man dödar celler som det fortfarande finns länkar till. Använd Kill med försiktighet Sophämtning (garbage collection) Administrativ procedur identifierar och återvinner objekt som inte utnyttjas (JAVA)