《哈夫曼编码译码器(附源码).pptx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器(附源码).pptx(22页珍藏版)》请在金锄头文库上搜索。
1、建立 Huffman 树进行编码和译码的设计 郝萌 1100300423 哈尔滨工业大学计算机科学与技术学院 1003104 班 摘要:建立一个简易的系统,对于给定的一篇英文文章,统计字符出 现的概率,并根据概率建立 Huffman 树,利用 Huffman 编码 对文章进行编码和译码。掌握 Huffman 树的建立与应用,并进 一步熟练掌握程序的设计流程。 关键词:Huffman 树Huffman 编码 文章译码 文件压缩解压缩 引言: 给定一篇文章,统计字符出现的概率,根据概率建立哈夫曼树, 进行编码与译码和文件压缩、解压缩等操作。并进行哈夫曼编码,进 而可以利用哈夫曼编码对文章 程序设计
2、流程 (1)文字表述 开始进入功能选择界面,包含五种操作:1.读取文章并对字符编 码,2.哈夫曼编码信息,3.文章编码,4.文章译码,5.文件压缩,6.文 件解压缩,7.退出程序。操作 1:给定一篇文章,统计字符出现的概 率,并根据概率建立 Huffman 树,并利用 Huffman 树对字符进行 Huffman 编码。操作 2:显示 Huffman 编码信息,包括字符,字符出 现的概率,Huffman 编码。操作 3:对文章进行译码,显示译码信息, 并保存。操作 4:对文章进行译码,显示并保存。操作 5:对文件进 行压缩,每 7 位二进制序列对应一个 ASCII 码。操作 6:对文件进行 解
3、压缩。 (2)流程图,1,程序开始,程序主界面,读取文章并对字符 编码,哈夫曼编码信息,文章编码,文章译码,退出程序,显示文章编码,保存文章编码,返回上一界面,显示文章编码的译 码,保存文章编码的译 码,程序结束,文件压缩,文件解压缩,(3)程序数据要求及功能实现 主界面,2,1.读取文件并对字符进行编码,2.哈夫曼编码信息,3,3.文件编码,(1)显示文件编码,4,(2)保存文件编码,4.文件译码,5,(1)显示文章编码的译码,(2)保存文章编码的译码,5.文件压缩,6.文件解压缩,6,附:程序源代码 /* File:HUFFMANFUNCTION.h Author: Administrat
4、or * Created on 2011 年 12 月 19 日, 下午 6:19 */ #ifndef HUFFMANFUNCTION_H #defineHUFFMANFUNCTION_H #include #include #include #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 par
5、ent; /父亲 Htnote() ,7,8,weight = 0; lchild = -1; parent = -1; rchild = -1; ; class Name public: int num; /字符出现的次数 char pname; /字符名 double lweight; /权值 Name() num = 0; lweight = 0; ; class GetName public: char namefmax2; int n; /字符的种类 int sum; /字符的总数 Name lettermax1; /存储字符信息的类的数组 GetName() sum = 0; n
6、= 0; void GetWeight()/得到字符的权值 for (int i = 0; i namef; input.open(namef); /打开文件 if (input.fail() cout 该文件不存在! endl; return 0; char ch; ch = input.get(); letter0.pname = ch;,9,letter0.num+; sum+; while (!input.eof() /读取文件中的所有字符 int tag = 0; ch = input.get(); for (int i = 0; i n + 1; i+) if (letteri.p
7、name = ch) letteri.num+; sum+; tag = 1; if (tag = 0) n+; lettern.pname = ch; lettern.num+; sum+; sum-; input.close(); GetWeight(); /得到字符权值 ; class CodeNode/编码类 public: char ch; /存储字符 char bitsmax1; /存储编码 ; class Function public: GetName L; int fn; /定义哈夫曼数组大小 Htnote HuffmanTmax3; /哈夫曼数组 CodeNode Code
8、max1; /字符编码数组 Function() fn = 0; void CharHuffmanTCoding()/编码功能实现 int i, f, c; char cdL.n + 1; /暂时存储编码的数组 int start; /编码读取起始位置,10,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, void SelectMin(int m, int double m1
9、, m2; m1 = m2 = 1; p1 = p2 = -1; for (i = 0; i m; i+) if (HuffmanTi.parent = -1 ,12,for (int i = 0; i namef1; output.open(namef1); char ch; while (!input.eof() ch = input.get(); for (int i = 0; i namef; input.open(namef); if (input.fail() cout 该文件不存在! endl;,13,return 0; char ch; ch = input.get(); in
10、t c = 2 * L.n - 2; while (!input.eof() if (ch = 0)/遇 0 搜索左子树 if (HuffmanTc.lchild = 0) c = HuffmanTc.lchild; if (HuffmanTc.lchild = -1)/判断是否到叶子 cout = 0) c = HuffmanTc.rchild; if (HuffmanTc.rchild = -1)/判断是否到叶子 cout namef; input.open(namef); if (input.fail() cout 该文件不存在! endl; return 0;,14, cout nam
11、ef1; output.open(namef1); char ch; ch = input.get(); int c = 2 * L.n - 2; while (!input.eof() if (ch = 0) if (HuffmanTc.lchild = 0) c = HuffmanTc.lchild; if (HuffmanTc.lchild = -1) output.put(HuffmanTc.name); c = 2 * L.n - 2; if (ch = 1) if (HuffmanTc.rchild = 0) c = HuffmanTc.rchild; if (HuffmanTc.
12、rchild = -1) output.put(HuffmanTc.name); c = 2 * L.n - 2; ch = input.get(); input.close(); output.close(); cout 保存完毕! endl; int FileCompression() /文件压缩功能 CreatHT(); CharHuffmanTCoding(); /保存编码 ofstream output; ifstream input; char namef1 = temp.txt; input.open(L.namef); if (input.fail() cout 该文件不存在!
13、 endl; return 0; ,15,output.open(namef1); char ch; while (!input.eof() ch = input.get(); for (int i = 0; i namef2; File1.open(namef2); File2.open(namef1); if (File2.fail() cout 该文件不存在! endl; return 0; char sh; char th; int i = 0; char j = 0; int count = 0; while (!File2.eof() sh = File2.get(); if (i
14、 7 ,16,File1.put(th); i = 0; count = 0; if (sh = EOF) th = count; File1.put(th); File1.put(j); i = 0; count = 0; File1.close(); File2.close(); remove(namef1); cout namef2; input.open(namef2, ios:in | ios:binary); output.open(namef1, ios:out | ios:binary); if (input.fail() cout (,17,count = sh; if (c
15、h != EOF) for (int i = 0; i ( ,18,( c = 2 * L.n - 2; if (ch = 1) if (HuffmanTc.rchild = 0) c = HuffmanTc.rchild; if (HuffmanTc.rchild = -1) cout (HuffmanTc.name); c = 2 * L.n - 2; ,File2.read(reinterpret_cast (,19,能选择=,while (1) /主界面显示 cout endl endl endl; cout =功 endl;,【1】读取文章并对字符编码 endl;,【2】哈夫曼编码信息 【3】文章编码 【4】文章译码 【5】压缩文件 【6】解压缩文件 【7】退出程序, endl; endl; endl; endl; endl; endl;,cout cout cout cout cout cout cout cout, endl ,= endl;