哈夫曼编码课程设计报告

合集下载

哈夫曼编码设计报告

哈夫曼编码设计报告

哈夫曼编码综合设计报告LD摘要 (I)Abstract (II)第一章课题背景 (1)1.1 课题背景 (1)1.2 课题内容 (1)第二章设计简介及设计方案论述 (2)2.1 设计简介 (2)2.2 问题分析 (2)2.3 设计方案 (3)第三章详细设计 (4)3.1 主要流程图 (4)3.2 主要类及函数介绍 (7)第四章设计结果及分析 (8)4.1 设计结果 (8)总结 (11)致谢 (12)参考文献 (13)附录主要程序代码 (14)数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

建立在数据结构的基础上,利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

综合设计的任务是:设计一个哈夫曼编码/译码系统,使学生掌握哈夫曼编码的特点、存储方法和基本原理,培养学生利用C++语言编写程序以及调试程序的能力,运用数据结构知识解决实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。

程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成需要自己平时积累的大量知识、并且需要勤于思考的能力和无限的激情。

本次课设主要是学习程序设计的方法,进行程序设计的基本训练,巩固基础知识,通过思考,和大量的阅读,来构造一个完整的程序。

关键词:数据结构;哈夫曼编码/译码;程序设计AbstractData structure as a major research subject of various logical structure of data and storage structure, and various operations on the data.Therefore, there are three main aspects: the logical structure of data; the data of the physical storage structure; operations on data (or algorithm).Typically, the algorithm design depends on the logical data structure, algorithm implementation depends on the data of the physical storage structure.A data structure of information organization, its purpose is to improve the efficiency of the algorithm, it is usually set with a set of algorithms corresponding to this set of algorithms through the collection of data structures can be some kind of data operation.Established on the basis of the data structure, the use of Huffman coding can greatly improve the communication channel utilization, reduce transmission time information, reducing transmission costs.Integrated design of the task: design a Huffman encoding / decoding system that allows students to master the characteristics of Huffman coding, storage methods and basic principles, students write programs using C language and ability to debug programs using the data structure of knowledgethe ability to solve practical problems for the computer professional courses of study follow-up and lay a solid foundation.Program design is to exercise our practical ability, to a certain extent, but also increase our knowledge of all aspects, especially in some of the curriculum with practice, it needs to complete a large number of accumulated knowledge of their usual and need to be diligentability to think and passion.The main lesson is to learn programming based methods, the basic training program designed to consolidate basic knowledge, through thinking, and a lot of reading, to construct a complete program.Keywords:Data structure; Huffman encoding / decoding; Programming第一章课题背景1.1课题背景《数据结构》在计算机科学中是一门核心专业基础课,在整个计算机课程体系中处于承上启下的核心地位,它一方面扩展和深化在离散数学、程序设计语言等课程学到的基本技术和方法,一方面为进一步学习其它专业课奠定坚实的理论与实践基础。

数据结构课程设计总结报告 哈夫曼编码译码

数据结构课程设计总结报告 哈夫曼编码译码

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。

2 问题分析.................................................................错误!未定义书签。

3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

哈夫曼编译码课程设计报告

哈夫曼编译码课程设计报告
见附录
四、参考文献
1.数据结构(C 语言版) 147 页——赫夫曼树和赫夫曼树编码的存 储表示,及求赫夫曼编码的算法 2.C 语言设计(第三版) 371 页—377 页 附录 E C 库函数——用 于程序的开始 3.网络——赫夫曼译码
五、附录
程序清单 :
Honor Code : #include <stdio.h> #include <stdlib.h> #include <string.h> //--------哈夫曼树和哈夫曼编码的储存表示-------typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组储存哈夫曼树 typedef char ** HuffmanCode; //动态分配数组储存哈夫曼编码表
7
//-------------在 HT[1..n]中选择 parent 为 0 的且 weight 最小的两个节点 s1 和 s2--------void Select(HuffmanTree HT,int n,int & s1,int &s2){ for(int i=1;i<=n;i++) //任取两个 parent 为 0 的 节点赋值给 s1 和 s2 if(!HT[i].parent){ s1=i; break; } for(i++;i<=n;i++) if(!HT[i].parent){ s2=i; break; } if(HT[s1].weight-HT[s2].weight){ int temp; temp=s1; s1=s2; s2=temp; } for(i=1;i<=n;i++) //对数组进行遍历,寻找最小的两个节点 if(!HT[i].parent){ if(HT[i].weight<HT[s1].weight){ s2=s1; s1=i;} else if(HT[i].weight<HT[s2].weight&&i!=s1) s2=i; } } //---------w 存放 n 个字符的权值(均>0),构造哈夫曼树 HT,并求出 n 个字 符的哈夫曼编码 HC---------void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ if(n<=1) return; int s1,s2,i,num=2*n-1; HuffmanTree p; HT=(HuffmanTree)malloc((num+1)*sizeof(HTNode)); //0 号单元未用 for(p=HT+1,i=1;i<=n;i++,p++,w++) {//对静态链表初赋值 p->weight=*w; p->lchild=NULL; p->parent=NULL; p->rchild=NULL; } for(;i<=num;p++,i++){ p->weight=0; p->lchild=NULL; p->parent=NULL; p->rchild=NULL; } for(i=n+1;i<=num;i++){ // 建立哈夫曼树 Select(HT,i-1,s1,s2); //选择两个权值最小的节点 HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1;

哈夫曼编译码器课程设计报告(完整版)

哈夫曼编译码器课程设计报告(完整版)

XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx 姓名xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。

对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(4)T:打印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年 6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

课程设计报告哈夫曼编码

课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专计算机科学与技术业班级姓名指导教师20 0 010 年7 月2 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目:哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1) 1:初始化(Initialization )。

