zoukankan      html  css  js  c++  java
  • 【Scheme】Huffman树

    (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) ;解码
    
  • 相关阅读:
    动态属性 的简单思考
    千发 邮件营销小工具 完全免费
    基于角色的代码权限
    VS2005对NHibernate映射文件的智能感知功能
    在ASP.NET中使用脚本代码保护功能
    ASP.NET 开发, PageBase, ModuleBase
    在自定义HttpHandler中使用Session
    C# 应用程序许可控制
    TCE条件表达式
    NHibernate 基本使用(一对一、组件、一对多)
  • 原文地址:https://www.cnblogs.com/cknightx/p/6815801.html
Copyright © 2011-2022 走看看