没有合适的资源?快使用搜索试试~ 我知道了~
哈夫曼编码和译码系统.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 60 浏览量
2022-10-30
18:59:05
上传
评论
收藏 385KB DOCX 举报
温馨提示
试读
28页
哈夫曼编码和译码系统.docx哈夫曼编码和译码系统.docx
资源推荐
资源详情
资源评论
实 训 报 告
题 目: 哈夫曼编码和译码系统
院 系:
专 业:
姓 名:
学 号:
指导教师:
日 期:
目录
一. 需 求 分 析 ···································· 2
二. 概要设计
(1) 建立哈夫曼树 、 编 码 ······················ 3
(2) 字 符 匹 配 ································· 3
(3) 哈 夫 曼 树 遍 历 ····························· 3
三. 详 细 设 计 及 编 码 实 现 ·························· 3
四. 流程图
(1) 总 流 程 图 ································· 1 5
(2) 编 码 实 现 流 程 图 ··························· 1 6
(3) 译 码 实 现 流 程 图 ··························· 1 7
五. 调试分析
( 1 ) 计 算 权 值 ··································· 1 8
( 1 ) 生 成 哈 夫 曼 树 , 建 立 编 码 表 ··················· 1 8
( 3 ) 将 输 入 字 符 编 码 ····························· 1 9
( 4 ) 输 入 新 的 字 符 串 , 进 行 译 码 ··················· 1 9
(5)输入新的二进制数将其译为字符 ·············· 2 0
六. 系 统 维 护 ······································ 2 0
七 . 实 验 总 结 ······································ 2 0
八. 源 代 码 ········································ 2 1
一.需求分析
《1》问题描述:在传送电文时,人们总是希望传送时间尽可能短,这就是
要求使电文代码长度尽可能短。利用哈夫曼编码进行通信可以大大提高信道利用
率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系
统能够对待传输数据预先编码,在接收端将传来的数据进行译码。对于双工信道
(即可以双向传输信息的信道),每段都需要一个完整的编/译系统。所以为这样
的信息收发站写一个哈夫曼的编译码系统。
《2》打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们
作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:
1. 从硬盘的一个文件里读出一段英语文章。
2. 统计这篇文章中的每个字符出现的次数。
3. 以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储 结构的
初态和终态进行输出。
4. 对每个字符进行编码并将所编码写入文件然后对所编码进行编译。
《3》这个哈夫曼编码译码主要是以英文字母输入进行编码与编译,编码译
码过程由系统自动完成,人工操作部分就是电文的录入,和编译出来时的读操作。
二.概要设计
本程序主要用到了三个算法。
(1)哈夫曼树建立、编码
在初始化(I)的过程中间,要用输入的字符和权值建立哈夫曼树并求得
哈夫曼编码。先将输入的字符和权值存放到一个结构体数组中,建立哈夫
曼树,将计算所得的哈夫曼编码存储到另一个结构体数组中。
(2)串的匹配
在编码(D)的过程中间,要对已经编码过的代码译码,可利用循环,将
代码中的与哈夫曼编码的长度相同的串与这个哈夫曼编码比较
(3)哈夫曼遍历
在印哈夫曼树(T)的中,因为哈夫曼树也是二叉树,所以就要利用二
叉树的先序遍历将哈夫曼树输出。
三.详细设计及编码实现
构造哈夫曼树的方法如下:
初始化:每个字符就是一个结点,字符的频度就是结点的权;
1、将结点按频度从小到大排序;
2、选取频度最小的两个结点,以它们为儿子,构造出一个新的结点;新结点
的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选
出的那两个结点,但同时将新生成的结点加进去;
3、如果结点序列里只剩下一个结点,表示构造完毕,退出。否则回到第一步。
编码:
上面已经生成了树,接着就该对该树进行编码了。
可以假定,对某个结点而言,其左孩子在当前阶段的编码为 0,右孩子的编码
为 1。这样就可以通过“树的遍历”的方式来生成字符——编码对照表。
来到这里,基本上艰苦的已经完成了,对某个具体的字符串编码和解码就只
是简单的“查表——替换”的工作了。
译码:
译码也是个简单的查表--替换过程。如果利用该种编码发送字符串,则它
的“字符——编码”对应表也必须发送过去,不然对方是不知道怎么解码的。
对给出的一串编码,从左向右,将编码组合起来并查表,“一旦”找到有匹
配的字符,则马上将当前的编码替换为对应的字符。
因为该编码是不会出现”某一个字符的编码是另一个字符编码的缀”这种情
况的,也就是不会出现类似于“A 00 B 0010” 这样的情况,所以译码出
来的字符串是唯一的,而且就是原来进行编码的那一个。
代码如下:
char *pt2=p;
int i=0;
ch[0]=*pt2;
freq[0]=0;
剩余27页未读,继续阅读
资源评论
- 2201_754497162023-06-08资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- 2201_754497162023-06-08资源有一定的参考价值,与资源描述一致,很实用,能够借鉴的部分挺多的,值得下载。
G11176593
- 粉丝: 6646
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功