对输入的一段央文中的每个字符统计其权值,建立哈夫曼树;(2) E:编码(Encoding )。

利用已建好的哈夫曼树,对每个字符进行编码。

(3) D:译码(Decoding )。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4) P:印代码文件(Print )。

将每个字符编的哈夫曼码和译码结果显示在终端上。

测试用例见题集p149。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第18周(6月28日至7月2日)完成。

2、7月2日08 : 30到计算中心检查程序、交课程设计报告、源程序( CD盘)。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目 (1)2问题描述 (1)3.1数据结构设计 (1)3.2主要算法设计 (3)3.3测试用例设计 (6)4调试报告 (7)5结束语 (7)六、课程设计参考资料 (8)附录 (9)F1源代码 (9)F2运行结果 (16)哈夫曼编码1设计题目哈夫曼编码2问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告第一部分:引言1. 关于哈夫曼编码的程序设计报告在现代社会中,信息的传输和存储已经成为了我们生活中不可或缺的一部分。

在数字化时代,我们经常需要对数据进行编码和解码,以便有效地传输和存储信息。

而哈夫曼编码作为一种有效的数据压缩方式,被广泛应用于通信、计算机科学和信息处理领域。

在本篇文章中,我将从程序设计的角度进行深入探讨哈夫曼编码的原理、实现和应用。

我将带领你一起了解哈夫曼编码的本质,探讨其在实际应用中的价值,以及我个人对于哈夫曼编码的理解和观点。

第二部分:哈夫曼编码的原理与实现2. 原理概述哈夫曼编码是一种变长编码方式,通过统计文本中字符出现的频率,构建一颗最优二叉树,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示,从而实现了对数据的高效压缩和解压缩。

3. 算法流程哈夫曼编码的算法流程主要包括构建哈夫曼树、生成编码表和进行编码解码三个步骤。

在构建哈夫曼树时,需要通过优先队列或堆来实现最小频率字符的选择和合并,然后生成编码表,最后进行编码和解码操作。

4. 实现技巧在实际的程序设计中,优化哈夫曼编码的实现是非常重要的。

例如采用树结构、位操作以及内存管理等技巧可以有效提高哈夫曼编码的性能和效率。

第三部分:哈夫曼编码的应用5. 通信领域在通信领域中,哈夫曼编码被广泛应用于数据传输和网络通信中。

通过哈夫曼编码可以实现对数据的高效压缩,从而节省带宽和传输成本。

6. 储存领域在储存领域中,哈夫曼编码也能够帮助我们实现对数据的高效压缩和解压缩,节省存储空间并提高储存效率。

特别是在大数据和云计算时代,哈夫曼编码的应用更是显得尤为重要。

第四部分:个人观点与理解7. 我的观点在我看来,哈夫曼编码作为一种高效的数据压缩算法,为我们在通信、计算机科学和信息处理领域带来了极大的便利。

它不仅可以帮助我们节省带宽和存储空间,还能够提高数据传输和存储的效率。

8. 我的理解通过对哈夫曼编码的深入学习和探讨,我不仅对其原理和实现有了更深入的理解,也对其在实际应用中的潜力和价值有了更深刻的认识。

huffman哈夫曼树编码译码课程设计报告

huffman哈夫曼树编码译码课程设计报告

数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

【基本要求】1)初始化。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。

2)编码。

利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。

3)译码。

利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。

4)输出编码。

将编码结果显示在终端上,每行50个代码。

5)输出哈夫曼树。

将哈夫曼树以直观的方式(树或凹入表形式)显示出来。

【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。

参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。

23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

课程设计报告一.需求分析1、一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件中。

(5)T:印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

2、利用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

3、用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quito。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

4、在程序的一次执行过程中,第一次执行I,D或C命令之后,哈夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

