`

scheme实现huffman编码的完整代码

阅读更多
    来自sicp的完整代码,包括书中给出的代码以及习题,实现了huffman树的生成、解码、编码过程,总共67行代码,同样的代码有空用java、ruby改写下,看看会有什么不同。
ruby 代码
 
  1. (define (make-leaf symbol weight)  
  2.   (list 'leaf symbol weight))  
  3. (define (leaf? object)  
  4.   (eq? (car object) 'leaf))  
  5. (define (symbol-leaf x) (cadr x))  
  6. (define (weight-leaf x) (caddr x))  
  7. ;合并最低权重的两个节点  
  8. (define (make-code-tree left right)  
  9.   (list left right (append (symbols left) (symbols right)) (+ (weight left) (weight right))))  
  10. (define (left-branch tree) (car tree))  
  11. (define (right-branch tree) (cadr tree))  
  12. (define (symbols tree)  
  13.   (if (leaf? tree)  
  14.       (list (symbol-leaf tree))  
  15.       (caddr tree)))  
  16. (define (weight tree)  
  17.   (if (leaf? tree)  
  18.       (weight-leaf tree)  
  19.       (cadddr tree)))  
  20. ;解码  
  21. (define (decode bits tree)  
  22.   (define (decode-1 bits current-branch)  
  23.     (if (null? bits)  
  24.         '()  
  25.         (let ((next-branch  
  26.               (choose-branch (car bits) current-branch)))  
  27.           (if (leaf? next-branch)  
  28.               (cons (symbol-leaf next-branch)  
  29.                     (decode-1 (cdr bits) tree))  
  30.               (decode-1 (cdr bits) next-branch)))))  
  31.   (decode-1 bits tree))  
  32. (define (choose-branch bit branch)  
  33.   (cond ((= bit 0) (left-branch branch))  
  34.         ((= bit 1) (right-branch branch))  
  35.         (else (display "bad bit --CHOOSE-BRANCH"))))  
  36. (define (adjoin-set x set)  
  37.   (cond ((null? set) (list x))  
  38.         ((< (weight x) (weight (car set))) (cons x set))  
  39.         (else  
  40.            (cons (car set) (adjoin-set x (cdr set))))))  
  41. (define (make-leaf-set pairs)  
  42.   (if (null? pairs)  
  43.       '()  
  44.       (let ((pair (car pairs)))  
  45.         (adjoin-set (make-leaf (car pair) (cadr pair)) (make-leaf-set (cdr pairs))))))  
  46.   
  47. ;编码  
  48. (define (encode message tree)  
  49.   (if (null? message)  
  50.       '()  
  51.       (append (encode-symbol (car message) tree)  
  52.               (encode (cdr message) tree))))  
  53. (define (encode-symbol symbol tree)  
  54.   (define (iter branch)  
  55.     (if (leaf? branch)  
  56.         '()  
  57.         (if (memq symbol (symbols (left-branch branch)))  
  58.             (cons 0 (iter (left-branch branch)))  
  59.             (cons 1 (iter (right-branch branch))))  
  60.         ))  
  61.   (if (memq symbol (symbols tree))  
  62.       (iter tree)  
  63.       (display "bad symbol -- UNKNOWN SYMBOL")))  
  64. ;根据符号权重列表,生成hufman树  
  65. (define (generate-huffman-tree pairs)  
  66.   (successive-merge (make-leaf-set pairs)))  
  67.   
  68. (define (successive-merge leaf-set)  
  69.   (if (null? (cdr leaf-set))  
  70.       (car leaf-set)  
  71.       (successive-merge (adjoin-set (make-code-tree (car leaf-set)  
  72.                                                     (cadr leaf-set))  
  73.                                     (cddr leaf-set)))))  
分享到:
评论

相关推荐

    scheme 阴阳题源代码

    scheme源代码scheme 阴阳题源代码

    scheme实现唤醒外部app

    在移动应用开发中,"scheme"是一种常见的机制,用于实现应用程序间的交互,即从一个应用启动另一个应用。本文将深入探讨scheme如何实现唤醒外部APP,以及它在Webview和浏览器环境中的应用。 首先,理解scheme的基本...

    JVM平台上的Scheme语言实现JSchemeMin.zip

    作为基于JVM的实现,JSchemeMin 让Scheme程序可以调用Java平台的API,也让Java程序运行Scheme代码,这使Scheme可作为Java(以至别的JVM语言)程序的一种扩展语言。目前,JSchemeMin 只提供解释器而非编译器。基本的...

    scheme实现的八皇后

    《Scheme实现的八皇后问题详解》 八皇后问题是一个经典的计算机科学问题,它涉及到回溯算法、排列组合以及编程设计模式。在这个问题中,我们需要在8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一...

    Scheme实现八皇后

    Cheme语言实现的八皇后问题.

    Alamouti_scheme_空时编码_mimo_mimo空时编码matlab实现_

    通过对`Alamouti_scheme.m`和`ber_QAM.m`文件的分析,我们可以深入理解空时编码的工作原理,并通过实验调整来探索MIMO系统的潜力。这种技术对于现代无线通信,特别是移动通信网络,具有重要的理论和应用价值。

    C#实现scheme解释器

    而`Scheme`可能是源代码文件,可能包含了上述各个部分的实现代码。 编写Scheme解释器是一个复杂但极具挑战性的任务,它涉及到编译原理、数据结构和算法等多个方面的知识。通过这个过程,你可以深入了解编程语言的...

    scheme解释器 C#实现

    在提供的文件列表中,`Scheme.exe`可能是编译好的Scheme解释器可执行文件,`Scheme.sln`是Visual Studio解决方案文件,包含了项目设置和依赖项,而`Scheme`可能是源代码文件夹,包含C#实现解释器的具体代码。...

    plt scheme实现的围棋程序初步

    5. **源码分析**:在提供的链接中,我们可以阅读实际的源代码,了解作者是如何用Scheme来实现这些功能的。代码中可能会包含一些Scheme特有的编程技巧,如递归、闭包、宏等。 6. **工具应用**:标签中提到的“工具”...

    多项式 反统一算法的功能实现_Scheme_代码_下载

    在`anti-unification-master`这个压缩包中,可能包含了实现这些步骤的Scheme源代码文件。通过阅读和理解这些代码,你可以深入了解反统一算法在Scheme中的具体实现细节。这种实现可以帮助你在实际问题中,比如在推理...

    scheme实现的九宫格问题

    以二维list格式输入九宫格问题,用scheme函数式程序设计语言求解,对于多个解的九宫格,可以得到所有的解

    .net 图片base64编码 Data URI scheme

    这些代码可以作为实际项目中的参考,帮助开发者快速地在.NET应用程序中实现图片的Base64编码和Data URI功能。 总结起来,.NET中的图片Base64编码结合Data URI方案,能够简化Web应用的图片处理,提升用户体验。...

    ios-Url Scheme实现APP间通信、分享.zip

    接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享和iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UIActivityViewController系统原生分享-仿简书分享唤起iOS开源小项目-WSL并进行通信、...

    mit-scheme源代码

    总结,MIT-Scheme源代码的获取,不仅为我们提供了研究Lisp语言和解释器实现的窗口,也为开发者在64位Linux系统上构建和定制自己的Scheme环境提供了可能。通过深入学习和实践,我们可以进一步掌握Lisp的精髓,提升...

    Android-scheme-libscheme-lib是一个scheme使用的库

    - **热更新**: 通过更新Scheme脚本来实现部分功能的热更新,无需完整发布新版本。 **总结** Scheme-Lib为Android开发者提供了一个独特的工具,允许他们在应用程序中利用Scheme的强大功能。它不仅可以帮助简化某些...

    Scheme跳转的demo

    在上述代码中,`mycustomscheme://path/to/content`是自定义的scheme URL,当按钮被点击时,系统会尝试找到可以处理该URL的应用并启动它。 压缩包中的"doubantest"和"test"可能是两个示例项目,分别用于演示如何在...

    URl Scheme的使用以及回调

    在iOS和Android等操作系统中,开发者可以利用URL Scheme实现应用间的深度链接,从而创建丰富的用户体验,比如从一个应用内直接打开另一个应用的功能。 在iOS开发中,URL Scheme的注册通常在Info.plist文件中进行,...

    Lisp语言教程(Scheme)

    这些实现大多为开源项目,提供不同的特性和优势,有的甚至可以将Scheme代码编译成C语言或者虚拟机代码。 #### 三、基本概念与语法 - **注释**: - Scheme中的单行注释以分号`;`开始直到行尾。 - 在某些实现中,...

    Scheme 语言概要(上)

    除了Guile之外,还有许多其他的Scheme实现,例如GNU/MIT-Scheme、SCI、Scheme48和DrScheme等。这些实现大多开源且跨平台,可以根据个人需求选择合适的版本进行使用。 #### 基本概念 **注释:** Scheme支持单行注释...

    chez scheme windows exe执行查询

    Chez Scheme 是一个功能强大的 Scheme 编程语言实现,由 C 家族的编程语言编写而成,提供高效且兼容 R6RS(第六版 Scheme 报告)的标准。它以其简洁的语法、丰富的库支持以及高度可移植性而受到程序员的喜爱。在 ...

Global site tag (gtag.js) - Google Analytics