scheme实现huffman编码的完整代码

简介: 来自sicp的完整代码,包括书中给出的代码以及习题,实现了huffman树的生成、解码、编码过程,总共67行代码,同样的代码有空用java、ruby改写下,看看会有什么不同。 (define (make-leaf symbol weight)   (list 'leaf symbol wei
来自sicp的完整代码,包括书中给出的代码以及习题,实现了huffman树的生成、解码、编码过程,总共67行代码,同样的代码有空用java、ruby改写下,看看会有什么不同。
(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)))
;解码
(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  (display  " bad bit --CHOOSE-BRANCH " ))))
(define (adjoin
- set x set)
  (cond ((null? set) (list x))
        ((
<  (weight x) (weight (car set))) (cons x set))
        (
else
           (cons (car set) (adjoin
- 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 (encode message tree)
  (
if  (null? message)
      
' ()
      (append (encode - symbol (car message) tree)
              (encode (cdr message) tree))))
(define (encode
- symbol symbol tree)
  (define (iter branch)
    (
if  (leaf? branch)
        
' ()
        ( if  (memq symbol (symbols (left - branch branch)))
            (cons 0 (iter (left
- branch branch)))
            (cons 
1  (iter (right - branch branch))))
        ))
  (
if  (memq symbol (symbols tree))
      (iter tree)
      (display 
" bad symbol -- UNKNOWN SYMBOL " )))
;生成hufman树
(define (generate
- huffman - tree pairs)
  (successive
- merge (make - leaf - set pairs)))

(define (successive
- merge leaf - set)
  (
if  (null? (cdr leaf - set))
      (car leaf
- set)
      (successive
- merge (adjoin - set (make - code - tree (car leaf - set)
                                                    (cadr leaf
- set))
                                    (cddr leaf
- set)))))
文章转自庄周梦蝶  ,原文发布时间 2007-07-23
目录
相关文章
|
网络协议 前端开发 数据安全/隐私保护
利用C语言实现URL解析的基本方法之优秀
今天主要来学习一下,如何利用URL,实现对应的解析过程。
432 0
利用C语言实现URL解析的基本方法之优秀
|
8月前
|
C语言 C++
【Scheme】编程学习 (四) —— 递归
Scheme 编程通常的使用方法为递归
62 0
|
机器学习/深度学习 自然语言处理 算法
|
中间件 API
从HTTP 400 bad request说起 - 一个函数被注释掉后引起的血案
从HTTP 400 bad request说起 - 一个函数被注释掉后引起的血案
164 0
从HTTP 400 bad request说起 - 一个函数被注释掉后引起的血案
|
缓存 自然语言处理 安全
RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 14 Header Field Definitions(规定) This section(部分,章节) defines(规定定义) the synta...
1798 0
|
安全
RFC2616-HTTP1.1-Methods(方法规定部分—单词注释版)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 9 Method Definitions The set of common methods for HTTP/1.
1032 0