哈夫曼编码译码器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
    评论
提供的源资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源都是基于各自平台的最新技术和标准写,确保了在对应环境下能够无缝运行。同时,源中配备了详细的注释和文档,帮助用户快速理解代结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源,你可以掌握各平台开发的基础知识,提升程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源资源进行课程实践、课外项目或毕业设计。通过分析和运行源,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源资源的可运行性和易用性,特别注意了以下几点:首先,每份源都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源中的注释和文档都非常完善,方便用户快速上手和理解代;最后,我会定期更新这些源资源,以适应各平台技术的最新发展和市场需求。 所有源均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值