Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Relevanta dokument
Föreläsning 5. Rekursion

Föreläsning 5. Rekursion

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Föreläsning 13. Dynamisk programmering

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Rekursion. Koffman & Wolfgang kapitel 5

Algoritmer och Datastrukturer

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Föreläsning 8 Innehåll

Algoritmer, datastrukturer och komplexitet

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Rekursion och induktion för algoritmkonstruktion

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Algoritmer, datastrukturer och komplexitet

Algoritmer och Datastrukturer

DD1361 Programmeringsparadigm. Carina Edlund

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Övning 2. (Länkade) Listor, noder

Föreläsning 6. Rekursion och backtracking

Programkonstruktion och Datastrukturer

Algoritmer, datastrukturer och komplexitet

Rekursion och induktion för algoritmkonstruktion

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

Föreläsning 11: Rekursion

Övningshäfte 2: Induktion och rekursion

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 13. Rekursion

Föreläsning 1, vecka 7: Rekursion

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Föreläsning 6: Introduktion av listor

Algoritmer, datastrukturer och komplexitet

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 6. Rekursion och backtracking

Algoritmer, datastrukturer och komplexitet

Asymptotisk komplexitetsanalys

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Magnus Nielsen, IDA, Linköpings universitet

Tentamen TEN1 HI

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 13. Dynamisk programmering

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Våra enkla funktioner eller procedurer

Datastrukturer och algoritmer

Algoritmer, datastrukturer och komplexitet

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Dekomposition och dynamisk programmering

ARITMETIK 3. Stockholms universitet Matematiska institutionen Avd matematik Torbjörn Tambour

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Objektorienterad programmering

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Sökning och sortering

CS - Computer science. Datateknik Informationsbehandling Datalogi Datavetenskap (ÅA 2008)

Rekursion och induktion för algoritmkonstruktion

MMA132: Laboration 2 Matriser i MATLAB

Pythons standardbibliotek

Datastrukturer. föreläsning 2

Tentamen Datastrukturer, DAT037 (DAT036)

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Värmedistribution i plåt

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 9: Talteori

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Pseudokod Analys av algoritmer Rekursiva algoritmer

Några svar till TDDC70/91 Datastrukturer och algoritmer

Datastrukturer D. Föreläsning 2

Algoritmer och datastrukturer. HI1029 8,0 hp Introduktion

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 12. Söndra och härska

TDDC74 Programmering, abstraktion och modellering. Tentamen

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Föreläsning 5: Dynamisk programmering

Föreläsning 3-4 Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Teoretisk del. Facit Tentamen TDDC (6)

1, 2, 3, 4, 5, 6,...

International Olympiad in Informatics July 2011, Pattaya City, Thailand Tävlingsuppgifter Dag 2 Svenska 1.3. Papegojor

Algoritmer och Datastrukturer

Transkript:

Algoritmer och datastrukturer H I 1 0 2 9 HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

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

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

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)

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?

Rekursion Rekursion är en mycket mäktig problemlösningsstrategi 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

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: f n = f n-1 + f n-2, n=2,3,4, f 0 = f 1 = 1 (termineringsvillkor viktigt!) En funktion i C som beräknar godtyckligt Fibonaccital: 1 int f(int n){ 2 if(n==0 n==1) 3 return 1; 4 else 5 return f(n 1)+f(n 2); 6 }

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 else 5 return f(n 1)+f(n 2); 6 } Observera att vi får räkna ut f(1) två gånger

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

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; } Varje värde beräknas en gång! Ännu bättre: f n 1 5 2 n 1 n 1 1 5 2 5

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

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?

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

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?

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

Algoritm

Rekursionsträd

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!

Rekursiv: Implementering

Implementering Iterativ: a / b -hakarna betyder avrunda nedåt till närmsta heltal

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!