Föreläsning 9 Intervallhalveringsmetoden Intervallhalveringsmetoden Newton-Raphsons metod Mer om rekursion Tidskomplexitet Procedurabstraktion Representation Bra om ni läst följande avsnitt i AS: Procedures as General Methods Procedures as Returned Values Tree Recursion Orders of Growth Exponentiation Example: Representing Sets Finn ett nollställe till funktionen f (x). y x 0 m x 1 Välj x 0 och x 1 så att f (x 0 ) f (x1) < 0 och x 0 < x 1 f(x) x DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 1 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 2 / 24 Intervallhalveringsmetoden... Intervallhalveringsmetoden... m = (x 0 + x 1 )/2 om f (x 0 ) f (m) < 0 så x 1 = m annars x 0 = m om x 0 x 1 > ɛ annars är m en rot (define intervallhalvering (lambda (f x0 x1 eps) (define close-enough? (lambda (a b) (< (abs (- a b)) eps))) (let ((m (/ (+ x0 x1) 2))) (if (close-enough? x1 x0) m (if (negative? (* (f x0) (f m))) (intervallhalvering f x0 m eps) (intervallhalvering f m x1 eps)))))) > (intervallhalvering (lambda (x) (- (* x x) 2)) -5 5 0.000000000000001) -1.4142135623730954 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 3 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 4 / 24
Newton-Raphsons metod Newton-Raphsons metod... Ett tal x kallas fixpunkt för en funktion f om f (x), f (f (x)), f (f (f (x))),... konvergerar mot x Ex.: F(x n ) = x n+1 = x n f (x n) f (x n ) (define newton-raphson (lambda (f guess) (if (good-enough? f guess) guess (newton-raphson f (improve guess f))))) (define good-enough? (lambda (func guess) (< (abs (func guess)) 0.000001))) (define improve (lambda (guess f) (- guess (/ (f guess) ((derivata f 0.001) guess))))) (define derivata (lambda (f dx) (lambda (x) (/ (- (f (+ x dx)) (f (- x dx))) (* dx 2))))) DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 5 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 6 / 24 Mer om rekursion Mer om rekursion... Definition av fibonaccitalen: 0 om n = 0 fib n = 1 om n = 1 fib n 1 + fib n 2 annars f(3) f(4) f(2) (define fib (lambda (n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))) f(1) f(2) f(0) f(1) f(1) f(0) Varje anrop ger upphov till högst två nya anrop. Antal anrop blir då c:a 2 n. Antalet anrop växer exponentiellt med argumentet n. Antag att ett anrop tar 1 ms. Då tar (fib 4) 9 ms, (fib 10) 177 ms, (fib 20) 20 s, (fib 40) 3.8 dagar, (fib 80) 2436282 år! DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 7 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 8 / 24
Mer om rekursion... Mer om rekursion... fib-2 Kan det göras bättre? Här är en svansrekursiv lösning: (define fib-2 (lambda (n) (define fib-2-iter (lambda (fibm fibm-1 m) (if (<= n m) fibm (fib-2-iter (+ fibm fibm-1) fibm (+ m 1))))) (fib-2-iter 1 0 1))) Antalet anrop av fib-2-iter växer linjärt med argumentet n. Mycket kan vinnas genom att tänka igenom programmet ordentligt. OBS! att fib-2 är svansrekursiv! Om vi gör trace på fib-2-iter får vi för anropet (fib-2 7): (fib-2-iter 1 0 1) (fib-2-iter 1 1 2) (fib-2-iter 2 1 3) (fib-2-iter 3 2 4) (fib-2-iter 5 3 5) (fib-2-iter 8 5 6) (fib-2-iter 13 8 7) 13 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 9 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 10 / 24 Tidskomplexitet Tidskomplexitet Låt T (n) vara den tid det tar att utföra en uppgift enligt den algoritm vi använder. Vi är då endast intresserade av beroendet av n (problemets storlek) Om T (n) är proportionell mot 2 n så säger vi att T (n) O (2 n ) dvs: eller mer generellt: ( n 0, c)( n > n 0 )[T (n) c 2 n ] T (n) O (2 n ) ( n 0, c)( n > n 0 )[T (n) c f (n)] T (n) O (f (n)) Beräkning av b n Linjär rekursion med n steg (T (n) O (n)): { 1 om n = 0 b n = b b n 1 annars (define expt-1 (lambda (b n) (if (= n 0) 1 (* b (expt-1 b (- n 1)))))) DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 11 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 12 / 24
Tidskomplexitet... Tidskomplexitet... Annan idé (T (n) O (log n)): 1 om n = 0 b n = b (b (n 1)/2 ) 2 om n = är udda (b n/2 ) 2 annars (define expt-2 (lambda (b n) (cond (( = n 0) 1) ((odd? n) (* b (sqr (expt-2 b (/ (- n 1) 2))))) (else (sqr (expt-2 b (/ n 2))))))) Bra att veta att man kan räkna på algoritmer. Vi kommer inte att göra det. Jag vill bara påpeka att det intuitiva sättet att skriva ett program kan vara förödande. Då och då kan jag komma att påpeka något om en algoritms effektivitet, men bara för att jämföra med någon annan algoritm. Mer om detta kommer i komplexitetskursen. DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 13 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 14 / 24 Procedurabstraktioner Representation Vi har (hittills) byggt abstraktioner med hjälp av procedurer procedurer som använder procedurer... procedurer som parametrar procedurer med inre procedurer procedurer som bygger procedurer Vi har också byggt abstraktioner med hjälp av data. I många fall kan vi representera samma (abstrakta) begrepp på flera olika sätt. Varje representation har sina fördelar och nackdelar. Det gäller att kunna resonera kring dessa för- och nackdelar för att välja det som är bäst (??). Man måste väga enkelhet, effektivitet, begriplighet m m mot varandra. Låt oss titta på representation av mängder. Lite enklare begreppsmässigt än de som ska hanteras i labben. De kan representeras bl a som oordnade listor, ordnade listor eller trädstrukturer. Vi ska titta lite på de två liststrukturerna. DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 15 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 16 / 24
Mängdoperationer Representation, oordnade listor... Operation symboliskt exempel Union A B {1, 2, 3} {3, 4, 5} = {1, 2, 3, 4, 5} Snitt A B {1, 2, 3} {3, 4, 5} = {3} Differens A \ B {1, 2, 3}\{3, 4, 5} = {1, 2} Kartesisk prod A B {1, 2} {3, 4} = {(1. 3), (1. 4), (2. 3), (2. 4)} Member e A 3 {1, 2, 3} = true Insert A + e {1, 2, 3} + 4 = {1, 2, 3, 4} Delete A e {1, 2, 3} 2 = {1, 3} Mängdtillhörighet ( ): (define element-of-set? (cond ((null? set) #f) ((= element (car set)) #t) (else (element-of-set? element (cdr set)))))) Linjär oordnad lista ger O (n) (n är antalet element) För enkelhets skull begränsar vi diskussionen till mängder av heltal och operationerna, och +. DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 17 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 18 / 24 Representation, oordnade listor... Representation, oordnade listor... Lägga till ett element (+): (define adjoin-set (if (element-of-set? element set) set (cons element set)))) Också O (n), vi letar igenom mängden och sätter in i första position. Snittet mellan två mängder ( ): (define intersect (lambda (set-1 set-2) (cond ((or (null? set-1) (null? set-2)) ()) ((element-of-set? (car set-1) set-2) (cons (car set-1) (intersect (cdr set-1) set-2))) (else (intersect (cdr set-1) set-2))))) För varje element i den ena mängden gås den andra mängden igenom. Om båda har n element får vi O ( n 2). Enkla algoritmer till priset av fart. DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 19 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 20 / 24
Representation, ordnade listor... Representation, ordnade listor... Vi byter representation till ordnade listor. Mängdtillhörighet ( ): (define element-of-set? (cond ((null? set) #f) ((< element (car set)) #f) ((= element (car set)) #t) (else (element-of-set? element (cdr set)))))) Fortfarande O (n). Lägga till ett element (+): (define adjoin-set (cond ((null? set) (list element)) ((= element (car set)) set) ((< element (car set)) (cons element set)) (else (cons (car set) (adjoin-set element (cdr set))))))) Fortfarande O (n). DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 21 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 22 / 24 Representation, ordnade listor... Slut på, vi börjar med Pascal Snittet mellan två mängder ( ): (define intersect (lambda (set-1 set-2) (if (or (null? set-1) (null? set-2)) () (let ((x1 (car set-1)) (x2 (car set-2))) (cond ((= x1 x2) (cons x1 (intersect (cdr set-1) (cdr set-2)))) ((< x1 x2) (intersect (cdr set-1) set-2)) (else (intersect set-1 (cdr set-2)))))))) Ni har redan kommit långt i programmeringsteknik Med lite eftertanke kan ni redan lösa ganska komplicerade uppgifter Men kursen handlar egentligen om verktyg för att hantera datorer Vi måste bort från det abstrakta och se på detaljer Pascal passar perfekt men övergången kan bli tuff Vi pratar Pascal men övar och labbar fortfarande i Högst m + n om set-1 har m element och set-2 har n. O (n) alltså! En väsentlig förbättring! DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 23 / 24 DA2001 (Föreläsning 9) Datalogi 1 Hösten 2010 24 / 24