二、概要设计1、部分函数1)树与编码类型struct HTNode2)选两个最小的树组成二叉树Void Select(HNode *HT,int I,int &s1,int &s2)3)初始化哈夫曼树void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n)4)输出哈夫曼树void TreePrint(HTNode *HT,int n)5) 输出哈夫曼编码void CodePrint(HuffmanCode *HC,int n)2、主函数void main(){初始化;Switch(){ }end;}3、模块之间的调用关系三、详细设计1、树的结构体的建立struct HTNode{int weight,parent,lchild,rchild;char zifu;};struct HuffmanCode{char *code;char zifu;int size;};2、部分编码void Select(HTNode *HT,int i,int &s1,int &s2) {int k;for(k=1;k<=i;k++){if(HT[k].parent==0){s1=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){s2=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){if(HT[k].weight<HT[s1].weight){if(HT[k].weight<HT[s2].weight){if(HT[s2].weight<HT[s1].weight){s1=s2;s2=k;}else{s2=k;}}else{s1=s2;s2=k;}}else if(HT[k].weight<HT[s2].weight){s2=k;}}}}void HuffmanCoding(HTNode *&HT,HuffmanCode *&HC,char *x,int *w,int n) {if(n<=1)return;int m=2*n-1,i,s1,s2;HTNode *p;HT=(HTNode *)malloc((m+1)*sizeof(HTNode));for(p=HT+1,i=1;i<=n;i++,p++,w++,x++)p->weight=*w,p->parent=0,p->lchild=0,p->rchild=0,p->zifu=*x;for(;i<=m;i++,p++)p->weight=0,p->parent=0,p->lchild=0,p->rchild=0,p->zifu='N';for(i=n+1;i<=m;i++){Select(HT,i-1,s1,s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}char *CD;int k,j;CD=(char *)malloc(n*sizeof(char));for(i=1;i<=n;i++){j=i;k=0;while(HT[j].parent!=0){if(HT[HT[j].parent].lchild==j)CD[k]='0';elseCD[k]='1';k++;j=HT[j].parent;}HC[i-1].code=(char *)malloc((k+1)*sizeof(char));HC[i-1].code[k]='\0';k--;int m=k;HC[i-1].size=m;for(int l=0;l<=m;l++){HC[i-1].code[l]=CD[k];k--;}HC[i-1].zifu=HT[i].zifu;}free(CD);}int Strsize(char *d){int i=0;while(*d!='\0'){d++;i++;}return i;}char* Bianma(HuffmanCode *&HC,char *d) {//哈夫曼树编码int n=Strsize(d),i,k,j,sum=0;char *a;a=(char *)malloc((10*n)*sizeof(char));for(i=0;i<n;i++){k=0;while(*d!=HC[k].zifu){k++;}j=0;while(HC[k].code[j]!='\0'){a[sum]=HC[k].code[j];j++;sum++;}d++;}a[sum]='\0';return a;}void Yima(HTNode *HT,char *&a,char *b,int n){int k=2*n-1,i=0;int m=k;while(*b!='\0'){if(*b=='0'){if(HT[HT[m].lchild].lchild==0){a[i]=HT[HT[m].lchild].zifu;i++;b++;m=k;}else{m=HT[m].lchild;b++;}}else{if(HT[HT[m].rchild].lchild==0){a[i]=HT[HT[m].rchild].zifu;i++;b++;m=k;}else{m=HT[m].rchild;b++;}}}a[i]='\0';}void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n) {//初始化哈夫曼树printf("输入字符集大小n\n");scanf("%d",&n);fflush(stdin);w=(int *)malloc(n*sizeof(int));x=(char *)malloc(n*sizeof(char));for(int i=0;i<n;i++){printf("输入第%d个字符和权值:\n",i+1);scanf("%c %d",&x[i],&w[i]);fflush(stdin);}HC=(HuffmanCode *)malloc(n*sizeof(HuffmanCode));HuffmanCoding(HT,HC,x,w,n);}void TreePrint(HTNode *HT,int n){//输出哈夫曼树for(int i=1;i<(2*n);i++)printf("%c %d %d %d %d\n",HT[i].zifu,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); }void CodePrint(HuffmanCode *HC,int n){//输出哈夫曼编码for(int i=0;i<n;i++){printf("%c ",HC[i].zifu);puts(HC[i].code);}}3、主程序void main(){HTNode *HT;HuffmanCode *HC;int n,*w;char *x,*y,Z;char *a,*b;a=(char *)malloc(100*sizeof(char));b=(char *)malloc(100*sizeof(char));start:printf("初始化i,编码e,译码d,印哈夫曼码p,印哈夫曼树t,退出q。

哈夫曼树编码课程设计实验报告

哈夫曼树编码课程设计实验报告

四、综合设计(课程设计)摘要:在这次课程设计中,所进行的实验是:哈夫曼编码和编译器。

对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。

在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。

建立的haftree用图形化表示出来。

在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。

在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。

从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。

在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。

在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。

关键词:编译器;频度;译码五、综合设计(课程设计)Abstract:In this design, the experiment was : Huffman coding and compiler. The Huffman tree to establish, by the node weights to establish a minimum of two fork tree, Huffman tree haftree, and by the Huffman tree coding, and every node coding. By the Huffman tree, enter a binary message, can output the set up by the Huffman tree nodes. Establishment of haftree graphical representation. In the implementation of the code, the realization form, function perfect, Huffman tree is established, Huffman coding tree, encountered a lot of problems, an array of haftree objects allocated space, node attributes are difficult. Throughout the process, using the C# language, the application package, an array of strings in the spatial distribution, calculated for each weight of characters, using sizeOf to retrieve the entire string, calculating the weight of characters, establish character appearance frequency of form, form the basis of each character frequency established Huffman tree. Starting from the root node to retrieve each node around children, if children left traverse left, path 0, then left the child as the root node; if it is right child, traversing the right path for children, 1 children for the root node, then the right. In the new method described above, until all of the node traversal finished, each node is determined after the output coding.In the decoding process, by the input binary message, according to the established Huffman tree, if it is 0 the left, if it is 1, go right, until the left and right child node is empty, the output to the node information, in the back of the root node to traverse behind a binary message, until all message traversal finished so far, the output from all the message decoding of information.Keywords:compiler;frequency;decoding目录摘要 ................................................................................. 错误!未定义书签。

数据结构课程设计报告 哈弗曼编码

数据结构课程设计报告 哈弗曼编码

数据结构课程设计院系:班级:组别:指导教师:摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

目录一.设计目的数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

哈夫曼编码课程设计报告

哈夫曼编码课程设计报告

哈夫曼编码课程设计报告数据结构课程设计报告课题: 专业班级:学号:姓名:指导教师:1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0〞码,指向右子树的分支表示“1〞码,取每条路径上的“0〞或“1〞的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

12.需求分析课题:哈夫曼编码译码器系统问题描述:翻开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。

问题补充:1. 从硬盘的一个文件里读出一段英语文章;2. 统计这篇文章中的每个字符出现的次数;3. 以字符出现字数作为权值,构建哈夫曼树4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。

具体介绍:在本课题中,我们在硬盘D盘中预先建立一个file.txt文档,在里面编辑一篇文章(大写)。

然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。

然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。

测试数据:例如从文本中读到文章为:IAMASTUDENT。

那么效果如下:读出文本为:IAMASTUDENT字符A次数:2 字符D次数:1 字符E次数:1 字符I 次数:1 字符M次数:1 字符N 次数:1 字符S 次数:1 字符T次数:2 字符U次数:1输出编码:000 101 001 101 011 110 100 1110 1111 010 110Press any key to continue233 系统〔工程〕设计(1)设计思路及方案本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。

哈夫曼编译码器课程设计报告(完整版)

哈夫曼编译码器课程设计报告(完整版)

XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx xxx主要容、基本要求、主要参考资料等:1. 主要容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。

对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(4)T:打印哈夫曼树(Tree Printing)。

将已在存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年 6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

哈夫曼编码毕业课程设计报告

哈夫曼编码毕业课程设计报告

数据结构课程设计报告基于哈夫曼树的文件压缩/解压程序专业班级:信科(2)班姓名:徐爱娟谢静学号:5150_31一需求分析1.课题要求(实现文件的压缩与解压并计算压缩率)A.描述压缩基本符号的选择方法B.运行时压缩原文件的规模应不小于5K2.设计目标A软件名称:基于哈夫曼编码的文件压缩实用程序系统B软件组成:huffman.exeC制作平台及相关调试工具:Windows XP sp3 Microsoft Visual C++ 6.0D运行环境:dos/ win2K/win2003/winxp/E性能特点:1.软件由一个可执行文件组成huffman.exe为dos系统应用程序,体积小,高效快捷,适用范围广。

2. 对单字节(256叶子)进行哈夫曼编码,压缩率良好3. 使用二级缓冲压缩/解压技术,速度比一般算法高4. 可压缩最大体积为4G的文件,达到Fat32文件系统极限5. 文件索引体积比常规算法小50%二概要设计1.相关函数介绍1. bool InitFromFile(string fileadd) 从文件中初始化哈夫曼树函数2. void HTCreat(HTNode ht[],int n) 构造哈夫曼树函数3. void HCCreat(HTNode ht[],HCode hcd[],int n) 构造哈夫曼编码函数4. void ConvertFile(HCode hcd[],string fileadd,string fileadd2) 压缩and写入文件函数5. void DecompressionFile(string fileadd2,string fileadd3) 文件解压函数6. string Compression(string fileadd) 压缩函数7. string Decompression(string fileadd2) 解压函数三详细设计1压缩算法部分A核心算法:Huffman编码是一种可变长编码方式,是由美国数学家David Huffman创立的,是二叉树的一种特殊转化形式。

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX6 月 21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级 xxx学号 xxx 姓名 xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

要求在发送端经过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。

对于双工信道(既能够双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(4)T:打印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限: 6月21 日指导教师签名:课程负责人签名:6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

数据结构_课程设计报告(哈夫曼编码)

数据结构_课程设计报告(哈夫曼编码)

(原创)数据结构课程设计报告学院:计算机科学与工程专业:计算机科学与技术班级:09级班学号:姓名:指导老师:时间: 2010年12月一、课程设计题目:1、哈夫曼编码的实现2、城市辖区地铁线路设计3、综合排序算法的比较二、小组成员:三、题目要求:1.哈夫曼编码的实现(1)打开若干篇英文文章,统计该文章中每个字符出现的次数,进一步统一各字符出现的概率。

(2)针对上述统计结果,对各字符实现哈夫曼编码(3)对任意文章,用哈夫曼编码对其进行编码(4)对任意文章,对收到的电文进行解码2.某城市要在其各个辖区之间修建地铁来加快经济发展,但由于建设地铁的费用昂贵,因此需要合理安排地铁的建设路线。

(1)从包含各辖区的地图文件中读取辖区的名称和各辖区的直接距离(2)根据上述读入的信息,给出一种铺设地铁线路的解决方案。

使乘客可以沿地铁到达各个辖区,并使总的建设费用最小。

(3)输出应该建设的地铁路线及所需要建设的总里程信息。

3.综合排序算法的比较各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概的执行时间。

试通过随机的数据比较各算法的关键字比较次数和关键字移动的次数。

(1)对以下各种常用的内部排序算法进行比较:直接插入排序,折半插入排序,二路归并排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序,基数排序。

(2)待排序的表长不少于100,要求采用随机数。

(3)至少要用5组不同的输入数据做比较:比较的次数为有关键字参加的比较次数和关键字移动的次数(4)改变数据量的大小,观察统计数据的变化情况。

(5)对试验统计数据进行分析。

对各类排序算法进行综合评价。

四、项目安排:1、小组内分工合作分工:xx负责哈夫曼编码的实现,zz负责城市辖区地铁线路设计,yy负责综合排序算法的比较。

合作:组内,组外进行交流,组长帮助解决组员的在项目过程中的困难,并控制进度。

五、完成自己的任务:任务:哈夫曼编码的实现1、思想实现流程图2、代码实现头文件define.h#ifndef _DEFINE_H_#define _DEFINE_H_#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define n 128typedef struct{int weight;int parent,lchild,rchild;}HuffmanTree; //哈夫曼树数据类型typedef struct{int ch;char codes[30];}coding; //哈夫曼编码数据存储typedef struct{int point;char codes[30]; //栈存}stack;extern void stat_file(HuffmanTree charer[256]); //统计字符频率extern void make_tree(HuffmanTree charer[256]); //构造哈夫曼树extern void make_code(HuffmanTree charer[256],coding inside[128]); //生成字符编码extern void article_code(coding inside[128]); //文章转码extern void decoding(HuffmanTree charer[256]); //文章解码#endif主函数:main.cpp#include "define.h"void main(){char choose;HuffmanTree charer[256];coding inside[128];printf("********************************************\n");printf(" 请选择\n");printf("*********** 1 刷新哈夫曼编码**********\n");printf("*********** 2 用统计频率编码**********\n");printf("*********** 3 任意文章编码**********\n");printf("*********** 4 任意文章解码**********\n");printf("*********** 0 退出本系统**********\n");printf("********************************************\n");do{fflush(stdin);scanf("%c",&choose); //暂时未加入未进行编码的判断switch(choose){case '1':memset(charer,0,256*sizeof(HuffmanTree));stat_file(charer);printf("请继续选择相应选项\n");break;case '2':make_tree(charer);memset(inside,0,128*sizeof(coding)); //先清空make_code(charer,inside);printf("请继续选择相应选项\n");break;case '3':article_code(inside);printf("请继续选择相应选项\n");break;case '4':decoding(charer); //如果只进行反编译,必须要输入相同的文章以建立哈夫曼树,printf("译码完毕!请打开根目录下的文件查看!\n"); //而之前翻译成代码时也要使用相同文章printf("请继续选择相应选项\n");break;case '0':MessageBox(NULL," 已退出系统!","提示",MB_OK);break;default: printf("对不起,您的操作错误,请重新输入编号!");}}while (choose!='0');}函数1:input_files.cpp#include "define.h"void stat_file(HuffmanTree charer[256]){FILE *fp;char choose;int i,looking;char path[30];loop: printf("请输入文件名:\n"); //设置循环点scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在\n");goto loop;}for(i=0;1;i++) // 对应字符的数组元素++{looking=fgetc(fp);if(looking==EOF)break;charer[looking].weight++;}fflush(stdin);printf("继续增加文件???(y/n)?\n");scanf("%c",&choose); //选择if(choose == 'y')goto loop; //返回循环点fclose(fp); //关闭文件}函数2:make_tree.cpp#include "define.h"void make_tree(HuffmanTree charer[256]) //建树函数{int i,min1,min2;int k,j;int flag1=0,flag2=0;void prnt(HuffmanTree charer[256]); //输出到文件中,以后改进时可以直接从文件读取for(i=0;i<n-1;i++) //两重多组的循环,算法不太好,比较的次数递增{for(k=0;k<n+i;k++)if( charer[k].parent == 0) //找出第一个叶子作为最小值{min1=charer[k].weight;flag1=k;break;}for(j=k;j<n+i;j++){if(min1==0) //考虑0的情况,减少循环break;if(charer[j].weight < min1 && charer[j].parent == 0) //否则进行比较{min1=charer[j].weight;flag1=j;}}for(k=0;k<n+i;k++)if( charer[k].parent == 0 && k!=flag1) //找第二个叶子作为次小值{min2=charer[k].weight;flag2=k;break;}for(j=k;j<n+i;j++){if(min2==0)break;if(charer[j].weight < min2 && charer[j].parent == 0 && j!=flag1){min2=charer[j].weight;flag2=j;}}charer[n+i].weight=charer[flag1].weight+charer[flag2].weight; //关键步骤:最小值和次小值的相加并构成子树charer[n+i].rchild=flag1;charer[n+i].lchild=flag2;charer[flag1].parent=n+i;charer[flag2].parent=n+i;}prnt(charer); //顺便输出到文件中}void prnt(HuffmanTree charer[256]){FILE *fp;char sn[20]={"哈夫曼树的如下:"};char xinxi[5][7]={"序号","权值","双亲","左孩子","右孩子"};fp = fopen("HuffmanTree.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2],xinxi[3],xinxi[4]);for(int i=0;i<255;i++)fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",i,charer[i].weight,charer[i].parent,charer[i].lc hild,charer[i].rchild);fclose(fp);MessageBox(NULL," 哈夫曼树写入文件成功!","提示",MB_OK);system("HuffmanTree.txt");}函数4:produce_code.cppvoid make_code(HuffmanTree charer[256],coding inside[128]) //从哈夫曼树中生成字符编码{stack push_pop;int k,j;void prn(coding inside[128]); //把编码输出到文件中,共128个for(int i=0;i<128;i++){memset(&push_pop,0,1*sizeof(stack)); //栈存inside[i].ch=i;for(k=i,j=0;1; ) //下面可控制循环退出{if(charer[k].parent!=0) //从下往上找到根节点{if(charer[charer[k].parent].lchild==k) // 子根节点的左孩子编0,右孩子编1push_pop.codes[push_pop.point++]='0'; //压栈// push_pop.point++; // 把++直接放入括号,减少代码量if(charer[charer[k].parent].rchild==k)push_pop.codes[push_pop.point++]='1';// push_pop.point++;j=k;k=charer[k].parent;}else{/* if(charer[charer[j].parent].lchild==j){push_pop.codes[push_pop.point++]='0';// push_pop.point++;}if(charer[charer[j].parent].rchild==j){push_pop.codes[push_pop.point++]='1';// push_pop.point++;}*/break;}}for(k=0,j=push_pop.point;k<push_pop.point;) //从栈顶回取,所得编码存入所设数组inside[i].codes[k++]=push_pop.codes[--j];}prn(inside);}void prn(coding inside[128]){FILE *fp;char sn[20]={"编码的如下:"};char xinxi[3][5]={"序号","字符","编码"};fp = fopen("HuffmanCode.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2]);for(int i=0;i<128;i++)fprintf(fp,"%d\t%c\t%s\n",i,inside[i].ch,inside[i].codes);fclose(fp);MessageBox(NULL," 编码写入文件成功!","提示",MB_OK);system("HuffmanCode.txt");}函数5:article_code.Cpp#include "define.h"void article_code(coding inside[128]){FILE *fp,*fq;char path[50];char ch=0;printf("请输入需要转码的文章名称:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{MessageBox(NULL," 文件不存在!","提示",MB_OK);exit(1);}fq=fopen("article_code.txt","w+");for(int i=0;1;i++) //从文件读取字符,转换成编码写入文件中{ch=fgetc(fp);if(ch==EOF) //防止多读一次加入到中间比较好break;fprintf(fq,"%s",inside[ch].codes);}fclose(fp); //关闭文件fclose(fq);MessageBox(NULL," 文章转换完毕!","提示",MB_OK);system("article_code.txt");}函数6:decoding.cpp#include "define.h"void decoding(HuffmanTree charer[256]){FILE *fp,*fq; //文件指针,一个读取,一个写入char path[20];int k;char ch;loop: printf("请输入需要解码文件的路径:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在,请确认路径是否正确! \n");goto loop;}fq=fopen("decoding.txt","w+");for(int i=0;1;i++) //从文件中读取编码,由根进行寻找{k=254;ch=fgetc(fp);if(ch==EOF)break;for(int j=0;1;j++){if(ch=='0') //左孩子,继续判断左孩子的左右孩子是否存在,{if(charer[charer[k].lchild].lchild==0 && charer[charer[k].lchild].rchild==0){fprintf(fq,"%c",charer[k].lchild);break;}k=charer[k].lchild; //非叶子节点,即刻转向孩子节点,并进行下一次判断ch=fgetc(fp);if(ch==EOF)break;continue; //读取下一个}if(ch=='1') //右孩子,继续判断右孩子的左右孩子是否存在,不存在即为叶子节点。

哈弗曼编码课程设计实验报告

哈弗曼编码课程设计实验报告

目录一、实训要求 (2)二、课题分析和设计 (2)1、基本需求分析……………………………………………………………………2,32、对应的类………………………………………………………………................3,4,5三、主要功能界面 (5)1、主界面 (5)2、读取文章并对字符编码 (5)3、哈弗曼编码信息 (6)4、文章编码 (6)5、文章译码 (6)6、错误处理 (7)四、总结(课设心得体会) (7)五、附录(主要函数代码)………………………………………………………………7~14一、实训要求1、输入为:一段中文或英文的文章的文件名。

2、读取文章的字符信息。

3、对字符进行权值的计算。

4、根据权值构造哈弗曼树。

5、生成对应的编码。

6、输出为:原文章的编译(译文)。

7、根据已经生成的编码表,输入任意的译文可以得到原文。

二、课题分析和设计1.基本需求分析:(1)在通信过程中,为了提高信道利用率,缩短信息传输时间降低传输成本,需要一编译码器。

(2)此哈弗曼编码译码器应具有编码译码的双向功能,即在发送端通过编码系统对传入的数据进行编码。

(3)在接收端将数据译码,将具有两项功能的编码译码器用于双工信道就可满足,双工信道的双向编译功能。

(4)输入某段报文是,系统将自己完成编译输出。

(5)、程序设计流程:<1>文字表述:开始进入功能选择界面,包含五种操作(1)读取文章并对字符编码。

(2)哈夫曼编码信息。

(3)文章编码。

(4)文章译码。

(5)退出程序。

<2>操作:(1)给定一篇文章,统计字符出现的概率,并根据概率建立哈弗曼树,并利用哈弗曼树对字符进哈夫曼编码。

(2)显示哈弗曼编码信息,包括字符和其哈弗曼编码。

(3)对文章进行译码,显示译码信息,并保存。

(4)对文章进行译码,显示并保存。

<3>流程图:2、对应的类:<1>定义类:class Element //结点类{public:char name;//字符名int weight;//字符权值int lchild;//左孩子int rchild;//右孩子int parent;//父结点Element(){weight = 0;lchild = -1;rchild = -1;parent =-1;}~Element(){}};<2>定义字符和出现的次数:class Name //字符类{public:char pname;//字符名int num;//字符出现的次数double lweight;//字符的权值Name(){num = 0;lweight = 0;}~Name(){}};<3>定义字符总类总数和存储信息:class GetName //关于字符类{public:char file_name[max2];//文件名int n; //字符的种类int sum; //字符的总数Name letter[max1]; //存储字符信息的类的数组GetName(){sum = 0;n = 0;}};<4>定义编码类:class CodeNode//编码类{public:char ch; //存储字符char save_code[max1]; //存储编码};<5>主要功能实现类:class Function{public:GetName L;int fn; //定义哈夫曼数组大小Element HuffmanT[max3]; //哈夫曼数组CodeNode Code[max1]; //字符编码数组Function(){fn = 0;}};三、主要功能界面:1、主界面:2、读取文章并对字符编码:3、哈弗曼编码信息:4、文章编码:5、文章译码:6、错误处理:四、总结(课设心得体会):三周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计报告实验二哈夫曼编码目录一.问题描述及分析p11.问题描述p12.需求分析p1 二.功能模块及数据结构描述p11.数据结构描述 p1 2.模块描述 p2三.主要算法流程描述p21.编码流程图 p3 2.译码流程图 p4四.使用说明p5 五.调试分析说明p6一.问题描述及分析1.问题描述设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文本文件(.txt)。

2.需求分析(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;(4)显示指定的编码文件和文本文件;3.运行要求.Windows xp/2003.VC++6.0(或以上)运行库二.功能模块及数据结构描述1.数据结构描述typedef struct{long weight;long lchild,rchild,parent;}hfmt;hfmt t[2*256-1];存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的下标(用来区别根与非根节点,值为-1与非-1)。

typedef struct{char bits[256];long s;}hfmcc;hfmcc cc[256];存放哈夫曼编码结构体,s用来指示编码在位串bits[n]中的起始位置。

2.模块描述图2.1 系统函数copy函数:根据s的值在位串bits[n]中提取有效编码位数。

HFM函数:对读入的节点权值,生成哈夫曼树。

HFMBM函数:对生成的哈夫曼树进行零一编码,对应于原文件字符。

三.主要算法流程描述1.编码流程图图2.2 编码流程图2.译码流程图图2.3 译码流程图四.使用说明图2.4 生成的文件本软件默认生成的编码文件名为:a.cod默认生成的译码文件名为:b.txt执行提示:输入所要编码的文本文件。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

数据结构哈夫曼编码器课程设计报告哈夫曼编码器课程设计报告设计目标:本课程设计的目标是实现一个哈夫曼编码器,能够实现对给定文本文件进行压缩和解压缩操作。

通过使用哈夫曼编码,可以使文本文件的大小大幅度减小,从而节约存储空间。

设计原理及实现方法:本设计主要包括以下几个步骤:1、文本文件的读取:首先需要从外部文件中读取待压缩的文本文件,读取过程可以通过使用文件输入流进行操作。

读取的文本内容将用于构建哈夫曼树和编码表。

2、构建哈夫曼树:哈夫曼树是通过给定文本中的字符出现频率来构建的,出现频率更高的字符将拥有更短的编码。

构建哈夫曼树的过程可以通过使用优先队列和二叉树来实现。

3、编码表:在构建哈夫曼树的过程中,每个字符都会有一个唯一的编码。

根据哈夫曼树的特性,左子树的编码为0,右子树的编码为1,根据这个规则可以通过遍历哈夫曼树来编码表。

4、压缩文本文件:在编码表后,可以利用编码表来对文本文件进行压缩操作。

遍历文本文件中的每个字符,通过编码表将字符转换为对应的哈夫曼编码,并将编码存储在一个压缩文件中。

5、解压缩文本文件:解压缩操作是压缩操作的逆过程。

根据编码表将压缩文件中的哈夫曼编码逐个解码为字符,并将解码后的字符写入解压缩文件中。

附件说明:本文档的附件包括以下内容:1、源代码文件:- HuffmanEncoder:java:包含了哈夫曼编码器的主要实现代码。

- Mn:java:包含了测试哈夫曼编码器的主函数。

2、示例文本文件:- input:txt:用于测试的示例文本文件。

法律名词及注释:本文档中涉及的法律名词及注释如下:1、哈夫曼编码:用于数据压缩的一种编码方式,旨在通过减少字符的编码长度来节省存储空间。

2、压缩:将原始文件经过编码转换为较短的文件,从而减小存储空间的占用。

3、解压缩:将压缩文件经过解码转换为原始文件,恢复原始文件的过程。

全文结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖南科技学院数据结构课程设计报告课题: 霍夫曼编码专业班级:信计1202学号:姓名:黄思琪指导教师: 牛志毅1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

2.需求分析课题:哈夫曼编码译码器系统问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。

问题补充:1. 从硬盘的一个文件里读出一段英语文章;2. 统计这篇文章中的每个字符出现的次数;3. 以字符出现字数作为权值,构建哈夫曼树4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。

具体介绍:在本课题中,我们在硬盘D盘中预先建立一个文档,在里面编辑一篇文章(大写)。

然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。

然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。

3 系统(项目)设计(1)设计思路及方案本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。

假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为(W1*L1)+(W2*L2)+…+(Wi*Li)。

若将此对应到二叉树上,Wi为叶结点,Li为根结点到叶结点的路径长度。

那么,(W1*L1)+(W2*L2)+…+(Wi*Li)恰好为二叉树上带权路径长度。

因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。

该系统将实现以下几大功能:从硬盘读取字符串,建立哈夫曼树,输出哈夫曼树的存储结构的初态和终态,输出各种字符出现的次数以及哈夫曼编码的译码等。

(2)模块的设计及介绍1从硬盘读取字符串fileopen(参数){实现命令;打印输出;}2建立HuffmanTree通过三个函数来实现:void select_min(参数){初始化;for{接受命令;处理命令;}}说明:在ht[1....k]中选择parent为0且权值最小的两个根结点的算法int tongji(参数){初始化;for{接受命令;处理命令;}}说明:统计字符串中各种字母的个数以及字符的种类void Create_huffmanTree(){初始化;for{接受命令;处理命令;}输出字符统计情况;}说明:构造哈夫曼树3哈夫曼编码void Huffman_bianma(参数){定义变量;{处理命令;}}说明:哈夫曼编码(3)主要模块程序流程图下面介绍三个主要的程序模块流程图:①主函数流程图:图流程图注释:该图比较简单,主要是调用各个函数模块,首先代开已经存在的文件,然后统计总的字符数以及出现的各个字符和频率。

然后才开始建立哈夫曼树,接着在哈夫曼树的基础上对其进行编码。

最后输出结束。

②构造哈夫曼树:图流程图注释:该图是表示构造哈夫曼树的过程。

首先输入num个叶结点的权值,当i=num是循环结束。

然后进行哈夫曼树的构建,当i=2*num-1是循环结束。

最后输出所得到的字符统计情况。

③哈夫曼编码:图流程图解释:该流程图表四哈夫曼编码情况。

首先初始化,Cd[--start]=0,start=num。

然后进行编码,当cd[--start]=T[p].lchild= =c时,cd[--start]=0;当cd[--start]=T[p].left!= =c时,cd[--start]=1。

这个编码循环一直到i=num时结束。

4 系统实现各模块关键代码及算法的解释:①主调函数代码解释:这是main函数里的各个函数调用情况。

fileopen(string); ..k]中选择parent为0且权值最小的两个根结点的算法,其序号为s1和s2。

void select_min(HuffmanTree T,int k,int &x1,int &x2){int i,j;int min1=1000;for(i=1;i<=k;i++)if(T[i].weight<min1 &&T[i].parent==0){j=i;min1=T[i].weight;}x1=j;min1=1000;for (i=1;i<=k;i++)if(T[i].weight<min1 && T[i].parent==0 && i!=x1){j=i;min1=T[i].weight;}x2=j;}代码解释:下面函数用来统计字符串中各种字母的个数以及字符的种类。

当字符在A和Z 之间时即被计数,并用str[j]保存字母到数组中,用cnt[j]统计每种字符个数。

j返回总共读取的字符数目。

int tongji(char *s,int cishu[],char str[]){int i,j,k;char *p;int t[27];for(i=1;i<=26;i++)t[i]=0;for(p=s; *p!='\0';p++){if(*p>='A'&&*p<='Z')k=*p-64;t[k]++;}for(i=1,j=0;i<=26;++i)if(t[i]!=0 ){j++;str[j]=i+64;cishu[j]=t[i];return j;}代码解释:下面函数用来构造哈夫曼树HT。

首先初始化哈夫曼树,然后输入前面统计的各结点的权值,用for循环来构造哈夫曼树。

void Create_huffmanTree(HuffmanTree ht,HuffmanCode hc,int cishu[],char str[]){ eft=0;ht[i].right=0;ht[i].parent=0;ht[i].weight=0;}for(i=1;i<=num;i++) eight=cishu[i];for(i=num+1;i<=2*num-1;i++){ arent=i;ht[s2].parent=i;ht[i].left=s1; ht[i].right=s2;ht[i].weight=ht[s1].weight+ht[s2].weight;}for(i=0;i<=num;i++)hc[i].ch=str[i]; h,cishu[i++]);}②生成Huffman编码并写入文件代码解释:根据哈夫曼树T求哈夫曼编码H。

void Huffman_bianma(HuffmanTree T,HuffmanCode H) arent)>0) eft==child) code[--start]='0';elsecode[--start]='1';child=parent;}strcpy(H[i].co,&code[start]);H[i].len=num-start;}}代码解释:对str所代表的字符串进行编码并写入文件。

