Datastrukturer och algoritmer (Python) Algoritmer och listor 1
Innehåll Algoritmer och pseudokod som ett sätt att beskriva dem. Abstrakta datatypen lista och algoritmmönster för lista. Olika sätt att konstruera lista och riktad lista. 2
Algoritmer Vad är det? Mer formellt om algoritmer beräkningsbarhet Att beskriva algoritmer Analysera algoritmer Exekveringstid, minnesåtgång 3
Vad är en algoritm? Recept som man följer för att lösa ett givet problem på ett strukturerat sätt Ändlig stegvis beskrivning av en ändlig process Recept Ingredienser Bullar Ugn, plåtar, etc 4
Algoritm? Texten som beskriver algoritmen är fix stor Receptet har samma storlek oavsett hur många bullar som bakas. Processen kan variera i storlek Antalet bullar som bakas kan variera. Kornighet i en algoritm Grovkornig: 1. Blanda mjöl och bakpulver i en skål. Finkornig: 1. Ta fram en skål som rymmer 5l 2. Ta fram ett decilitermått 3. Mät upp X dl mjöl 4. Häll mjölet i skålen. Recept Ingredienser Bullar Ugn, plåtar, etc 5
Exempel Antag att vi har en lista på alla anställda på ett företag: Namn, Pnr, lön, etc. Vi vill räkna ut lönekostanden för företaget. 1. Skriv ner talet 0 2. Gå igenom listan, och för varje anställd så adderar man du personens lön till det skrivna talet 3. När man nått slutet på listan så är det nedskrivna talet resultatet 6
Algoritmer mer formellt Definition: Algoritm är en noggrann plan, en metod för att stegvis utföra något 7
Krav på algoritmer Ändlighet Algoritmen måste sluta Bestämdhet Varje steg måste vara entydigt Indata Måste ha noll eller flera indata Utdata Måste ha ett eller flera utdata Effektivitet/Genomförbarhet Varje steg i algoritmen måste gå att utföra på ändlig tid 23. Donald Knuth 8
Algoritmer mer formellt Reglerna för algoritmer beskriver inte tillräckligt tydligt vad det är man kan göra i form av algoritmer vad som är beräkningsbart. Definition av beräkningsbarhet: Ett problem är beräkningsbart omm det finns en Turingmaskin som löser problemet. Turing maskin 9
Att (be)skriva algoritmer Vi behöver ett språk som: Är strukturerat och formellt Mindre formellt än programmeringsspråk Ingen typning Dynamisk bindning Räckvidd 10
Pseudokod Mix av naturligt språk och programmeringsspråk Influenser från matematisk notation används för tilldelning = används för likhetsrelationen Funktionsdeklaration Algorithm name(param1,param2) 11
Pseudokod programkonstruktioner Valstrukturer: if then [else ] Villkorsloopar: while do repeat until Räkneloopar: for do Anrop: algoritmname(args) Arrayindexering: A[i] Returnera värden: return value 12
Pseudokod exempel Algorithm arraymean(v,n) input: An array v storing n integers output: The average of the n elements in v sum v[0] for i 1 to n-1 do sum sum + v[i] return sum/n 13
Pseudokod Vi använder oss av pseudokod för att beskriva algoritmer Det finns inget universellt språk utan många dialekter Alla döljer mycket av programspråkens designval, dvs. pseodokoden är programspråksoberoende 14
Implementation av pseduokoden i två olika språk C float arraymean(float *v, int n){ float sum = v[0]; for (int i = 1; i < n; i++) sum = sum + v[i]; return sum/n; } Python def arraymean(v,n): sum = v[0] for i in range(1,n): sum = sum + v[i] return sum/n 15
Lista Generisk datatyp (polytyp) Lista av typ Typ kan vara av vilken typ som helst Instansiering: ger typparametern ett värde tex Lista av Heltal som fortfarande är en ADT Homogen datatyp Alla element har samma typ Ex på listtyper lista av heltal (3 12 7 23 5) lista av tecken ( a, r, t ) lista av (lista av heltal) ((5 27 18) (43 5) (2 0 9)) 16
Lista Modell Pärm Bläddra, inspektera, lägga till, ta bort Konstruktion Dynamiskt med hjälp av länkade celler Dynamisk datatyp: Kan modifiera objektets struktur (storlek) Statiskt med hjälp av fält/arrayer 17
Lista Ändligt antal linjärt ordnade element Första / sista element Före / efter relation Dynamisk datatyp Struktur och storlek förändras under datatypens livslängd 18
Lista Element Värde och position Struktur Bortser från elementvärden Position Plats i strukturen positionsbeskrivningar förändras när element sätts in eller tas bort positionen är elementets förhållande till objektet i övrigt hur man anger positioner avgörs vid konstruktionen av datatypen. strukturförändrande operationer behöver returnera nytt positionsvärde 19
Riktad Lista Modell Slalombana Kan bara flytta sig framåt Specialisering av Lista 20
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) 21
Dynamiska resurser Skapar dataobjekt för tillfälliga behov Kill- lösgör resurser Create - reserverar resurser Vålnader minne som är avallokerat, men som vi fortfarande refererar till Sophämtning Administrativ procedur identifierar och återvinner objekt som inte utnyttjas I Python behöver programmeraren inte hantera skapande och återlämnandet. Det sköts internt av Python Har en egen minnespool så att kommunikationen med operativsystemet minimeras. 22
Länk Referens, pekare Fysisk datatyp i många programsprå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 23
Gränsyta till Länk Abstract datatype Make Nil Isnil Follow Equal Link (obj) (x : obj) -> Link (obj) ( ) -> Link (obj) (l : Link (obj)) -> Bool (l : Link (obj)) -> obj (l1,l2 : Link (obj)) -> Bool 24
Gränsyta till Lista 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) 25
Skillnad mellan Lista och Riktad lista I Lista finns previous- och endoperationer så att vi kan navigera åt båda hållen Riktad lista har en isend operation istället för end. 26
Algoritmmönster för lista 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 27
Algoritmmönster för lista Reduktion 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 28
Traversering Algorithm traverse(list, myfunc) input: A list and a function to apply to all elements in a list output: Besöker systematiskt alla element pos first(list) while not isend(list, pos): func(inspect(list, pos)) pos next(list, pos) def traverse(list, func): pos = list.first() while not list.isend(pos): func(list.inspect(pos)) pos = list.next(pos) 29
Sökning Algorithm seek(list, func) input: A list and a function to compare an element with the one we seek output: Söker efter ett element found False pos first(list) while not found and not isend(list, pos) if func(inspect(list, pos)) then found True foundpos pos else pos next(listpos) if found then return (True, foundpos) else return (False, None) 30
Filtrering Algorithm filter(list, func) newlist empty() pos first(list) while not isend(list, pos) val inspect(list, pos) if func(val) then insert(newlist, first(newlist), val) pos next(list, pos) return newlist 31
Reduktion Algorithm reduce(list, func) pos = first(list) val1 = inspect(list, pos) pos = next(list, pos) val2 = inspect(list, pos) pos = next(list, pos) res = func(val1, val2) while not list.isend(pos): res = func(res, inspect(list, pos)) pos = next(list, pos) return res 32
Mapping Algorithm map(list, func) newlist empty() pos first(list) while not isend(list, pos) val func(inspect(list, pos)) insert(newlist, first(newlist), val) pos next(list, pos) return newlist 33
Sätt att konstruera lista Lista Lista som fält Lista konstruerad med 2-Cell 34 34
Lista som Fält Fördelar Snabb inspektion av element Fast bara om man utnyttjar att man vet hur position är implementerad vilket man inte borde göra Nackdelar Fast reserverat utrymme Går delvis att komma runt genom att skapa en ny större array vid behov (detta är dock kostsamt) Kostsamt sätta in / ta bort element Måste flytta delar av listan framåt eller bakåt för att rymma det nya elementet. 35
Länkade strukturer Fördelar Insättning / borttagning går snabbt Minnesutrymmet är proportionellt mot storleken Allokerar minne när det behövs Nackdelar: Länkarna behöver också minnesutrymme Kommer bara åt listelement genom att traversera från listans början eller slut 36
Dubbellänkad Lista Länkar mellan elementen Elementen är en cell som består av länkar och värde 37
Riktad Lista Konstruerad som Fält Dubbellänkad Lista Enkellänkad Lista Enkellänkad Lista Mer ekonomisk 38
Enkellänkad Lista Problem vid insättning Lösning: Representera position mha en länk till föregångarelementet Listhuvud Tomma objekt Gränspositioner 39
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 40
n-länkad Cell Tippel som består av ett värde n stycken länkar Byggmaterial för andra datatyper n-länkad struktur Objekt konstruerade med n-länkade celler Listor, träd 41
Gränsyta till 1Cell abstract datatype 1Cell(val) Create () -> 1Cell(val) Set-value(v:val,c:1Cell(val)) -> 1Cell(val) Set-Link (l:link(1cell(val)),c:1cell(val)) -> 1Cell(val) Inspect-value (c:1cell(val))-> val Inspect-link (c:1cell(val))-> Link(1Cell(val)) Kill (c:1cell(val)) 42
1Cell i Python class OneCell: def init (self): self._data = None self._link = None def setvalue(self,data): self._data = data def setlink(self,link): self._link =link def inspectvalue(self): return self._data def inspectlink(self): return self._link 43