数据结构课程设计题目3

本文介绍了哈弗曼编码的概念,它是用于生成不定长前缀编码的算法,以减少通信中字符编码的位长度。通过构建哈弗曼树,实现根据字符出现频率分配不同长度编码,提高数据传输效率。文章详细阐述了哈弗曼树的节点结构、算法设计、编码与解码过程,并提供了C++实现。最后,作者分享了编程实践的心得体会。
摘要由CSDN通过智能技术生成

一.问题描述

   针对减少通信系统中字符编码所需要的二进制位长度,提出用于产生不定长的前缀编码算法,所谓前缀编码是指任一编码都不是其他编码的前缀。前缀编码算法的基本事项就是对于出现概率较大的字符采用短编码方式,而出现概率较小的字符采用长编码方式。在网络传输数据过程中个别数据出现的次数特别多,而有些则不怎么出现。如果对数据用同样的长度定义则会造成相当大的浪费,因而需要构建一种可根据数据出现频率生成长度不同但又不会在传输过程中出现混淆的编码。哈弗曼编码就是能完成这项工作的一种编码。

哈夫曼树,又称最优树,是一类带权路径长度最短的树。哈弗曼算法能够是的其构造出的二叉树的WPL值最小,从而保证在通信过程中,传输二进制位总长度最短。该算法主要是根据给定的不同字符的出现频度(权值)建立一棵最优二叉树。

通过构造哈夫曼树来生成哈夫曼编码。哈夫曼编码使用的是不等长编码(ASCII为等长编码),通过不等长编码将出现频率高的字符编码比较短,频率高的字符编码长的方式来减少文本的长度。

所设计的哈夫曼编码器,具有从外部文件中读入任一数量的字符和权值(字符和权值的数量要匹配)并能对每个字符输出相应的哈夫曼编码的功能,目的在于将通讯时需要传输的字符通过该编译器转换成相应的二进制代码。利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

二.问题分析

求解n个字符的哈弗曼编码其实就是构建一棵有n个叶子结点的哈夫曼树,首先要确定的是哈弗曼树的结点结构问题。

哈夫曼树结点的结构类型:

struct Node_H

{

int lchild;

int rchild;

int parent;

int weight;

int flag;

} huffTree[2 * M - 1];    //哈夫曼树的结点

其次,根据哈夫曼树的特点可知,其中没有度为1的结点,所以当一棵哈夫曼树有n个结点时,推出结点数为2*n-1个,可以用大小为2*n-1的一维数组来储存它。

程序主要算法:使用他们心算法构造最优前缀码的编码。

贪心算法采用的是逐步构造最优解的方法:在当前状态下一旦选定一个分量,就不再重试其他的可行性;它并不从整体最优上作出考虑,它的选择只是在贪心准则下的局部最优选择。

三.逻辑结构和存储结构设计

1.逻辑结构设计

 

2.存储结构设计

哈夫曼树是一棵正则二叉树。根据二叉树的性质,一棵有n个叶子的哈夫曼树共有2n-1个结点,可以用一个大小为2n-1的一维数组存放哈夫曼树的各个结点。由于每个结点同时还包含其双亲和孩子结点以及对应权值的信息,所以我们可以用一个结构体把这几个信息封装起来。

lchild

rchild

parent

we

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值