SICP学习笔记 - 第二章 (2.3)
2012-11-13 13:35
260 查看
基本过程:
范例:霍夫曼编码树
定长编码(fixed-length codes):采用同样数目的二进制位表示消息中的每个字符。
变长编码(variable-length codes):采用不同数目的二进制位表示不同字符。
前缀码(prefix code):每个字符的完整编码都不是另一字符的开始一段。
霍夫曼编码:Huffman编码可以表示为一棵二叉树,树叶是被编码的符号。非叶子节点代表一个集合,其中包含了这一节点下所有叶子节点的符号。位于叶子节点的符号还被赋予一个权重(相对频度),非叶节点的权重是其下所有叶节点的权重之和。
一棵霍夫曼树:
部分习题:
exercise 2.54
exercise 2.55
exercise 2.56
exercise 2.57
将 y 看为常数,则算式 d[x * y * (x + 3)] / dx = 2xy + 3y 。
exercise 2.59
exercise 2.61
exercise 2.62
exercise 2.67
exercise 2.68
exercise 2.69
exercise 2.70
对应的Huffman树,看起来是对的,有待验证。
符号编码:
exercise 2.71
最频繁的符号用1个二进制位,最不频繁的符号用(n - 1)个二进制位。
(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树,看起来是对的,有待验证。
符号编码:
a | 1110 | na | 0 |
boom | 1111110 | sha | 110 |
get | 11110 | yip | 10 |
job | 111110 | wah | 1111111 |
最频繁的符号用1个二进制位,最不频繁的符号用(n - 1)个二进制位。
相关文章推荐
- Java虚拟机第二章2.3 学习笔记
- SICP学习笔记 - 第二章 (2.2)(下)
- SICP第二章学习笔记
- SICP学习笔记 - 第二章 (2.4)
- SICP第二章学习笔记
- SICP学习笔记 - 第二章 (2.2)(上)
- SICP学习笔记 - 第二章 (2.1)
- SICP学习笔记(1.3.2 ~ 1.3.3)
- R语言编程艺术学习笔记—第二章
- java编程思想学习笔记 第二章
- C++Primer 学习笔记 第二章(变量和基本数据类型)
- C专家编程第二章学习笔记
- Java学习笔记―第二章 初识Java
- 第一行代码学习笔记-第二章 探究活动-3.活动的生命周期
- Pro visua 4000 l c++/cli and .net 2.0 platform2 学习笔记(6 第二章 C++/CLI基础=1 )
- c++ primer 第五版学习笔记-第二章-链接的那些事
- Arm 学习笔记 第二章: ARM Processor Fundamentals
- 第二章、小实例,画字,画线,矩形,画图,动画(iOS学习笔记,从零开始。)
- [HeadFirst-JSPServlet学习笔记][第二章:高层概述]