哈夫曼编码译码器c语言实验,实验九哈夫曼编码-译码器.doc-资源下载在线文库www.lddoc.cn...

实验九 哈夫曼编码-译码器.doc

实验十 哈夫曼编/译码器 一、实验目的 (1)掌握哈夫曼树的构造和应用 (2)利用哈夫曼方法及其编/译码技术实现对传输信息编码/译码系统 二、 实验内容 问题描述(设计性实验) 哈夫曼树很易求出给定字符集及其概率或频度分布的最优前缀码。哈夫曼编码正是 一种应用广泛且非常有效的数据压缩技术。该技术一般可将数据文件压缩掉20至90, 其压缩效率取决于被压缩文件的特征。 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时,降低传输成本。 但是,这要求在发送端通过一个编码系统对待传送电文须预先编码,在接收须将传送来的 数据进行译码。请自行设计实现一个具有初始化、编码、译码、输入/输出等功能的哈夫曼 码的编码/译码系统。并实现以下报文的编码和译码“this program is my favorite” 。 测试数据 某通信的电文字符集为26个英文字母及空格字符,其出现频度如下表所示 实现提示如何创建哈夫曼树及如何求得各结点对应的哈夫曼编码算法参见ppt。 1、设计思想描述 (1) 问题分析。 (2) 哈夫曼树中各结点的结构描述(提示图示) 。 (3) 哈夫曼树的存储结构描述(提示分析采用顺序存储还是利用链式存储等) 。2、主要算法设计与实现 要求 1、利用类模板来实现。 2、类中各成员函数要求给出自行设计的算法步骤描述及主要设计思想。 3、给出类中各成员函数算法设计实现。 4、对自行设计的各算法进行评估(提示时间复杂度、空间复杂度等) 。 include include using namespace std; const int MAX 1000; class HTree; class HTNode friend class HTree; unsigned int weight; unsigned int parent, lchild, rchild; ; class HuCode friend class HTree; char *ch; 字符的编码 char data;被编码的字符 ; 动态分配数组存储哈夫曼编码表。 class HTree HTNode *HT;动态数组 HuCode *HC; int n; public HTreeint w, int n; void Selectint k, int void QHuffmanCodechar ch, int n; 求出n个字符的赫夫曼编码HC void printHuffmantreeint n; void printHuffmanCodeint n; char *MessageCodingchar *s1, int n;对报文进行编码,n为字符集中字符的个数 char *MessageEnCodingchar *s1, int n;对报文的编码进行译码,n为字符集中字符的个 数 ; HTreeHTreeint w, int n w存放n个字符的权值均0,构造赫夫曼树HT int i, m, s1, s2; if n 1 cout “error“; exit0; m 2 * n - 1; 注有n个字符,其构造成一颗Huffman树后,将有nn-1个结点. HT new HTNodem 1;0号单元未使用 for i 1; i n; i 初始化Huffman树的各叶子结点 HTi.weight wi; HTi.lchild 0; HTi.rchild 0; HTi.parent 0; for ; i m; i 初始化其它树结点; HTi.weight 0; HTi.lchild 0; HTi.rchild 0; HTi.parent 0; for i n 1; i m; i 建赫夫曼树,在HT1i-1选择parent为0且weight最小的两个结点,其序号分别为s1和s2; Selecti - 1, s1, s2; HTs1.parent i; HTs2.parent i;孩子结点的修改 HTi.lchild s1; HTi.rchild s2; HTi.weight HTs1.weight HTs2.weight; 双亲结点的修改 void HTreeSelectint k, int w1 w2 MAX; s1 s2 i;for i 1; i k; i if HTi.parent if HTi.weightw1 w2 w1; w1 HTi.weight; s2 s1; s1 i; else if HTi.weightw2 w2 HTi.weight; s2 i; void HTreeprintHuffmantreeint n 遍历赫夫曼树 int m, i; m 2 * n - 1;树结点总个数。 cout “The Huffman tree isn“; cout “no“ ends “weight“ ends “lchild“ ends “rchild“ endl; for i 1; i m; i 0号未用 cout i ends HTi.weight ends HTi.lchild ends HTi.rchild endl; -从叶子到根逆向求得每个字符的赫夫曼编码 void HTreeQHuffmanCodechar ch, int n 求出n个字符的赫夫曼编码HC char *cd; int i, c, f, start; HC new HuCoden 1; 分配n个字符编码的头指针向量,0不用 for i 1; i n; i HCi.data chi; 初始化字符集 cd new charn;分配求编码的临时工作空间 cdn - 1 0 i n; i 逐个字符求赫夫曼编 start n - 1;编码结束符,逆向存放for c i, f HTi.parent; f 0; c f, f HTf.parent 从叶子到根逆向求编码 c为当前结点,f为双亲结点 if HTf.lchild c cdstart 01 为第i个字符编码分配空间 strcpyHCi.ch, 从cd复制编码串到HC.注start现在的位置. freecd; QHuffmanCode void HTreeprintHuffmanCodeint n 输出赫夫曼树的编码 int i; cout n 不属于该字符集,则原样照抄 *c2 *c; c2; else len strlenHCj.ch; strcpyc2, HCj.ch; c2 len;复制编码 *c2 0 char *HTreeMessageEnCodingchar *s1, int n 对报文的编码进行译码,n为字符集中字符的个数 int m 2 * n - 1, i, num 0; char *c s1, *s2, *s3; S2中保存译码结果 s2 new char; i m;从根往下搜索 while *c 0 num; s3 new charnum 1; for int nn 0; nnn HT1n均为叶子结点 if *c cout “code error“; exit0; 编码有误 if *c 0 exit0; 还未到叶子结点途中遇到非0,1值,则认为非法 if *c 0 i HTi.lchild;判往左走还是往右走 else i HTi.rchild; c; s2num - 1 HCi.data; 译码结果插入s2串中。译码结果为叶子结点所对应的字符 i m; endif endwhile s2num 0 void main int a28 0, 186, 64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20, 57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16, 1 ; char ch28 0, , a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z ; HTree hta, 27; ht.printHuffmantree27; ht.QHuffmanCodech, 27; ht.printHuffmanCode27; char *s1 “this program is my favorite“; char *s2 ht.MessageCodings1, 27; cout “this program is my favorite的编码结果为“ endl; cout s2 endl; char *s3 ht.MessageEnCodings2, 27; cout s2 “的译码结果为“ endl; cout s3 endl; 三、实验心得(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心 得)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值