将翻译的二进制码写入文本文件。

void coding(HuffmanCode hc ,char *str){ ch==*str){for(j=0;j<=hc[i].len;j++)fputc(hc[i].co[j],fp);break;}str++;}fclose(fp);}5 系统调试本次测试是在我的电脑的D盘中建立一个名为的文本文档,其中有大写字母IAMASTUDENT,期望程序能将其读出至界面并实现其他相关的功能。

运行程序后,我们可以见到一下的运行界面。

从硬盘中读出已有的文本文件输出所读字符的种类和每种字符的个数输出编码小结通过一周的课程设计使我对哈夫曼树以及哈夫曼编码有了更深的认识和理解,也使我更加明白哈夫曼编码译码在信息技术中的重要性和地位。

首先我谈谈我在设计期间我遇到的难点。

开始的时候,代码中有许多的错误,特别是有一个“无法找到文件”的错误让我束手无策,最后还是屏蔽了定义的四个头文件然后慢慢地改正错误才让我又看到了希望。

然后在实现文章的读入时,由于对文件不是太熟悉,只好翻开C语言书本仿照其模式编写,但后来进入了死循环,最后的解决方式是把main函数里的一个do…while循环去掉。

许多的错误让我明白了一个道理---细心是非常重要的。

同时,对于编程者而言,思路清晰是相当重要的。

