320 likes | 546 Views
מבוא מורחב למדעי המחשב בשפת Scheme. תרגול 4. Outline. Let* List and pairs manipulations Insertion Sort Abstraction Barriers Fractals Mobile. let*. (let* ((<var1> <exp1>)… (<varn> <expn>)) <body>) is equivalent to (let ((<var1> <exp1>)) (let* ((<var2> <exp2>)…
E N D
Outline • Let* • List and pairs manipulations • Insertion Sort • Abstraction Barriers • Fractals • Mobile
let* (let* ((<var1> <exp1>)… (<varn> <expn>)) <body>) is equivalent to (let ((<var1> <exp1>)) (let* ((<var2> <exp2>)… (<varn> <expn>)) <body>)) 3
cons, car, cdr, list (cons 1 2) is a pair => (1 . 2) box and pointer diagram: nil = () the empty list (null in Dr. Scheme) (list 1) = (cons 1 nil) => (1) 2 1 1
(car (list 1 2)) => 1 (cdr (list 1 2)) => (2) (cadr (list 1 2)) => 2 (cddr (list 1 2)) => () 2 1
(list 1 (list (list 2 3) 4) (cons 5 (list 6 7)) 8) 8 1 7 5 6 4 2 3
(5 4 (3 2) 1) (list 5 4 (list 3 2) 1) (cons 5 (cons 4 (cons (cons 3 (cons 2 nil)) (cons 1 null)))) 4 1 5 3 2 How to reach the 3 with cars and cdrs? (car (car (cdr (cdr x))))
cdr-ing down cons-ing up cdr-ing down a listcons-ing up a list (add-sort 4 (list 1 3 5 7 9)) (1 3 4 5 7 9) (add-sort 5 ‘()) (5) (add-sort 6 (list 1 2 3)) (1 2 3 6) (define (add-sort n s) (cond ((null? s) ) ((< n (car s)) ) (else ))) (list n) (cons n s) (cons (car s) (add-sort n (cdr s)))
Insertion sort • An empty list is already sorted • To sort a list with n elements: • Drop the first element • Sort remaining n-1 elements (recursively) • Insert the first element to correct place • (7 3 5 9 1) • (3 5 9 1) • (5 9 1) • (9 1) • (1) • () (1 3 5 7 9) (1 3 5 9) (1 5 9) (1 9) (1) () Time Complexity?
Implementation (define (insertion-sort s) (if (null? s) null (add-sort (car s) (insertion-sort (cdr s)))))
Fractals • Definitions: • A mathematically generated pattern that is reproducible at any magnification or reduction. • A self-similar structure whose geometrical and topographical features are recapitulated in miniature on finer and finer scales. • An algorithm, or shape, characterized by self-similarity and produced by recursive sub-division.
Sierpinski triangle • Given the three endpoints of a triangle, draw the triangle • Compute the midpoint of each side • Connect these midpoints to each other, dividing the given triangle into four triangles • Repeat the process for the three outer triangles
Sierpinski triangle – Scheme version (define (sierpinski triangle) (cond ((too-small? triangle) #t) (else (draw-triangle triangle) (sierpinski [outer triangle 1] ) (sierpinski [outer triangle 2] ) (sierpinski [outer triangle 3] ))))
Scheme triangle Constructor: (define (make-triangle a b c) (list a b c)) (define (a-point triangle) (car triangle)) (define (b-point triangle) (cadr triangle)) (define (c-point triangle) (caddr triangle)) (define (too-small? triangle) (let ((a (a-point triangle)) (b (b-point triangle)) (c (c-point triangle))) (or (< (distance a b) 2) (< (distance b c) 2) (< (distance c a) 2)))) (define (draw-triangle triangle) (let ((a (a-point triangle)) (b (b-point triangle)) (c (c-point triangle))) (and ((draw-line view) a b my-color) ((draw-line view) b c my-color) ((draw-line view) c a my-color)))) Selectors: Predicate: Draw:
Points Constructor: (define (make-posn x y) (list x y)) (define (posn-x posn) (car posn)) (define (posn-y posn) (cadr posn)) (define (mid-point a b) (make-posn (mid (posn-x a) (posn-x b)) (mid (posn-y a) (posn-y b)))) (define (mid x y) (/ (+ x y) 2)) (define (distance a b) (sqrt (+ (square (- (posn-x a) (posn-x b))) (square (- (posn-y a) (posn-y b)))))) Selectors:
Sierpinski triangle – Scheme final version (define (sierpinski triangle) (cond ((too-small? triangle) #t) (else (let ((a (a-point triangle)) (b (b-point triangle)) (c (c-point triangle))) (let ((a-b (mid-point a b)) (b-c (mid-point b c)) (c-a (mid-point c a))) (and (draw-triangle triangle) (sierpinski ) (sierpinski ) (sierpinski ))))))) (make-triangle a a-b c-a)) (make-triangle b a-b b-c)) (make-triangle c c-a b-c))
Programs that use Triangles too-small? draw-triangle make-posn posn-x posn-y make-triangle a-point b-point c-point cons list car cdr Abstraction barriers Triangles in problem domain Triangles as lists of three points Points as lists of two coordinates (x,y) Points as lists
Mobile • Left and Rightbranches • Constructor • (make-mobile left right) • Selectors • (left-branch mobile) • (right-branch mobile)
Branch • Length and Structure • Length is a number • Structure is… • Another mobile • A leaf (degenerate mobile) • Weight is a number • Constructor • (make-branch length structure) • Selectors • (branch-length branch) • (branch-structure branch)
4 8 4 2 6 1 2 Building mobiles (define m (make-mobile (make-branch 4 6) (make-branch 8 (make-mobile (make-branch 4 1) (make-branch 2 2)))))
6 1 2 Mobile weight • A leaf’s weight is its value • A mobile’s weight is: • Sum of all leaves = • Sum of weights on both sides • (total-weight m) • 9 (6+1+2)
Mobile weight (define (total-weight mobile) (if (atom? mobile) mobile (+ (total-weight ) (total-weight ) ))) (define (atom? x) (and (not (pair? x)) (not (null? x)))) (branch-structure (left-branch mobile)) (branch-structure (right-branch mobile))
Complexity Analysis • What does “n” represent? • Number of weights? • Number of weights, sub-mobiles and branches? • Number of pairs? • All of the above? • Analysis • (n) • Depends on mobile’s size, not structure
Balanced mobiles • Leaf • Always Balanced • Rod • Equal moments • F = length x weight • Mobile • All rods are balanced = • Main rod is balanced, and both sub-mobiles • (balanced? m) 4 8 1 5 6 2 1
balanced? (define (balanced? mobile) (or (atom? mobile) (let ((l (left-branch mobile)) (r (right-branch mobile))) (and (= ) (balanced? ) (balanced? ))))) (* (branch-length l) (total-weight (branch-structure l))) (* (branch-length r) (total-weight (branch-structure r))) (branch-structure l) (branch-structure r)
Complexity • Worst case scenario for size n • Need to test all rods • May depend on mobile structure • Upper bound • Apply total-weight on each sub-mobile • O(n2) • Lower bound
Mobile structures n n-1 n-2 n-3 . . . T(n) = T(n-1) + (n) (for this family of mobiles) T(n) = (n2)
Mobile structures n/2 n/2 n/4 n/4 n/4 n/4 n/8 n/8 n/8 n/8 n/8 n/8 n/8 n/8 T(n) = 2T(n/2) + (n) (for this family of mobiles) T(n) = (nlogn)
Implementation Constructors (define (make-mobile left right) (list left right)) (define (make-branch length structure) (list length structure)) Selectors (define (left-branch mobile) (car mobile)) (define (right-branch mobile) (cadr mobile)) (define (branch-length branch) (car branch)) (define (branch-structure branch) (cadr branch))
Preprocessing the data • Calculate weight on creation: • (define (make-mobile left right) (list left right (+ (total-weight (branch-structure left)) (total-weight (branch-structure right))))) • New Selector: • (define (mobile-weight mobile) (caddr mobile)) • Simpler total-weight: • (define (total-weight mobile) (if (atom? mobile) mobile (mobile-weight mobile)))
Complexity revised • Complexity of new total-weight? • Complexity of new constructor? • Complexity of balanced? • Can we do even better?