哈夫曼编码与译码附源码

上传人:夏** 文档编号:470352474 上传时间:2022-11-26 格式:DOC 页数:23 大小:556.50KB
返回 下载 相关 举报
哈夫曼编码与译码附源码_第1页
第1页 / 共23页
哈夫曼编码与译码附源码_第2页
第2页 / 共23页
哈夫曼编码与译码附源码_第3页
第3页 / 共23页
哈夫曼编码与译码附源码_第4页
第4页 / 共23页
哈夫曼编码与译码附源码_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《哈夫曼编码与译码附源码》由会员分享,可在线阅读,更多相关《哈夫曼编码与译码附源码(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:对文件进行解压缩。(2) 流程图 (3) 程序数据要求及功能实现 主界面1.读取文件

3、并对字符进行编码2.哈夫曼编码信息3.文件编码(1) 显示文件编码 (2) 保存文件编码 4.文件译码(1) 显示文章编码的译码 (2) 保存文章编码的译码 5. 文件压缩 6. 文件解压缩附:程序源代码 /* * File: HUFFMANFUNCTION.h * Author: Administrator * * Created on 2011年12月19日, 下午6:19 */#ifndef HUFFMANFUNCTION_H#defineHUFFMANFUNCTION_H#include #include#include#include#define max1 150#define m

4、ax2 50#define max3 256using 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

5、weight = 0; ;class GetName public: char namefmax2; int n; /字符的种类 int sum; /字符的总数 Name lettermax1; /存储字符信息的类的数组 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 请输入文件名: namef;

6、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+;

7、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 Codemax1; /字符编码数组 Function() fn = 0; void CharHuffmanTCoding()/编码

8、功能实现 int i, f, c; char cdL.n + 1; /暂时存储编码的数组 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); /将结果存入对应的编码数组中 void OutputHuffmanTCode() cout 哈夫曼编码: endl; cout endl; cout 字符t权值tt哈夫曼编码

9、endl; for (int i = 0; i L.n; i+)/输出字符,权值,哈夫曼编码 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; double m1, m2; m1 = m2 = 1; p1 = p2 = -1; for (i = 0; i m; i+) if (HuffmanTi.parent = -1 & HuffmanTi.we

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号