Download - Algoritmer och datastrukturer
![Page 1: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/1.jpg)
HI1029HÅKAN STRÖMBERG
NICKLAS BRANDEFELT
Algoritmer och datastrukturer
![Page 2: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/2.jpg)
Föreläsning 1
Inledande om algoritmerRekursionStacken vid rekursionRekursion – iterationMöjliga vägarGCDInlämningsuppgifter
![Page 3: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/3.jpg)
Algoritm
En algoritm är ett begränsat antal instruktioner/steg för att lösa en uppgift, som från givna indata med säkerhet leder till korrekta utdata.
Precision - varje steg är noggrant bestämtDeterminism -resultatet av varje steg är
entydigtÄndlig - når målet efter ett ändligt antal steg
![Page 4: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/4.jpg)
Ett exempel
Problem: Hitta det största av tre talGivet: Tre tal a, b och c.Sökt: Det största av de tre talenAlgoritm (pseudokod):
TRETALMAX(a,b,c)local xx ← aif b > x then x ← bif c > x then x ← creturn (x)
![Page 5: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/5.jpg)
Frågor
Terminerar algoritmenFungerar den för alla giltiga indata
(gränsvärden)Producerar den korrekt resultatÄr den tillräckligt effektiv, går den att
effektivisera?
![Page 6: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/6.jpg)
Rekursion
Rekursion är en mycket mäktig problemlösnings-strategi
Det är ofta det enklaste sättet att lösa ett problem och kräver ofta mycket mindre kod än alternativen (iteration)
Däremot är det inte säkert att lösningen blir effektiv och specifikt brukar den kunna kräva mycket minne
För den ovane känns rekursion ofta krångligt men när man fått grepp om tekniken är den oumbärlig
![Page 7: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/7.jpg)
Rekursivt definierad talföljd
Innan vi tittar på rekursion för problemlösning värmer vi upp med en rekursivt definierad talföljd
Fibonacci-följden:fn = fn-1 + fn-2 , n=2,3,4,…
f0 = f1 = 1En funktion i C som beräknar godtyckligt
Fibonaccital: 1 int f(int n){2 if(n==0| |n==1)3 return 1;4 else5 return f(n−1)+f(n−2);6 }
![Page 8: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/8.jpg)
Rekursionsträd
f(3)=f(2)+f(1)
f(2)=f(1)+f(0) f(1)=1
f(1)=1 f(0)=1 1 int f(int n){2 if(n==0| |n==1)3 return 1;4 else5 return f(n−1)+f(n−2);6 }
Observera att vi får ”räkna” ut f(1) två gånger
![Page 9: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/9.jpg)
Stacken vid funktionsanropNär en funktion anropas i C, så skapas utrymme på stackenför de lokala variablerna, parametrarna och återhoppsadressen
![Page 10: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/10.jpg)
Rekursivt-iterativt
Det är bevisat matematiskt att alla problem som kan lösas rekursivt också kan lösas iterativt
Att hitta den iterativa lösningen kan däremot vara svårt.
Fibbonaci:Rekursivt:int fib(int n){ if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2);}
Iterativt:int fib(int n){ int i,fi,fim1=1,fim2=1; for(i=2;i<=n;i++) { fi=fim1+fim2; fim2=fim1; fim1=fi; } return fi;}
Ännu bättre:
5
251
251
11
nn
nf
Varje värde beräknas en gång!
![Page 11: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/11.jpg)
Fakultet
Nu ska vi titta på ett av de mest klassiska av problem att lösa rekursivt nämligen fakultet:
Definition: n! = 12…(n-1)nExempel 5! = 12345Den rekursiva lösningen får vi genom att
observera att 5! = 54! eller n!=n(n-1)! Rekursivt:int fak(int n){ if(n==0) return 1; else return n*fak(n-1);}
Iterativt:int faki(int n){ int i,p=1; for(i=2;i<=n;i++) p*=i; return p;}
Ökar vi n med 1 ökar antalet anrop av den rekursiva funktionen med ett och antalet varv i den iterativa rutinen med ett. Mängden arbete växer linjärt med n.
![Page 12: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/12.jpg)
Gissa ett tal
Vi ska konstruera en algoritm som ska hitta ”rätt” tal mellan tex 1 och 100. Vid varje gissning man gör får man veta om man gissat rätt, för högt eller för lågt. Algoritmen ska då hitta rätt tal på så få gissningar som möjligt.
Hur skulle du göra?Kan du formulera en algoritm?
![Page 13: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/13.jpg)
Lösning
int gissa(int min, int max, int antal){ int x = (min+max)/2;//gissning if(x==hemlig) return antal; else { if(x<hemlig) { return gissa(x+1,max,antal+1); } else { return gissa(min, x-1, antal+1); } }}
![Page 14: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/14.jpg)
Antal möjliga vägar
Hur många unika vägar finns det från övre högra hörnet till nedre vänstra hörnet om vi bara får gå väst och syd?
![Page 15: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/15.jpg)
Lösning
Vi löser problemet genom att gå alla vägar och räkna hur många det blir.
Låt m vara antal rader och n vara antal kolumner
Vid varje vägval kan vi då välja att gå väst och därmed minska n med ett eller gå syd och minska m med ett
När m och n är noll är vi framme
m = 5
n = 6
![Page 16: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/16.jpg)
Algoritm
![Page 17: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/17.jpg)
Rekursionsträd
![Page 18: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/18.jpg)
Största gemensamma delaren
Greatest common divisor: GCD(78,21)=3Fås enklast med Euklides algoritm:
GCD(78,21)78 = 3 21 + 15 ger GCD(21,15)21 = 1 15 + 6 ger GCD(15,6)15 = 2 6 + 3 ger GCD(6,3) 6 = 2 3 + 0 ger GCD(3,0)och då är svaret 3!
![Page 19: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/19.jpg)
Implementering
Rekursiv:
![Page 20: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/20.jpg)
Implementering
Iterativ:
ba / -hakarna betyder avrunda nedåt till närmsta heltal
![Page 21: Algoritmer och datastrukturer](https://reader036.vdocuments.pub/reader036/viewer/2022062309/568152df550346895dc0fe06/html5/thumbnails/21.jpg)
Inlämningsuppgifter
Följande uppgifter redovisas senast måndag den 21 januari och kan inte redovisas senare:1.5, 1.7, 1.9, 1.14, 1.15, 1.16
Dessa uppgifter bör göras nu för att ni ska kunna följa kursen på ett bra sätt. Övriga kan ni göra vid tillfälle för högre betyg. I början kommer jag prioritera att ta emot redovisningar av dessa tidsbegränsade uppgifter!