2022年2022年哈夫曼编码与译码 .pdf
《2022年2022年哈夫曼编码与译码 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年哈夫曼编码与译码 .pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、建立 Huffman 树进行编码和译码的设计郝萌 1100300423 哈尔滨工业大学计算机科学与技术学院 1003104 班摘要:建立一个简易的系统,对于给定的一篇英文文章,统计字符出现的概率,并根据概率建立Huffman 树,利用 Huffman 编码对文章进行编码和译码。掌握 Huffman 树的建立与应用,并进一步熟练掌握程序的设计流程。关键词:Huffman 树Huffman 编码 文章译码文件压缩解压缩1.引言:给定一篇文章,统计字符出现的概率,根据概率建立哈夫曼树,并进行哈夫曼编码,进而可以利用哈夫曼编码对文章进行编码与译码和文件压缩、解压缩等操作。2.程序设计流程(1)文字表述
2、开始进入功能选择界面,包含五种操作:1.读取文章并对字符编码,2.哈夫曼编码信息,3.文章编码,4.文章译码,5.文件压缩,6.文件解压缩,7.退出程序。操作1:给定一篇文章,统计字符出现的概率,并根据概率建立Huffman 树,并利用Huffman 树对字符进行Huffman 编码。操作 2:显示 Huffman 编码信息,包括字符,字符出现的概率,Huffman 编码。操作 3:对文章进行译码,显示译码信息,并保存。操作4:对文章进行译码,显示并保存。操作5:对文件进行压缩,每 7 位二进制序列对应一个ASCII 码。操作 6:对文件进行名师资料总结-精品资料欢迎下载-名师精心整理-第 1
3、 页,共 23 页 -解压缩。(2)流程图程序开始程序主界面读取文章并对字符编码哈夫曼编码信息文章编码文章译码退出程序显示文章编码保存文章编码返回上一界面显示文章编码的译码保存文章编码的译码程序结束文件压缩文件解压缩名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 23 页 -(3)程序数据要求及功能实现主界面1.读取文件并对字符进行编码2.哈夫曼编码信息名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 23 页 -3.文件编码名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 23 页 -(1)显示文件编码(2)保存文件编码4.文件译码名师资料总结-精品资料
4、欢迎下载-名师精心整理-第 5 页,共 23 页 -(1)显示文章编码的译码(2)保存文章编码的译码5.文件压缩名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 23 页 -6.文件解压缩附:程序源代码/*File:HUFFMANFUNCTION.h*Author:Administrator*Created on 2011 年 12 月 19 日,下午 6:19*/#ifndef HUFFMANFUNCTION_H#define HUFFMANFUNCTION_H 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 23 页 -#include#include#inclu
5、de#include#define max1 150#define max2 50#define max3 256 using namespace std;class Htnote public:char name;/字符名double weight;/权重int lchild;/左孩子int rchild;/右孩子int parent;/父亲Htnote()weight=0;lchild=-1;parent=-1;rchild=-1;class Name public:int num;/字符出现的次数char pname;/字符名double lweight;/权值Name()num=0;l
6、weight=0;class GetName public:char namefmax2;int n;/字符的种类int sum;/字符的总数Name lettermax1;/存储字符信息的类的数组名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 23 页 -GetName()sum=0;n=0;void GetWeight()/得到字符的权值 for(int i=0;i n;i+)letteri.lweight=(double)letteri.num/sum;/出现的次数除总数得到权值 int ReadLetter()ifstream input;cout 请输入文件名:name
7、f;input.open(namef);/打开文件if(input.fail()cout 该文件不存在!endl;return 0;char ch;ch=input.get();letter0.pname=ch;letter0.num+;sum+;while(!input.eof()/读取文件中的所有字符int tag=0;ch=input.get();for(int i=0;i n+1;i+)if(letteri.pname=ch)letteri.num+;sum+;tag=1;if(tag=0)n+;lettern.pname=ch;lettern.num+;sum+;sum-;名师资料总
8、结-精品资料欢迎下载-名师精心整理-第 9 页,共 23 页 -input.close();GetWeight();/得到字符权值;class CodeNode/编码类 public:char ch;/存储字符char bitsmax1;/存储编码;class Function public:GetName L;int fn;/定义哈夫曼数组大小Htnote HuffmanTmax3;/哈夫曼数组CodeNode Codemax1;/字符编码数组Function()fn=0;void CharHuffmanTCoding()/编码功能实现 int i,f,c;char cdL.n+1;/暂时存
9、储编码的数组int start;/编码读取起始位置cdL.n=0;for(i=0;i=0)if(HuffmanTf.lchild=c)/如果为左孩子,为0 cd-start=0;else/如果为右孩子,为1 cd-start=1;c=f;strcpy(Codei.bits,&cdstart);/将结果存入对应的编码数组中名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 23 页 -void OutputHuffmanTCode()cout 哈夫曼编码:endl;cout endl;cout 字符 t 权值 tt 哈夫曼编码 endl;for(int i=0;i L.n;i+)/输
10、出字符,权值,哈夫曼编码 cout endl;cout HuffmanTi.name t HuffmanTi.weight t;cout Codei.bits;cout endl;cout endl;void InitHT()/哈夫曼初始化 L.ReadLetter();fn=(L.n)*2-1;for(int i=0;i fn;i+)if(i L.n)HuffmanTi.name=L.letteri.pname;HuffmanTi.weight=L.letteri.lweight;void SelectMin(int m,int&p1,int&p2)/选择最小的两个节点 int i,j;do
11、uble m1,m2;m1=m2=1;p1=p2=-1;for(i=0;i m;i+)if(HuffmanTi.parent=-1&HuffmanTi.weight m1)/找出为访问过的最小权值节点 m2=m1;p2=p1;m1=HuffmanTi.weight;p1=i;else if(HuffmanTi.parent=-1&HuffmanTi.weight m2)/找出为访问的名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 23 页 -权值第二小结点 m2=HuffmanTi.weight;p2=i;void CreatHT()/建立哈夫曼树 int i,p1,p2;In
12、itHT();for(i=L.n;i fn;i+)SelectMin(i,p1,p2);HuffmanTp1.parent=HuffmanTp2.parent=i;HuffmanTi.lchild=p1;HuffmanTi.rchild=p2;HuffmanTi.weight=HuffmanTp1.weight+HuffmanTp2.weight;int OutArticleCode()/显示文章编码/文章编码操作ifstream input;input.open(L.namef);if(input.fail()cout 文件不存在!endl;return 0;char ch;cout 文章编
13、码如下:endl;while(!input.eof()ch=input.get();for(int i=0;i L.n;i+)if(Codei.ch=ch)cout Codei.bits;cout endl;input.close();int SaveArticleCode()/保存文章编码名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 23 页 -ofstream output;ifstream input;char namef1max2;input.open(L.namef);if(input.fail()cout 该文件不存在!endl;return 0;cout 请输入
14、保存文章编码的文件名:namef1;output.open(namef1);char ch;while(!input.eof()ch=input.get();for(int i=0;i L.n;i+)if(Codei.ch=ch)for(int j=0;j strlen(Codei.bits);j+)output.put(Codei.bitsj);input.close();output.close();cout 保存完毕!endl;int OutTransCode()/文章译码操作ifstream input;char namefmax2;cout 请输入保存文章编码的文件名:namef;i
15、nput.open(namef);if(input.fail()cout 该文件不存在!=0)c=HuffmanTc.lchild;if(HuffmanTc.lchild=-1)/判断是否到叶子 cout=0)c=HuffmanTc.rchild;if(HuffmanTc.rchild=-1)/判断是否到叶子 cout HuffmanTc.name;/输出字符c=2*L.n-2;/返回根节点 ch=input.get();cout endl;input.close();int SaveTransCode()/保存文章译码ofstream output;ifstream input;char n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年哈夫曼编码与译码 2022 年哈夫曼 编码 译码
限制150内