在适当的时候和同学一起交流探讨是一个十分好的学习机会。

这次课程设计不但让我学得了一些编程知识,还学会了系统的做一份课程设计报告,学会了如何截图,学会了如何更好的画流程图,明白了做事情只有认真,才能真正做得更好!通过这次课程设计,我看清楚了自己的编程功底和动手能力还很不足,这主要是平时实践太少的缘故。

我想,在未来的暑假中,我会努力尝试编写一些程序。

在这个程序中,还有许多地方值得完善。

比如,读出文本只能是大写的文档,空格和小写不能识别。

由于时间问题,暂时不能实现了,我想在暑假里好好研究这个问题。

未完成:哈夫曼译码附录源程序#include <>#include <>#include <>#include<>eight<min1 &&T[i].parent==0){j=i;min1=T[i].weight;}x1=j;min1=1000;for (i=1;i<=k;i++) eight<min1 && T[i].parent==0 && i!=x1){j=i;min1=T[i].weight;}x2=j;}int tongji(char *s,int cishu[],char str[]){ eft=0;ht[i].right=0;ht[i].parent=0;ht[i].weight=0;}for(i=1;i<=num;i++)eight=cishu[i];for(i=num+1;i<=2*num-1;i++){ arent=i;ht[s2].parent=i;ht[i].left=s1; ht[i].right=s2;ht[i].weight=ht[s1].weight+ht[s2].weight;}for(i=0;i<=num;i++)hc[i].ch=str[i];h,cishu[i++]);}void Huffman_bianma(HuffmanTree T,HuffmanCode H) arent)>0) eft==child)code[--start]='0';elsecode[--start]='1';child=parent;}strcpy(H[i].co,&code[start]);H[i].len=num-start;}}void coding(HuffmanCode hc ,char *str){ ch==*str){for(j=0;j<=hc[i].len;j++)fputc(hc[i].co[j],fp);break;}str++;}fclose(fp);}void output() 始\n");printf("\t 2.输出各字符统计个数\n");printf("\t 3.编码\n");printf("\t 4.输出编码\n");printf("\t 5.退出\n");scanf("%d",&x);switch(x){case 1:printf("读出文本为:\n");fileopen(string);break;case 2:num=tongji(string,cishu,str); //统计字符的种类及各类字符出现的次数Create_huffmanTree(HT,HC,cishu,str);break;case 3:Huffman_bianma(HT,HC);//生成哈夫曼编码coding(HC,string); //建立电文哈夫曼编码文件break;case 4:output();break;case 5:exit(0);free(HT);default:printf("输入错误!\n");continue;}}}。

相关文档
最新文档