《数据结构》课程设计报告哈夫曼编译码器程序设计.doc
《《数据结构》课程设计报告哈夫曼编译码器程序设计.doc》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告哈夫曼编译码器程序设计.doc(33页珍藏版)》请在三一办公上搜索。
1、各专业全套优秀毕业设计图纸数据结构课程设计报告哈夫曼编译码器程序设计班 级: 2012 级计算机科学与技术 学 号: 201225160106 姓 名: 指导老师: 提交日期: 2013年12月20日 摘 要在现代社会,通信的发展,使得现代社会更加丰富多彩,我们可以随时随地在任何地方了解到世界各地的信息,而这又必须依赖信息的传递。在信息化高度发达的当今社会,我们必须对信息的传递有着较高的要求,我们希望信息在传递的过程中,能够保持节省性和保密性和无损性,而著名的哈夫曼编码就能够达到这样的要求。哈夫曼编码是Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度
2、最短的码字,有时称之为最佳编码,一般就叫作Huffman编码(有时也称为霍夫曼编码)。哈夫曼编码适用于多远独立信源,对于多元独立信源来说它是最佳码。但其存在的不足直接制约了它的广泛应用。本设计主要介绍了哈夫曼编码算法、译码算法等功能的程序实现。关键词:数据结构;哈夫曼编码;哈夫曼树;译码AbstractIn modern society, the development of communication, making more colorful modern society, we can understand that information anywhere, anytime in an
3、y place around the world, which in turn must rely on the transmission of information. In todays highly developed information society, we have to pass information to a higher demand, we hope the information in the course of transmission, it is possible to save and maintain the confidentiality and non
4、-destructive nature, and the famous Huffman coding can meet this requirement.Huffman Huffman coding is a coding method proposed in 1952, the method according to the probability of the characters appear completely different prefix to construct the shortest average length of codewords, sometimes refer
5、red to as the best coding, generally known as Huffman coding (Huffman coding is sometimes referred to). Huffman coding applied to how far an independent source for diverse independent sources for it is the best code. But its shortcomings directly restricts its wide application. This design introduce
6、s the Huffman coding algorithm decoding algorithm functions such program.Keywords: data structure;Huffman coding; Huffman decoding目 录1 引言12 需求分析22.1 数据分析22.2 功能要求23 概要设计33.1 设计思路33.2 抽象数据类型43.3 主程序流程53.4 各程序模块的关系64 详细设计74.1 数据类型的定义74.2 主要模块的描述84.2.1 主要模块算法描述84.2.2 主要算法流程图描述105 调试分析125.1 调试问题分析125.2
7、算法时空分析126 用户使用说明137 测试结果147.1 详细测试分析147.2 各种情况测试分析158 结论198.1 总结198.2 个人心得19参考文献20附录211 引 言电报曾经是人们进行快速远距离通信的重要手段,它将传送的文字一般使用二进制数传送数据。在发送端将数据转换成0、1序列(即编码),而在接收端又将0、1序列转换成对应的数据(即译码)。在传送电文时,采用哈夫曼方法对传输的电报进行编码,让电文中出现的次数较多的字符采用尽可能短的编码,这样的传输电文的总长度就会减少。哈夫曼编码是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,DavidA.Huffma
8、n在麻省理工攻读博士时所发明的,并发表于一种构建极小多余编码的方法(AMethodfortheConstructionofMinimum-RedundancyCodes)一文。本设计主要介绍了哈夫曼树的构造,哈夫曼编码以及哈夫曼译码的主要算法,给出了哈夫曼编译码的程序的简单实现。将要求用户输入一行字符串而后程序将统计字符串中每个字符重复出现的次数并作为其权值。然后将这些字符及权值来构造一棵哈夫曼树,并对它们进行哈夫曼树编码,再根据这些哈夫曼树编码给出二进制串译出字符。2 需求分析2.1 数据分析1)输入的形式:输入一串字符串;在译码的时候输入一串由“0”和“1”组成的字符串。2)输入值的范围:
9、字符串长度小于256(可根据需要进行修改)。3)输出的形式:编码时输出编码表,译码时输出原文字符串。4)程序所能达到的功能:对电文进行转换编码以及实现哈二进制串的译码。5)测试数据:一串包含数字、字母、符号的字符串;一串包含数字的字符串;一串包含字母的字符串;一串包含符号的字符串;一串包含数字、字母、符号、空格的字符串等情况;由所给出的哈夫曼编码组成的二进制串;随意的二进制串;随意的字符串。2.2 功能要求课程设计程序功能要求如下:1)生成哈夫曼树。2)哈夫曼树采用静态链表存储。3)求哈夫曼树对应的哈夫曼编码。4)给出哈夫曼编码译出字符。3 概要设计3.1 设计思路1)编写FrequencyC
10、ounter函数来实现统计用户输入字符串的字符及其次数。在统计用户输入的字符串中每个字符出现的次数时,假定这些字符都是ASCII码字符。可以预定一个字符表的结构,其中包含ASCII码表中的所有字符,以及该字符出现的次数。而后对用户输入的字符串进行遍历,若ASCII码表中某个字符在字符串中出现一次,那么将其对应在字符表结构中的次数加1。字符表结构的定义如下:typedef struct char data128;/ASCII码表中的所有字符int freq128; /每个字符出现的次数,初始为0CharTable;2)编写SelectCharactor函数来实现筛选字符表的0次字符。然而此时字符
11、表中存在许多出现次数为0的字符,因此不能够直接通过得到的字符表来构造哈夫曼树,需要筛选那些字符表结构中次数为0的字符,剩下在字符串中出现过的字符及其权值。3)编写HuffmanTree函数来实现构造哈夫曼树,树结点保存在 huf 数组中。在获取这些字符及其权值后,就可以构建哈夫曼树:哈夫曼树的结点类型是左右孩子域、双亲域、数据域和权值域。哈夫曼树可以通过一个一维结点类型数组来表示。对于具有n个叶子结点的哈夫曼树,其结点个数为2n-1,若将这2n-1个结点用一个一维数组来储存,可以将叶子结点存放在数组的前n个位置,而将分支结点放在后n-1个位置。然后依次从huf数组中选出两个权值最小的根结点,并
12、用它们来构造一棵新的二叉树,对于已经构造二叉树的结点不再参与二叉树的构造,而有它构成的二叉树的根结点就才参与新的二叉树的构造。4)编写HuffmanCode函数来实现构造哈夫曼编码,编码值保存在code数组中。每个结点的哈夫曼编码都是由0和1组成的序列,因此可以通过一个字符类型的数组来保存每个结点的哈夫曼编码;同时,由于每个结点的哈夫曼编码的长度是不同的,那么还需要增加一个标志域start来表示编码的起始位置,这样从start开始的所有的值都是编码值。哈夫曼编码的结构为:typedef struct char codeHUFFMAN_MAXVALUE1;/哈夫曼编码值int start; /编
13、码起始位置 HufCode;在构造的哈夫曼树中,其结点都存放在数组huf中,并且该数组的前n个位置存放的叶子结点,而后n-1个位置存放的是分支结点。为了方便哈夫曼编码的实现,讲从叶子结点到根的路径进行编码。因此首先将哈夫曼编码的start域初始化为n,然后当结点为双亲结点的左孩子时,将编码赋值为0;否则赋值为1。同时将start值减1,直到到达根结点为止。5)编写HuffmanDecode函数来实现构造哈夫曼译码,字符串保存在recode数组中。在对二进制串进行译码时,首先从哈夫曼树的祖父结点开始,哈夫曼树的祖父结点就是哈夫曼树结点数组的最后一个,也就是2n-1个哈夫曼树结点,按照字符串中的“
14、0”或“1”来查找左孩子结点或者右孩子结点。若达到叶子结点,叶子结点的左孩子域和右孩子域都是-1,则译出其中字符,而后再从根结点重新出发按照之前的顺序译出其他字符。3.2 抽象数据类型树的抽象数据类型定义:ADT Stack数据对象:D=ai|aiElemSet,i=1,2,.,n, n0数据关系:若D为空集,则称为空树。若D仅为一个数据元素,R为空集,否则R=H,H是如下的二元关系:1)再D中存在唯一的称为根的数据元素root,它在关系H下无前驱。2)若D-root空集,则存在一个划分D1,D2,Dm(m0)。3)对应于D-root的划分,H-root,X1,有唯一的一个划分H1,H2,Hm
15、(m0)。基本操作:InitTree(&T)操作结果:构造空树T。DestroyTree(&T)初始条件:树T已存在。操作结果:树T被销毁。ClearTree(&T)初始条件:树T已存在。操作结果:将树T清为空栈。TreeEmpty(T)初始条件:树T已存在。操作结果:若树T为空,则返回TRUE,否则FALSE。TreeDepth(T)初始条件:树T已存在。操作结果:返回T的深度。Root(T)初始条件:树T已存在。操作结果:返回树T的根。3.3 主程序流程主程序的流程图如图2.1所示:开始结束输入原文字符串统计出字符的频率 筛选频率不为0的字符构建哈夫曼树哈夫曼编码输出字符对应的哈夫曼编码
16、输入二进制串 哈夫曼译码输出原文字符串 图2.1 主程序流程图3.4 各程序模块的关系哈夫曼编译码程序主要是由以下几个模块组成:主程序模块、构造哈夫曼树模块、哈夫曼编码模块、哈夫曼译码模块、统计次数模块、筛选字符模块。主程序调用其它子函数,子函数之间没有进行互相调用,各程序模块的关系图如图2.2所示。构造哈夫曼树构造哈夫曼编码哈夫曼译码统计字符出现次数选出次数不为0的字符主程序图2.2 各程序模块的关系图4 详细设计4.1 数据类型的定义1)哈夫曼树结点结构类型:typedef struct nodetype node; /数据域weighttype weight;/权值域int parent
17、; /双亲域int lchild; /左孩子域int rchild; /右孩子域 HufNode;2)哈夫曼编码结构类型:typedef struct char codeHUFFMAN_MAXVALUE1;/哈夫曼编码值int start; /编码起始位置 HufCode;3)字符表结构类型:typedef structchar data128;/ASCII码表中的所有字符int freq128; /每个字符出现的次数,初始为0 CharTable;4)程序中所需的一些其他类型定义:#define HUFFMAN_MAXVALUE32767 /默认权值最大#define HUFFMAN_MAX
18、VALUE1 20 /默认编码长度typedef char nodetype; /定义char类型是哈夫曼码类型typedef int weighttype; /定义int类型是权值类型4.2 主要模块的描述4.2.1 主要模块算法描述1)构建哈夫曼树模块的伪码算法如下:void HuffmanTree(nodetype node, weighttype weight, int n,HufNode huf)int i,j=0,w1,w2,node1,node2;a(&n,&i,&node,&huf); /初始化哈夫曼树后,n-1个节点的权值域全为0for (i = n; i 2*n-1; i+
19、)w1 = HUFFMAN_MAXVALUE;w2 = HUFFMAN_MAXVALUE;node1 = node2 = -1;for (int j = 0; j = i-1; j+)if(hufj.parent != -1) continue;if(hufj.weight w1)w2 = w1, node2 = node1;w1 = hufj.weight;node1 = j;else if(hufj.weight w2)w2 = hufj.weight;node2 = j;/置两个权值最小的节点及其双亲节点数据hufi.weight=hufnode1.weight+hufnode2.wei
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 哈夫曼编 译码器 程序设计
链接地址:https://www.31ppt.com/p-2396545.html