PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering

Like dokumenter
PG4200 Algoritmer og datastrukturer Forelesning 2

PG4200 Algoritmer og datastrukturer forelesning 3. Lars Sydnes 29. oktober 2014

Rekursiv programmering

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Rekursiv programmering

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

PG 4200 Algoritmer og datastrukturer Innlevering 1. Frist: 2.februar kl 21.00

Divide-and-Conquer. Lars Vidar Magnusson

Algoritmer og Datastrukturer IAI 21899

LO118D Forelesning 2 (DM)

Rekursjon som programmeringsteknikk

TDT4105 Informasjonsteknologi, grunnkurs

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Algoritmeanalyse. (og litt om datastrukturer)

Algoritmer - definisjon

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

Spenntrær, oppsummert: Kruskal: Traverserer ikke. Plukker kanter i hytt og vær Prim: Legger alltid til den noden som er nærmest treet

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

Turingmaskiner.

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Ukeoppgaver INF1000: 12. feb 16. feb

MAT1030 Diskret matematikk

Oppgaver fra forelesningene. MAT1030 Diskret matematikk. Oppgave (fra forelesningen 10/3) Definisjon. Plenumsregning 9: Diverse ukeoppgaver

Algoritmer - definisjon

Rekursjon. Binærsøk. Hanois tårn.

Rekursjon. Hanois tårn. Milepeler for å løse problemet

Introduksjon til Algoritmeanalyse

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Ninety-nine bottles. Femte forelesning. I dagens forelesning: Mest matematiske verktøy. Først: Asymptotisk notasjon. Så: Rekurrensligninger.

PG4200 Algoritmer og datastrukturer forelesning 10. Lars Sydnes 21. november 2014

Et detaljert induksjonsbevis

Mengder, relasjoner og funksjoner

EKSAMEN med løsningsforslag

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

MAT1030 Diskret Matematikk

MED TIDESTIMATER Løsningsforslag

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

PG4200 Algoritmer og datastrukturer Forelesning 12

PG4200 Algoritmer og datastrukturer Forelesning 7

Algoritmer og datastrukturer Løsningsforslag

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Generelle trær BINÆRTRÆR. Binærtrær

PG4200 Algoritmer og datastrukturer Forelesning 10

Repetisjon. MAT1030 Diskret Matematikk. Oppsummering. Oppsummering. Forelesning 15: Rekursjon og induksjon. Roger Antonsen

Forelesning 14. Rekursjon og induksjon. Dag Normann februar Oppsummering. Oppsummering. Beregnbare funksjoner

MAT1030 Diskret matematikk

Norges Informasjonsteknologiske Høgskole

Det matematisk-naturvitenskapelige fakultet

Oppgave 1. Sekvenser (20%)

Plenumsregning 9. Diverse ukeoppgaver. Roger Antonsen april Oppgaver fra forelesningene. Oppgave (fra forelesningen 10/3).

UNIVERSITETET I OSLO

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Binære trær: Noen algoritmer og anvendelser

INF1010. Rekursjon En rekursiv definisjon av rekursjon, slik det kunne stå i en ordbok: Introduksjon til Rekursiv programmering

Løsnings forslag i java In115, Våren 1998

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

Norges Informasjonsteknologiske Høgskole

INF 4130 Oppgavesett 3, 20/ m/løsningsforslag

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Løsningsforslag

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Stack. En enkel, lineær datastruktur

MAT1030 Forelesning 2

Kapittel 12: Rekursjon

Kjøretidsanalyse. Hogne Jørgensen

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Divide-and-Conquer II

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

UNIVERSITETET I OSLO

INF1010 Binære søketrær ++

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF1010 Sortering. Marit Nybakken 1. mars 2004

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Rekker (eng: series, summations)

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Innføring i matematisk analyse av algoritmer

MAT1030 Diskret Matematikk

Om Kurset og Analyse av Algoritmer

