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
Recept
strukturerat sätt
• Ändlig stegvis
beskrivning av en ändlig
process
Ingredienser
Ugn,
plåtar, etc
Bullar
4
Algoritm?
Ingredienser
• 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.
Recept
Ugn,
plåtar, etc
• 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
….
Bullar
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.
2.
3.
Skriv ner talet 0
Gå igenom listan, och för varje anställd så
adderar man du personens lön till det skrivna
talet
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
23. Donald Knuth
– Måste ha ett eller flera utdata
• Effektivitet/Genomförbarhet
– Varje steg i algoritmen måste gå
att utföra på ändlig tid
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
Algorithm seek(list, func)
Sökning
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
© Copyright 2025