6.001 SICP – September 22
description
Transcript of 6.001 SICP – September 22
6.001 SICP 1
6.001 SICP – September 226001-Introduction
Trevor Darrell [email protected]
6.001 web page: http://sicp.csail.mit.edu/section web page: http://www.csail.mit.edu/trevor/6001/
Office Hours W11, 32-D512
• Orders of Growth– Linear– Exponential– Logarithmic
• Let
6.001 SICP 2
6.001 SICP
• Orders of Growth• Linear• Exponential• Logarithmic
• let
6.001 SICP 3
Orders of growth of processes• Suppose n is a parameter that measures the size of a
problem• Let R(n) be the amount of resources needed to compute
a procedure of size n.• We say R(n) has order of growth f(n)if there are
constants k1 and k2 such that k1f(n)<= R(n)<= k2f(n)
for large n • Two common resources are space, measured by the
number of deferred operations, and time, measured by the number of primitive steps.
6.001 SICP 4
Orders of Growth
N=2 N=10 N=100• Constant (1) 1 1 1• Logarithmic (log N) 1 3.33 6.66• Linear (n) 2 10 100• Quadratic (n2) 4 100 10000• Exponential (2n) 4 1024 1.26x1030
• At 1 billion operations per second (current state of the art), if you were to run an exponential time algorithm in the lab on a data set of size n=100, you would be waiting for approximately 4x1011 centuries for the code to finish running!
6.001 SICP 5
Order of growth examples
For each, find simplest and slowest growing f for which R(n)=(f(n))
• R(n)=6
• R(n)=n2 + 3
• R(n)=6*n3 + 3*n2 + 7n + 100
• R(n)=23n+7
6.001 SICP 6
Order of growth examples
For each, find simplest and slowest growing f for which R(n)=(f(n))
• R(n)=6(1) 1 * 1 <= 6 <= 6 * 1 for all n• R(n)=n2 + 3(n2) 1*n2 <= n2 + 3 <= 2*n2 for all n > 2• R(n)=6*n3 + 3*n2 + 7n + 100(n3) 1*n3 <= 6*n3 + 3*n2 + 7n + 100 <= 7*n3 for all n>100• R(n)=23n+7
(8n) 1*8n <= 23n+7 <= 28*8n for all n>0
6.001 SICP 7
Examples(define (factorial n)
(if (= n 1)1(* n (factorial (- n 1)))))
(factorial 5)(* 5 (factorial 4))(* 5 (* 4 (factorial 3)))(* 5 (* 4 (* 3 (factorial 2))))(* 5 (* 4 (* 3 (* 2 (factorial 1)))))(* 5 (* 4 (* 3 (* 2 1))))(* 5 (* 4 (* 3 2)))(* 5 (* 4 6))120
Time =(n) Space = (n)
6.001 SICP 8
Examples(define (fact2 n)
(define (helper cur k)(if (= k 1)cur(helper (* cur k) (- k 1))))
(helper 1 n))
(fact2 5)(helper 1 5)(helper 5 4)(helper 20 3)(helper 60 2)(helper 120 1)
Time =(n) Space =(1)
6.001 SICP 9
Towers of Hanoi• Three posts, and a set of different size disks• any stack must be sorted in decreasing order from bottom
to top• the goal is to move the disks one at a time, while
preserving these conditions, until the entire stack has moved from one post to another
6.001 SICP 10
Towers of Hanoi(define move-tower (lambda (size from to extra) (cond ((= size 0) true) (else (move-tower (- size 1) from extra to) (print-move from to) (move-tower (- size 1) extra to from)))))
(define print-move (lambda (from to) (write-line ``Move top disk from ``) (write-line from) (write-line `` to ``) (write-line to)))
6.001 SICP 11
A tree recursion
Move 4
Move 3 Move 3
Move 2Move 2Move 2Move 2
Move 1Move 1
Move 1Move 1
Move 1Move 1
Move 1Move 1
6.001 SICP 12
Orders of growth for towers of Hanoi
• Let tn be the number of steps that we need to take to solve the case for n disks. Then
• tn = 2tn-1 + 1 = 2(2tn-2 +1) + 1 ….= 2n -1• So in time we have (2n) -- exponential• In space, we have one deferred operation for each
increment of the stack of disks -- (n) -- linear
6.001 SICP 13
QuizWhat is simplest expression for the order of growth of running time of
procedure mul1 & mul2?
(define (mul1 n m) (if (= n 0) 0 (+ m (mul1 (- n 1) m))))
(define (mul2 n m) (define (help count ans) (if (= count 0) ans (help (- count 1) (+ m ans)))) (help n 0))
1. Theta(1) 2. Theta(2n) 3. Theta(n) 4. Theta(n/2)
6.001 SICP 14
Mul
Now write a procedure mul4 that computes m*n in (log n) time
Hint: Compare with a^b = (a^2)^(b/2) if b is even, and a^b = a*a^(b-1) if b is odd,
n*m = 2 * ( (n / 2) * m) if n even, n*m = m + ((n-1) * m) if n odd.
6.001 SICP 15
Local Variables• Suppose we want to compute
F(x,y)=x(1+xy)2 + y(1-y) + (1+xy)(1-y)• Useful to name intermediate quantities:
A = 1 + xyB = 1 - yF(x,y) = xA2 + yB + AB
• How can we do this?Using a “helper function?”Using a nested lambda?Using Let…
6.001 SICP 16
Local variables with helper fcn. / lambda
A = 1 + xy; B = 1 - y; F(x,y) = xA2 + yB + AB• Can use an auxiliary procedure to bind the intermediate
variables:
(define (f x y)
(define (f-helper a b) (+ (* x (square a)) (* y b) (* a b)))
(f-helper (+ 1 (* x y)) (- 1 y)))
6.001 SICP 17
Local variables with helper fcn. / lambda
A = 1 + xy; B = 1 - y; F(x,y) = xA2 + yB + AB
Or use lambda directly….
(define (f x y) ((lambda (a b) (+ (* x (square a)) (* y b) (* a b))) (+ 1 (* x y)) (- 1 y)))
(define (f x y) (define (f-helper a b) (+ (* x (square a)) (* y b) (* a b))) (f-helper (+ 1 (* x y) ) (- 1 y)) )
6.001 SICP 18
Local variables with let• Let is a special form which is syntactic sugar for this use of
lambda to create local variables(let (( <var1> <exp1> ) ( <var2> <exp2> ) … ( <varn> <expn> )) <body> )
Which means: let <var1> be <exp1>, <var2> be <exp2>, <var3> be <exp3> in <body> , and return the value of the last expression in <body>
6.001 SICP 19
Local variables with let
A = 1 + xy; B = 1 - y; F(x,y) = xA2 + yB + AB
(define (f x y) ((lambda (a b) (+ (* x (square a)) (* y b) (* a b))) (+ 1 (* x y)) (- 1 y)))
(define (f x y) (let ((a (+ 1 (* x y)) (b (- 1 y)) ) (+ (* x (square a)) (* y b) (* a b))))
6.001 SICP 20
Let vs. nested defineUse of nested defines for local variable definition is
considered bad form, but is technically legal:(define (f x) (define k 2) (+ x k))
Let can be used inside another expression:(define x 5)(+ (let ((x 3)) (+ x (* x 10))) 5)
(define (f x) (let ((k 2)) (+ x k)))
6.001 SICP 21
Let*•Let first evaluates all of the values, then binds each to the
variable names. (define x 0)
(define y 0)(let ((x 1) (y 2) (z (+ x y))) z) === 0!
•Let* evaluates and binds each name/value pair in sequence, so that each definition is available to the next(let* ((x 1) (y 2) (z (+ x y))) z) === 3!
6.001 SICP 22
Let/Let*
Write a single function using let or let* to solve (x- 5)^3 + 2(x-5)^2 where x = y – 1 and y = K*z and K = 39.2, where z is given.
(let* ((k 39.2) (y (* k z)) (x (- y 1)) (a (- x 5))) (+ (* a a a) (* 2 a a)))
6.001 SICP 23
Remember…• calendar…