哈弗曼编码解码

#lang scheme

( define nil ‘() )

( define ( make-leaf symbol weight )

( list ‘leaf symbol weight ) )

( define ( leaf? obj )

( eq? ( car obj ) ‘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 )

( cond [ ( leaf? tree )

( list ( symbol-leaf tree ) ) ]

[ else ( caddr tree ) ] ) )

( define ( weight tree )

( cond [ ( leaf? tree )

( weight-leaf tree ) ]

[ else ( cadddr tree ) ] ) )

( define ( decode bits tree )

( define ( decode-1 bits cur-branch )

( cond [ ( null? bits ) nil ]

[ else ( let ( [ next-branch

( choose-branch ( car bits ) cur-branch ) ] )

( cond [ ( 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 "Pass" ) ] ) )

( 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 )

哈弗曼编码解码,布布扣,bubuko.com

时间: 2024-12-14 20:16:44

哈弗曼编码解码的相关文章

哈弗曼编码和译码.cpp

<span style="color:#6600cc;">#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char a;//记录对应字符 int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode;//动态分配数组存储哈夫

哈弗曼编码译码系统

/**********************************************************************                                        * 学校:黄淮学院                                                         * 院系:信息工程学院                                                     * 年级专业:网络

数据结构之哈弗曼编码的(Huffman Coding)加密解密压缩

Huffman树又叫最优二叉树,它的特点是带权路径最短. Huffman树的一个重要应用是Huffman编码,Huffman编码是长度最短的前缀编码.即给定要传送的字符的权值,根据权值求出Huffman编码,它一定是前缀编码(指任意字符的编码都不是另一个字符编码的前缀),并且在传送过程由字符组成的文字时,编码长度最小. 因此Huffman编码可以对文字进行加密解密还有压缩.加密的工作就是将文字转换为编码,解密工作是将编码转换为文字,如何转换本文不做详解(严蔚敏的<数据结构>书中有代码).那么如

数据结构&amp;&amp;哈弗曼树和哈弗曼编码

1.什么是哈夫曼树和哈弗曼编码 大家来看这样一道面试题(题目来自于<程序员面试宝典>).用二进制来编码字符串"abcdabaa",需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符串? A.12 B.14 C.18 D.24 解析:典型的哈弗曼编码问题:字符串"abcdabaa"有4个a.2个b.1个c.1个d.构造哈弗曼树如下图所示(图好丑).a编码0(1位),b编码10(2位),d编码111(3位).二进制字符串的总长度为1*4+2*2+

哈弗曼编码及译码

路径长度:从树的一个结点到另一个结点之间边的条数. 树的路径长度:从树根到每个叶子结点之间路径长度之和. 带权树的路径长度:每个叶子结点带有权值,树根到叶子结点的路径长度乘以该叶子结点的权值之和. 哈弗曼树:带权树的路径长度最小的树,又称作最小二叉树和最优二叉树. 哈夫曼树的构造过程: 1.      根据给定的n个带权的结点,构成含有n棵二叉树(每个结点是一棵树)的集合,该树的左右子树均为空. 2.      从含有n棵子树集合中找出两棵权值最小的树最为左右子树构成一个新的二叉树. 3.   

用哈弗曼编码实现文件压缩和解压

放假了把这个改一下,发现确实用单字节压缩的压缩率要高一些,暂时没去管为什么,不过放假静下心来写的话确实效率高很多. 新版详见:http://blog.csdn.net/tookkke/article/details/50575103 今天脑洞大开突然想写一下,明明都要考试了,唉,怎么就管不住这手啊  总之呢,就是根据每种编码的出现频率把等长的编码换成变长的,据说理论上压缩比率是比较高的,可是为什么经检验我这个大部分时候压缩出来的比源文件还大呢? 哈弗曼编码的时候要先做一颗字典树,查找的时候就按照

uva 10954 Add All(哈弗曼编码)

这道题我一开始想错了,这么简单的题都wa了两发...我往贪心上面想了,每次都找一个最小的数相加,结果就是 排序后直接往后加,还在那纳闷为何出错...其实这道题是哈弗曼编码问题,简直是模板题目,就是每次找两个最 小的结点求和后把他们的和放到节点中去,把这两个点删除...用的multiset,其实和set容器差不多,就是可 以存放重复的元素... 代码: #include<iostream> #include<cstdio> #include<cstdlib> #inclu

数据结构实验2(设计哈弗曼编码和译码系统)

设计一个哈弗曼编码和译码系统, 要求如下: B--建树:读入字符集和各字符频度,建立哈夫曼树. T--遍历:先序和中序遍历二叉树. E--生成编码:根据已建成的哈夫曼树,产生各个字符的哈夫曼编码. C--编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中. D--译码:读入codefile.txt,利用已建成的哈夫曼树进行译码,并将译码结果存入磁盘文件resul

java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码. 首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点 package 霍夫曼编码; /** * * @author luckid * @version 2014_10_11 * */ /** * 定义Huffman编码的节点 */ public class TNode { /** * * @param weight *