En algoritme for permutasjonsgenerering

Argumenter fra kommandolinjen

Norges Informasjonsteknologiske Høgskole

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Transkript:

PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering Lars Sydnes, NITH 22.januar 2014

I. Rekursjon

commons.wikimedia.org

Rekursjon i naturen En gren er et tre som sitter fast på et tre. Følgelig er et tre sammensatt av trær. Hva består blomkål av? Små blomkål som sitter fast på en sentral stamme. Vi kan lese selvrefererende struktur inn i disse fenomenene. REKURSJON

Rekursjon i matematikken Potenser: 2 n = 2 2 n 1 i.e. pow(2, n) = 2 pow(2, n 1) Summer: i.e. n i = n + i=1 n 1 i=1 sumints(n) = n + sumints(n 1) i

Algoritmisk rekursjon: Hvordan lage blomkål? public Blomk(double size) { Stamme stamme = new Stamme(); while ( stamme.hasnextfeste()) { stamme.nextfeste().add(new Blomk(size/3)); OBS: Hva er galt her?!

Rekursiv Noe som refererer til seg selv Rekursiv funksjon = Funksjon som kaller på seg selv. funksjon() { if stoppbetingelse { /*direkte strategi*/ else { /*rekursiv strategi*/ funksjon() Mønster: (i) Stoppbetingelse basis-tilfellet (base-case) (ii) Ellers rekursiv løsning.

Indirekte rekursjon public... funksjon1() { if (stoppbetingelse()) { return enkeltsvar(); else { return funksjon2(); private... funksjon2() { return bearbeid(funksjon1()); Dette kalles indirekte rekursjon. Det er ingen ting som forhindrer oss fra å ha mange lag av indirekte rekursjon.

Eksempel Backtracking SubsetSum.java Problem: Se på en gitt liste med tall, la oss si n 0, n 1,..., n k = 1, 43, 2, 5, 2, 3, 67, 5, 3, 6, 8 Velge en delmengde med gitt sum S, la oss si S = 13. Her har vi løsningen n 0 + n 2 + n 3 + n 7 = 1 + 2 + 5 + 5 = 13 = S

Rekursiv løsning: (i) Prøv først å bygge en løsning med det første elementet n 0 (ii) Prøv å finne en delmengde av n 1,..., n k med sum S n 0 Det lykkes: Vi har en løsning! Det mislykkes: Prøv å finne en delmengde av n 1,..., n k med sum S. Dette kalles Backtracking TEGNE FIGUR PÅ TAVLEN: VALGTRE. GJØRE OVERSLAG OVER KJØRETID.

II. Rekursjon, stakker, iterasjon

Eksempel int fak(int n) { // rekursiv variant if (n == 0) {//stoppbetingelse return 1; else { // Rekursiv strategi return n*fak(n-1); fak(n) = 1 2 3 (n 1) n = fak(n 1) n

Organisering av rekursive kall public static void main(string[] args){ int k = fak(4); return 24 return 6 return 2 return 1 main fak fak fak fak fak(4) fak(3) fak(2) fak(1) Argumenter og lokale variabler lagres i programmets funksjonskallstakk. (Call stack) Rekursive funksjonskall fører med seg implisitt strukturering og ressursbruk.

Hva er en stakk En stakk er en sist inn, først ut -kø. Papirer i en bunke. Funksjonskallstakken. De første skal bli de siste

Iterasjon rekursjon public static int fak(int n){ if (n <= 1){ return 1; else { return n*fak(n-1); public static int fak(n){ int output = 1; while (n > 1){ output *= n; n--; return output;

Oversikt Rekursivt kall Stoppbetingelse Rekursjon vs iterasjon Rekursjon kan iblant gi nærmest magiske løsninger. Det kan være krevende å estimere ressursbruken. Problemer som er av rekursiv natur: Web-crawling. Løsningsstrategier som kaller på rekursjon: Backtracking.

III. Mer om kjøretidsberegninger

Eksempel: Fakultet int fak(int n) { if (n <=1) { return 1; else { return n*fak(n-1); Hvordan estimere ressursbruken? Hva er det lurt å telle? Antall funksjonskall? Antall multiplikasjoner?

Eksempel: Fakultet Antall funksjonskall i beregning av fak(n): F n (Name and conquer) int fak(int n) { // F_n kall if (n <=1) { return 1; // ingen kall else { return n*fak(n-1); // F_(n-1) kall (i) F 1 = 1. Vi teller her kun det opprinnelige kallet fak(1). (ii) F n+1 = F n + 1. Følgelig er F n = n Konklusjon: Kall av fak(n) medfører n funksjonskall.

Eksempel: TowersOfHanoi.java Problem: Flytt tårnet fra venstre til høyre pinne. Se Applet Regeler: Én brikke om gangen. Store brikker får ikke ligge oppå små. Løsning for to brikker: 0 top bottom 1 bottom top 2 top bottom 3 top bottom

Eksempel: TowersOfHanoi.java 0 1 top bottom bottom top 2 top bottom 3 top bottom Rekursiv tankegang: (i) Flytt de n 1 øverste brikkene til midten. (ii) Flytt den nederste brikken. (iii) Flytt de n 1 øverste brikkene til høyre.

Eksempel: TowersOfHanoi.java M n = Antall trekk i tilfellet med n brikker. (Name and conquer) Rekursivt steg:... movetower(n-1,...); // M_(n-1) trekk moveonedisk(...); // 1 trekk movetower(n-1...); // M_(n-1) trekk... M n = 2M n 1 + 1 Basis-steg: if (n<1) { /* do nothing*/ M 0 = 0

Regning: Induksjonsbevis Innledende undersøkelse: M n = 2M n 1 + 1, M 0 = 0; M 1 = 2 M 0 +1 = 2 0+1 = 1 M 2 = 2 1+1 = 3, M 3 = 2 3+1 = 7 M 4 = 2 7 + 1 = 15, M 5 = 2 15 + 1 = 31 Hypotese: H n : M n = 2 n 1. (H n er sann for n = 1, 2, 3, 4, 5.) Kan H n være sann for alle n? Anta at H n er sann for alle n < k. Da er M k = 2M k 1 + 1 = 2 (2 k 1 1) + 1 = 2 2 k 1 2 + 1 = 2 k 1. Dette medfører at H n stemmer for n = k! Hurra! Vi vet fra før at hypotesen stemmer for n = 1, 2, 3, 4, 5. Men dette må bety at den stemmer også for n = 6. På tilsvarende måte ser vi at H n er sann for alle n.

Regning: Et lurt knep M n = 2M n 1 + 1, M 0 = 0; La U n = M n + 1. Da er U n = M n +1 = 2M n 1 +1+1 = 2(M n 1 +1) = 2U n 1, U 0 = 1 Dette medfører at U 0 = 1, U 1 = 2, U 2 = 2 2,..., U k = 2 k,..., Altså: M n = U n 1 = 2 n 1.

Eksempel: TowersOfHanoi.java Lukket formel: M n = 2 n 1 Data fra kjøring: Antall brikker: 0 1 2 3 4 5 6 7 Antall trekk: 0 1 3 7 15 31 63 127

Aritmetiske rekker S n = A + (A + B) + (A + 2B) + + (A + nb) Knep: Paring av ledd med totalsum (2A + nb) 2S n =S n + S n =(A + (A + B) + (A + 2B) + + (A + nb)) Dette betyr: + (A + (A + B) + + (A + (n 1)B) + (A + nb)) =(A + (A + nb) + (A + B) + (A + (n 1)B) + + (A + nb) + A) =((2A + nb) + (2A + nb) + + (2A + nb)) =(n + 1)(2A + nb) S n = 1 (n + 1)(2A + nb) 2

Aritmetiske rekker Se på summen Her er A = 0 og B = 1. Vi får S n = 1 + 2 + + n S n = 1 n(n + 1) 2 for(int i = 0 ; i < n; i ++){ function(i); // O(i) Dette betyr at det finnes en konstant K slik at kjøretiden til funksjon(i) er mindre enn K i. Total kjøretid blir da: T n = K 0 + K 1 + K 2 + + K n = 1 Kn(n + 1). 2

Geometriske rekker Knep: Det vil si: altså: S n = A + AB + AB 2 + AB n På de ene side: S n+1 = S n + AB n+1 På den annen side: S n+1 = A + BS n S n + AB n+1 = A + BS n, S n = A(1 Bn+1 ) 1 B Spesialtilfelle: A = 1: 1 + B + B 2 + B n = 1 Bn+1 1 B

Utnyttelse: Skarpere estimater for(int i = 1; i < n; i*=3){ function(i); // O(i) Her går i gjenom verdiene 1, 3,..., 3 k, der n 3 k < 3n. Anta at kjøretiden for funksjon(i) er mindre enn K i. Da er total kjøretid lik t(n) = K + 3 K + + 3 k K = K(1 3k+1 ) 1 3 = 3K 2 3k K 2. Siden 3 k < 3n, medfører dette at t(n) < 9K 2 n K 2, altså at t(n) er av orden O(n).

Utnyttelse: Skarpere estimater Dette gir estimatet for(int i = 1; i < n; i*=3){ // O(log(n)) function(i); // O(i) // O(n) Tommelfingerregelestimatet: for(int i = 1; i < n; i*=3){ // O(log(n)) function(i); // O(n) // O(n*log(n)) Dette estimatet gir en gyldig øvre grense for worst case-kjøretid: Kjøretiden er ikke værre enn O(n log n). MEN, det finnes et skarpere estimat: O(n).

Utnyttelse: Skarpere estimater? for(int i = 1; i < n; i*=3){ function(i); // O(log(i)) Her går i gjenom verdiene 1, 3,..., 3 k, der n 3 k < 3n. Anta at kjøretiden for funksjon(i) er mindre enn M log i. Da er total kjøretid lik t(n) = M + M log(3) + M log(3 2 ) + + M log(3 k ) = M + M log 3 + 2M log 3 + + km log(3) = M + M log 3(1 + 2 + + k) = M + M log 3 1 k(k + 1) 2 3 k < 3n medfører at k < log n log 3 + 1 < M log n for en eller annen M. t(n) < M log 3 1 2 M log n(m log n + 1) < M log(n) 2

Utnyttelse: Skarpere estimater? Dette gir: for(int i = 1; i < n; i*=3){ // O(log(n)) function(i); // O(log(i)) // O(log(n)^2) Tommelfingerregelestimatet er : for(int i = 1; i < n; i*=3){ // O(log(n)) function(i); // O(log(n)) // O(log(n)^2)

Skarpere estimater II for(int i = 1; i < n; i*=a){ // a > 1 function(i); // O(i^m) Anta kjøretiden for function(i), t(i) < Mi m. i gjennomløper verdiene 1, a, a 2,..., a k, der a k < an. Total kjøretid T(n) = t(1) + t(a) + + t(a k ) = M1 m + Ma m + M(a 2 ) m + + M(a k ) m = M + Ma m + M(a m ) 2 + + M(a m ) k = M(1 (am ) k+1 ) 1 a m < K(a m ) k = K(a k ) m < Ka m n m Dette betyr at T(n) vokser med orden O(n m ).

Skarpere estimater II for(int i = 1; i < n; i*=a){ function(i); // O(i^m) // O(n^m) Tommelfingerregelestimat: for(int i = 1; i < n; i*=a){ // O(log(n)) function(i); // O(n^m) // O(n^m*log(n))

Se it s learning. Oppgaver