1 / 21

Algoritmer och datastrukturer

Algoritmer och datastrukturer. HI1029 Håkan strömberg Nicklas Brandefelt. Föreläsning 1. Inledande om algoritmer Rekursion Stacken vid rekursion Rekursion – iteration Möjliga vägar GCD Inlämningsuppgifter. Algoritm.

wray
Download Presentation

Algoritmer och datastrukturer

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algoritmer och datastrukturer HI1029 Håkan strömberg Nicklas Brandefelt

  2. Föreläsning 1 Inledande om algoritmer Rekursion Stacken vid rekursion Rekursion – iteration Möjliga vägar GCD Inlämningsuppgifter

  3. 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ämt Determinism -resultatet av varje steg är entydigt Ändlig - når målet efter ett ändligt antal steg

  4. Ett exempel Problem: Hitta det största av tre tal Givet: Tre tal a, b och c. Sökt: Det största av de tre talen Algoritm (pseudokod): • TRETALMAX(a,b,c) local x x ← a if b > x then x ← b if c > x then x ← c return (x)

  5. Frågor Terminerar algoritmen Fungerar den för alla giltiga indata (gränsvärden) Producerar den korrekt resultat Är den tillräckligt effektiv, går den att effektivisera?

  6. 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

  7. 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= 1 En funktion i C som beräknar godtyckligt Fibonaccital: 1 intf(intn){ 2 if(n==0| |n==1) 3 return1; 4 else 5 return f(n−1)+f(n−2); 6 }

  8. Rekursionsträd f(3)=f(2)+f(1) f(2)=f(1)+f(0) f(1)=1 f(0)=1 f(1)=1 1 intf(intn){ 2 if(n==0| |n==1) 3 return1; 4 else 5 return f(n−1)+f(n−2); 6 } Observera att vi får ”räkna” ut f(1) två gånger

  9. Stacken vid funktionsanrop När en funktion anropas i C, så skapas utrymme på stacken för de lokala variablerna,parametrarna och återhoppsadressen

  10. 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: 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; } Rekursivt: intfib(int n) { if(n==0||n==1) return 1; else returnfib(n-1)+fib(n-2); } Ännu bättre: Varje värde beräknas en gång!

  11. Fakultet Nu ska vi titta på ett av de mest klassiska av problem att lösa rekursivt nämligen fakultet: Definition: n! = 12…(n-1)n Exempel 5! = 12345 Den rekursiva lösningen får vi genom att observera att 5! = 54! eller n!=n(n-1)! Ö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. Rekursivt: intfak(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; }

  12. 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?

  13. 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); } } }

  14. 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?

  15. 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 n = 6 m = 5

  16. Algoritm

  17. Rekursionsträd

  18. Största gemensamma delaren Greatest common divisor: GCD(78,21)=3 Få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!

  19. Implementering Rekursiv:

  20. Implementering Iterativ: -hakarna betyder avrunda nedåt till närmsta heltal

  21. 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!

More Related