您的位置:首页 > 其它

SICP学习笔记 - 第二章 (2.3)

2012-11-13 13:35 260 查看
基本过程:

(eq? <symbol1> <symbol2>) ;判断连个符号是否相同
(cadr <list>) => (car (cdr <list>))
(number? <num>)
(symbol? <sym>)


范例:霍夫曼编码树

定长编码(fixed-length codes):采用同样数目的二进制位表示消息中的每个字符。

变长编码(variable-length codes):采用不同数目的二进制位表示不同字符。

前缀码(prefix code):每个字符的完整编码都不是另一字符的开始一段。

霍夫曼编码:Huffman编码可以表示为一棵二叉树,树叶是被编码的符号。非叶子节点代表一个集合,其中包含了这一节点下所有叶子节点的符号。位于叶子节点的符号还被赋予一个权重(相对频度),非叶节点的权重是其下所有叶节点的权重之和。

一棵霍夫曼树:



部分习题:

exercise 2.54

(define (equal? a b)
(cond ((and (null? a) (null? b)) #t)
((and (null? a) (not (null? b))) #f)
((and (not (null? a)) (null? b)) #f)
(else (let ((fir-a (car a))
(fir-b (car b)))
(cond ((or (and (pair? fir-a) (not (pair? fir-b)))
(and (not (pair? fir-a)) (pair? fir-b)))
#f)
((and (pair? fir-a) (pair? fir-b))
(equal? fir-a fir-b))
(else (if (eq? fir-a fir-b)
(test (cdr a) (cdr b))
#f)))))))


exercise 2.55



exercise 2.56

(defien (exponentiation? exp)
(and (pair? exp) (eq? (car exp) '**)))
(define (make-exp base exponent)
(cond ((= exponent 0) 1)
((= exponent 1) base)
(else (list '** base exponent))))
(define (base exp)
(car exp))
(define (exponent exp)
(caddr exp))

(define (deriv exp var)
(cond ((number? exp) 0)
((variable? exp)
(if (same-variable? exp var) 1 0))
((sum? exp)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
((product? exp)
(make-sum (make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
((exponentiation? exp)
(make-product (make-product (exponent exp)
(make-exp (base exp) (- (exponent exp) 1)))
(deriv (base exp) var)))
(else (error "unknown expression" exp))))


exercise 2.57

将 y 看为常数,则算式 d[x * y * (x + 3)] / dx = 2xy + 3y 。

(define (length exp)
(if (null? exp)
0
(length (cdr exp))))
(define (augend s)
(if (> (length s) 3)
(cons (car s)
(cdr (cdr s)))
(caddr s)))
(define (multiplicand p)
(if (> (length p) 3)
(cons (car p)
(cdr (cdr p)))
(caddr p)))


exercise 2.59

(define (union-set set1 set2)
(cond ((null? set1) set2)
((not (element-of-set? (car set1) set2))
(cons (car set1)
(union-set (cdr set1) set2)))
(else (union-set (cdr set1) set2))))


exercise 2.61

(define (adjoin-set x set)
(if (null? set)
(list x)
(let ((var (car set)))
(cond ((= x var) set)
((> x var)
(cons var
(adjoin-set x (cdr set))))
(else (cons x set))))))


exercise 2.62

(define (union-set set1 set2)
(cond ((and (null? set1) (null? set2)) '())
((null? set1) set2)
((null? set2) set1)
(else (let ((x1 (car set1))
(x2 (car set2)))
(cond ((= x1 x2)
(cons x1 (union-set (cdr set1) (cdr set2))))
((< x1 x2)
(cons x1 (union-set (car set1) set2)))
((> x1 x2)
(cons x2 (union-set set1 (cdr set2)))))))))


exercise 2.67



exercise 2.68

(define (encode-symbol symbol tree)
(if (leaf? tree)
'()
(let ((left (left-branch tree))
(right (right-branch tree)))
(cond ((find-symbol? symbol (symbols left))
(cons 0 (encode-symbol symbol left)))
((find-symbol? symbol (symbols right))
(cons 1 (encode-symbol symbol right)))
(else (error "no this symbol" symbol))))))
(define (find-symbol? symbol symbol-list)
(cond ((null? symbol-list) #f)
((eq? symbol (car symbol-list)) #t)
(else (find-symbol? symbol (cdr symbol-list)))))


exercise 2.69

(define (successive-merge leafs)
(cond ((< (length leafs) 2) (error "not enough leafs"))
((= (length leafs) 2)
(make-code-tree (car leafs)
(cadr leafs)))
(else (make-code-tree (car leafs)
(successive-merge (cdr leafs))))))
(define (generate-huffman-tree pairs)
(successive-merge (reverse (make-leaf-set pairs))))




exercise 2.70



对应的Huffman树,看起来是对的,有待验证。



符号编码:

a1110na0
boom1111110sha110
get11110yip10
job111110wah1111111
exercise 2.71

最频繁的符号用1个二进制位,最不频繁的符号用(n - 1)个二进制位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: