《数据压缩》实验报告三·Huffman编解码算法实现与压缩效率分析

本文是关于数据压缩的实验报告,重点探讨了Huffman编解码算法的实现细节。在实现过程中,使用二叉树表示编码,节点包含概率信息、节点类型以及子节点信息。由于Huffman码为变长码,采用指针存储码字序列,并记录比特位数。实验涵盖了从读入文件、构建码树、编码文件到解码文件的完整流程。
摘要由CSDN通过智能技术生成
一、实验原理 
哈夫曼编码(Huffman Coding),又称霍夫曼编码或最佳码,是可变字长编码(VLC)的一种,属于无损压缩。该方法完全依据字符出现概率来构造码字,出现概率大的符号码长短,概率小的码长大,能有效的减小码长,对于概率分布相差大的信源压缩效率高,而对于接近于等概分布的信源压缩效率低。 

实际实现中常用二叉树来表示编码过程,节点需要表示的信息有它的概率;它是否为叶子节点,不是则表示是一个中间节点,它有左右子节点,是叶子结点则有一个符号;它的父节点用于建立码树。 由于huffman码为变长码,不能事先预留空间,所以用指针来表示它的码字序列,还需指出它所用的比特位数,为了后续输出码表还添加了概率。

每个节点的数据结构

typedef struct huffman_node_tag
{
    unsigned char isLeaf;//是否为叶子结点
    unsigned long count;//该符号的个数
    struct huffman_node_tag *parent;//指向父节点的指针

    union
    {
        struct
        {
            struct huffman_node_tag *zero, *one;//子节点
        };
        unsigned char symbol;//符号
    };
} huffman_node;
每个码字的数据结构为:

typedef struct huffman_code_tag
{
    //add by zhn
    int count;//出现频率
    //end add
    /* The length of this code in bits. */
    unsigned long numbits;//比特位数
    unsigned char *bits;//比特流
} huffman_code;


编码步骤 
1)统计个符号出现的次数,按照它们出现的概率并从大到小依次排列。 
2)每次取概率最小的两个节点,合并概率,生成父节点,用父节点代替这两个子节点重新排序,直到根结点。 
3)分配码字,二叉树的左节点为0,右节点为1,从根到叶子结点遍历得到码字。 

二.实验步骤

1.Huffman编码流程



①读入文件


char memory = 0;//memory为1表示对内存编码
	char compress = 1;//compress为1表示压缩,为0是解压
	int
综合实验: 1. 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站编写一个哈夫曼码的编/译码系统。 2. 基本要求 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 (2) E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3) D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。 (4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 (5) T:印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。 3. 测试数据 用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FAVORITE”。 字符 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值