【Scheme】Huffman树
2024-09-24 16:13:26
(define (make-leaf symbol weight)
(list 'leaf symbol weight))
(define (leaf? object)
(eq? (car object) 'leaf))
(define (symbol-leaf x)
(cadr x))
(define (weight-leaf x)
(caddr x))
(define (make-code-tree left right)
(list left
right
(append (symbols left) (symbols right))
(+ (weight left) (weight right))))
(define (left-branch tree) (car tree))
(define (right-branch tree) (cadr tree))
(define (symbols tree)
(if (leaf? tree)
(list (symbol-leaf tree))
(caddr tree)))
(define (weight tree)
(if (leaf? tree)
(weight-leaf tree)
(cadddr tree))) ;由上面make-code-tree可知,weight位于表第4个位置
(define (decode bits tree)
(define (decode-1 bits current-branch)
(if (null? bits)
'()
(let ((next-branch
(choose-branch (car bits) current-branch)))
(if (leaf? next-branch)
(cons
(symbol-leaf next-branch)
(decode-1 (cdr bits) tree))
(decode-1 (cdr bits) next-branch)))))
(decode-1 bits tree))
(define (choose-branch bit branch)
(cond ((= bit 0) (left-branch branch))
((= bit 1)(right-branch branch))
(else (error "bad bit"))))
(define (adjoin-set x set)
(cond ((null? set) (list x))
((< (weight x) (weight (car set))) (cons x set)) ;x<min(set) 所以放集合最前
(else (cons (car set)
(adjoin-set x (cdr set)))))) ; x比当前set元素大,所以x属于(cdr set)
(define (make-leaf-set pairs)
(if (null? pairs)
'()
(let ((pair (car pairs)))
(adjoin-set (make-leaf (car pair)
(cadr pair))
(make-leaf-set(cdr pairs))))))
(define sample-tree ;测试编码树
(make-code-tree(make-leaf 'A 4)
(make-code-tree
(make-leaf 'B 2)
(make-code-tree (make-leaf 'D 1)
(make-leaf 'C 1)))))
(define sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0)) ;测试编码
(decode sample-message sample-tree) ;解码
最新文章
- mybatis入门_配置文件的配置
- windows编程中关于“关闭窗口无法退出进程”的解决方法
- logback打印不出日志
- C#应用Newtonsoft.Json操作json
- WCF编程系列(四)配置文件
- 在HTML中插入回车换行
- c#基础编程—泛型
- Swift— Swift编码规范之命名规范-备
- CentOS 6.4 下安装 Apache
- ssd可以用作redo 盘吗?
- GPUImage的filter 响应处理链 的理解笔记
- onunload事件和onbeforeunload事件
- Archlinux下i3wm与urxvt的配置
- QUIC协议的分析,性能测试以及在QQ会员实践
- 值得推荐的C/C++框架和库 (真的很强大) c
- 问题集 &; 知识点
- maven发布jar包到nexus
- Perl:undef类型和defined()函数
- TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—Jason niu
- 用virsh console vhosts 卡住