huffman编码的程序流程图_信源编码实验报告【Huffman编解码实验报告】

本文介绍了一次Huffman编码实验,旨在熟悉Huffman编解码算法并理解其最佳性。通过统计文本文件中各字符出现概率构建Huffman树,实现了编码和解码过程。程序流程包括文本统计、树构建、码本生成、编码和译码。实验使用C语言和VC++ 6.0,输出包括码本文件、编码文件和译码文件。压缩率计算时,编码文件大小需除以8。
摘要由CSDN通过智能技术生成

文本文件的二进制预统计Huffman编解码

一、实验目的(1) 熟悉Huffman编解码算法;

(2) 理解Huffman编码的最佳性。

二、实验内容

1、编程思想

霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。

计算机编程实现时,首先统计带编码的文本文件中各个字符出现的概率,然后将概率作为节点的权值构建huffman树。编码时从叶子节点出发,如果这个节点在左子树上,则编码0,否则编码1,直到根节点为止,所得到的01序列即为该叶子节点的编码。所有叶子节点的编码构成一个码本。

有两种译码方法:(1)按位读入码字,从已建好的Huffman树的根节点开始,若码字为“0”,则跳到左子树,若为“1”则跳到右子树,直到叶子结点为止,输出叶子接点所表示的符号。(2)由于Huffman编码是唯一码,还有另一种译码方法,每读入一位编码就去码本中去匹配相应的码字,若匹配不成功,则继续读入下一个编码,直到匹配成功为止。显然前一种方法比较简便,本程序采用便是该方法。

2、程序流程图

N

N

N

Y

Y

N

开始编码

读入文本文件

统计各符号概率

构建Huffman树

保存码本

读入1位码字

编码

输出编码文件

编码结束

开始译码

读入码本

定位到根节点

码字为1?

跳到右子树

译码结束

叶子结点?

跳到左子树

输出字符

Y

码字读完?

3、编程实现

本实验采用用C语言程序语言,VC++ 6.0编程环境。

数据结构

构造存放符号及其权值的存储结构如下

typedef struct

{

unsigned char symbol; //符号的ASCII码值

int sweight; //权值

}syml_weit;

syml_weit *sw;

symbol

symbol

sweight

sw

构造huffman树存储结构如下:

typedef struct

{

int weit; //权值

int lchd;//左孩子地址

int rchd; //右孩子地址

int part; //双亲地址

}hufmtree;

hufmtree *htree;

weit

weit

lchd

part;

rchd

htree

函数

本程序共包含5个函数:

一个主函数:

void main(),

4个子函数:

void CountWeight(unsigned char *DataBuf,int FileLen);

void BuildTree();

void HufmCode(unsigned char *DataBuf,int FileLen);

 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。 以哈夫曼─即最优二叉,带权路径长度最小的二叉,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值