没有合适的资源?快使用搜索试试~ 我知道了~
哈夫曼编码译码课程设计报告_石喆.docx
需积分: 5 0 下载量 37 浏览量
2023-10-31
10:07:25
上传
评论
收藏 317KB DOCX 举报
温馨提示
试读
36页
哈夫曼编码译码课程设计报告_石喆
资源推荐
资源详情
资源评论
哈夫曼编码译码课程设计报告
------分组成员:叶恒、石喆、刘沄
一:问题定义及设计要求:
【问题描述】
设计一种编码,让使用频率高的字符的编码尽可能的短,并且要求一字符的编码不能与
另一个字符的编码的前一部分相同。把每个叶子的使用频率作为权,构造哈夫曼树。然后能
够通过字符和他的权值来构造哈夫曼编码,并且能够通过编码相反的过程来实现哈夫曼的译
码功能。
【基本要求】
(1)能够通过键盘或者纯文本文件读入字符集的大小 n,以及 n 个字符和权值来建立
哈夫曼树,并且把建立好的哈夫曼树存入到 HuffmanTree.txt 中去。
(2)利用已经建立好的哈夫曼树,对文件中的正文进行编码,将结果存入到文件
HuffmanCode.txt 中。
(3)利用已经建立好的哈夫曼树将 HuffmanCode.txt 中的哈夫曼编码进行译码,结果
存入到 HuffmanText.txt 中。
(4)能够按照垂直输出二叉树的方式,将存储在 HuffmanTree.txt 纯文本文件中的哈
夫曼树垂直输出。并且在打印哈夫曼编码是,要求字符与编码之间是一一对应的。
【实现提示】
(1)在程序运行时,能够出现一个主选择菜单,用户能够自主选择功能:①建立哈夫
曼树;②对哈夫曼树进行编码、译码等功能。
(2)在建立哈夫曼树时,用到文本文件的读取时,需要用到头文件“fstream”来对
文本文件进行处理。
【关键技术与知识点】
(1)优先级队列;
(2)哈夫曼树;
(3)啥夫曼编码。
二、设计过程:(概要)
(1)设计思路如下:
1. 在磁盘中建立“Huffman.txt”文本文件,其中包含需要哈夫曼编码的字符文章。
2. 运用二叉搜索树中的 Find 函数统计其中的字符种类和每个字符出现的频率;
3. 以字符出现的频率作为权值,构建哈夫曼树,并将哈夫曼树的存储结构终态进行输
出;
4. 对每个字符进行哈夫曼编码并将所得的编码写入程序,且保存在“SaveWord.txt”文本
文件中,然后对此文本文件中的编码进行译码。
详细介绍:在本课程设计中,我们在磁盘中预先建立一个“Huffman.txt”文本文档,在里
面编辑一篇文章。然后运行程序,调用 fileopen()函数读出该文章,显示在界面;再调用 Find
函数对该文章的字符种类进行统计,并对每个字符的出现次数即频率进行统计,并且在界面
上显示;然后以每个字符出现次数作为权值,调用 ChuffmanTree()函数构建哈夫曼树;并调
用输出函数 OutPutCodePreorder 将哈夫曼的存储结构终态进行输出。然后根据得到的哈夫
曼树进行编码,每种字符的二进制哈夫曼编码保存在“SaveCode.txt”中,再对整篇文章对应
的哈夫曼编码二进制的 SaveWord.txt 文本文档进行译码,再输出至界面。至此,整个工作
就完成了。
(2)其主要设计功能的流程图如下:
○
1
主函数流程图如下:
主函数流程图说明:
由该流程图可知主要是调用各个函数模块,首先打开已经存在的文本文件或者通过键盘
直接输入文章,然后统计其中的总的字符数以及出现的各个字符和频数。然后根据字符的频
数才开始建立哈夫曼树,接着在哈夫曼树的基础上对其进行编码,编码之后才是译码。最后
输出结束。
进入编码译码系
统(欢迎界面)
程序主界面
2、读取文本文件
中的文章字符
统计字符的种
类和权值
根据权值进行
哈夫曼编码
读取文本文件
的二进制文本
从根结点进行
遍历直到叶子
根据二进制编
码进行译码
保存并输出哈
夫曼编码
3、返回上一级
界面
4、退出编码译
码系统
显示译码结果
建哈夫曼树
哈夫曼编码
哈夫曼译码
读哈夫曼树
可
选
择
结
束
程
序
可
选
择
结
束
程
序
程序开始运行
(1、发送者!) (2、接收者!)
1、通过键盘直接
输入文章字符
生成信息密
文!
输出哈夫曼树
1、信息编码
1、接收密
文
2、删除密
文.txt文件
返回上一级
○
2
构造哈夫曼树流程图:
哈夫曼树流程图说明:
该流程图表示构造哈夫曼树的过程。首先输入 n 个叶结点及其权值,然后根据权值构建
小根堆。然后进行哈夫曼树的构建,不断提取小根堆元素作为叶子结点,其父亲结点为其左
右孩子结点的权值之和,直到小根堆元素没有为止。最后输出所得到的哈夫曼树。
hf,left,right
定义一个Hufm
小根堆H(s)
通过for循环不断
插入带权值的字
符hf,根据权值
构建一个小根堆
再用一次循环来
根据权值来构建
哈夫曼树,以下
是循环过程
H.DeleteMin(hf);取
堆首元素并删除,
重新调整为堆
left=hf.t;左为
小,右为大
H.DeleteMin(hf);再
取堆首元素并重新
调整为堆
right=hf.t;右为
大
hf.t=GetBTNode(left-
>data+right-
>data,'#',left,right);得到
其父亲结点
H.Insert(hf);
H.DeleteMin(hf
);
return hf.t;得到
哈夫曼树
循环开始
循环结束
通过for循环
○
3
哈夫曼编码流程图如下:
哈夫曼编码流程图说明:
该流程图表示哈夫曼编码情况。首先初始化,然后从首地址开始进行比较,找节点的父
母地址然后看节点为父母地址的左孩子是的话为’0’,反之为’1’.依次开始上溯。将编码存入
code[i]。
根据得到的哈
夫曼树进行哈
夫曼编码
结点b为叶子结点
for(int
i=1;i<=pathlen;i
++)
if(b->lp)
code[pathlen]=0;
Allcode(b-
>lp,code,pathlen);
if(b->rp)
code[pathlen]=1;
Allcode(b-
>rp,code,pathlen)
;
b-
>code.Push_ba
ck(code[i]);
Y
N
for循环
if
else
得到哈夫曼编
码
向左为0,递
归扫描左子树
向右为1,递
归扫描右子树
○
4
哈夫曼译码流程图:
剩余35页未读,继续阅读
资源评论
温柔-的-女汉子
- 粉丝: 1029
- 资源: 4014
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功