10信计刘旭东-哈夫曼编码课程设计

合集下载

课程设计-哈夫曼编码的分析和实现

课程设计-哈夫曼编码的分析和实现

课程设计任务书2010—2011学年第一学期专业:通信工程学号:070110101 姓名:苟孟洛课程设计名称:信息论与编码课程设计设计题目:哈夫曼编码的分析与实现完成期限:自2010 年12月20 日至2010 年12 月26 日共1 周一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解哈夫曼编码方法的基本过程与特点;3、提高综合运用所学理论知识独立分析和解决问题的能力;4、使用MATLAB或其他语言进行编程。

二.设计内容假设已知一个信源的各符号概率,编写适当函数,对其进行哈夫曼编码,得出码字,平均码长和编码效率,总结此编码方法的特点和应用。

三.设计要求1、编写的函数要有通用性;2、信源可以自由选择,符号信源与图像信源均可。

四.设计条件计算机、MATLAB或其他语言环境五、参考资料[1]曹雪虹,张宗橙.信息论与编码.北京:清华大学出版社,2007.[2]王慧琴.数字图像处理.北京:北京邮电大学出版社,2007.指导教师(签字):教研室主任(签字):批准日期:年月日摘要哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。

在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。

这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。

这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。

本课题通过MATLAB编写适当的函数,对一个随机信源进行哈夫曼编码,得出码字,平均码长和编码效率。

从而理解信源编码的基本思想与目的以及哈夫曼编码方法的基本过程与特点,并且提高综合运用所学理论知识独立分析和解决问题的能力。

哈夫曼编码课程设计

哈夫曼编码课程设计

目录1设计内容与设计要求 (1)1.1系统的基本功能 (2)1.2系统的设计要求 (2)2 系统需求分析 (1)2.1系统设计目标 (1)2.2哈夫曼算法 (1)3系统的实现 (3)4 程序调试 (3)5 总结 (3)5.1本系统特色 (3)5.2心得体会 (3)附件:源程序清单 (5)1设计内容与设计要求1.1系统的基本功能哈夫曼编码是根据字符出现频率对数据进行编码解码,以便对文件进行压缩的一种方法,目前大部分有效的压缩算法(如MP3编码方法)都是基于哈夫曼编码的。

数据压缩过程称为编码,也就是把文件中的每个字符均转换为一个唯一的二进制串。

数据解压过程称为解码,也就是把给定的二进制位字符串转换为对应的字符。

1.2系统的设计要求(1)数据结构可以使用结构体数组或结构体链表实现,结构体的属性可进行扩充。

(2)由用户输入相应文本。

(3)对于系统运行时,要求有相应的提示信息,方便用户进行选择。

2 系统需求分析2.1系统设计目标(1)哈夫曼树的建立。

(2)哈夫曼编码的生成。

(3)求出平均查找长度。

(4)用户输入权值的个数。

(5)输出的形式为整型。

(6)程序的执行可使用户在输入一列数值后,可得到由这些权值所得到的编码。

2.2 哈夫曼算法哈夫曼算法流程如下:(1)根据给定的N个权值{W1,W2,····,WN}构成N棵二叉树的集合F={T1,T2,T3,···,Tn},其中每棵二叉树Ti中只有一个带权为Wi的根节点,其左右子树均空。

(2)在F中选取两颗根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值最小的树为其左右子树上根节点的权值之和。

(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。

(4)重复(2)和(3),直到F只含一棵树为止。

这棵树便是哈夫曼树。

(5)约定左分支表示字符‘0’,右分支表示字符‘1’,则可以从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码,这就是哈夫曼编码。

课程设计报告哈夫曼编码

课程设计报告哈夫曼编码

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

(1)I:初始化(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 设计题目....................... 错误!未定义书签。

2 问题描述....................... 错误!未定义书签。

3.1数据结构设计................ 错误!未定义书签。

课程设计哈夫曼编码

课程设计哈夫曼编码

《数据结构》课程设计报告设计题目哈夫曼(Huffman)编译码器学院名称信息工程学院专业班级 13计本1 姓名 hhh学号1312219999目录一、实验题目-哈夫曼(Huffman)编/译码器 ------------------------------二、问题描述-----------------------------------------------三、设计目标-----------------------------------------------四、需求分析-----------------------------------------------五、概要设计-----------------------------------------------1---系统结构图--------------------------------------2--各个模块功能的详细描述------------------------------- 六、详细设计-----------------------------------------------1——详细代码--------------------------------------a)头文件代码--------------------------------------b)主函数代码--------------------------------------2——系统流程图--------------------------------------七、测试分析-----------------------------------------------八、使用说明-----------------------------------------------1、白盒-----------------------------------------------2、黑盒-----------------------------------------------九、课程设计总结----------------------------------------------一、实验题目哈夫曼(Huffman)编/译码器二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

哈夫曼编码译码器---课程设计报告.docx

哈夫曼编码译码器---课程设计报告.docx

目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

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

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

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

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

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

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

作为计算机专业的学生,我们应该很好的掌握这门技术。

在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。

在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。

这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。

哈夫曼编码课程设计

哈夫曼编码课程设计

摘要哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法。

其压缩通常在20%~90%之间。

哈夫曼编码算法使用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。

哈夫曼算法构造的扩充二叉树称为哈夫曼编码树或哈夫曼树。

当然,还有编码和译码部分。

本系统的前端开发工具是Visual C++6.0。

具有输入字符集大小及权值大小,构造哈夫曼树,并对用户输入的字符串进行编码以及译码还有退出四种功能。

本程序经过测试后,功能均能实现,运行稳定。

关键词:哈夫曼树,编码,译码,权值目录1问题描述 (1)2 问题分析 (2)3算法设计 (3)4算法实现 (4)5测试分析 (7)结论 (9)参考文献 (9)1 问题描述哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。

它是一种变长的编码。

哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。

在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。

构造好哈夫曼树后,就可根据哈夫曼树进行编码。

然而怎样构造一棵哈夫曼树呢?最具有一般规律的构造方法就是哈夫曼算法。

字符根据其出现的概率作为权值构造一棵哈夫曼树后,经哈夫曼编码得到的对应的码值。

只要使用同一棵哈夫曼树,就可把编码还原成原来那组字符。

显然哈夫曼编码是前缀编码,即任一个字符的编码都不是另一个字符的编码的前缀,否则,编码就不能进行翻译。

利用哈夫曼算法的编码和译码功能,重复地显示并处理以下项目,即构造哈夫曼树,编码及译码几项功能,直到选择退出为止。

本次设计就是为这样的一个哈夫曼的编/译码器。

哈夫曼编码所以能产生较短的码文,是因为哈夫曼树具有最小加权路径长度的二叉树。

如果叶结点的权值恰好是某个需编码的文本中各字符出现的次数,则编码后文本的长度就是该哈夫曼树的加权路径长度。

译码过程为自做向右逐一扫描码文,并从哈夫曼树的根开始,将扫到的二进制位串中的相邻位与哈夫曼树上标的0,1相匹配,以确定一条从根到叶子结点的路径,一旦到达叶子,则译出了一个字符。

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

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

哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。

2、熟悉掌握一门计算机语言,能够进行数据算法设计。

二、实验原理哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。

在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。

构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。

最简单的二进制编码方式是等长编码。

若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。

哈夫曼树课用于构造使电文的编码总长最短的编码方案。

主要流程图如下:三、实验步骤1:写好流程图,设计实验方案。

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

3:编码。

利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

4:译码。

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

5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

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

6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。

具体函数如下:1:Initialization() 初始化2:Encoding() 编码3:Decoding() 译码4:Print_file() 打印代码文件5:search(k,j,p) 搜索二叉树6:Print_tree() 打印二叉树7:menu() 主菜单9:main() 主函数四、实验结果与分析(1)大致个人测试案例:主界面:。

信息论与编码课程设计(哈夫曼编码的分析与实现)

信息论与编码课程设计(哈夫曼编码的分析与实现)

吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生姓名:学号:指导教师:吕卅王超设计时间:2013.11.18-2013.11.29一、设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。

其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。

通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生达到如下要求:1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。

三、设计内容一个有8个符号的信源X ,各个符号出现的概率为:编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。

并不断重复这一过程,直到最后两个符号配以0和1为止。

最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。

哈夫曼编码方式得到的码并非唯一的。

在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,12345678,,,,,()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ⎡⎤⎧⎫=⎨⎬⎢⎥⎣⎦⎩⎭这样可获得较小的码方差。

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

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

(原创)数据结构课程设计报告学院:计算机科学与工程专业:计算机科学与技术班级: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') //右孩子,继续判断右孩子的左右孩子是否存在,不存在即为叶子节点。

哈夫曼编码信息论课程设计

哈夫曼编码信息论课程设计

信息论课程设计实验报告专业班级:信计0802姓名:刘建勋学号:07目录:1.课题描述-----------------------------------------------------------------------------------------32.信源编码的相关介绍---------------------------------------------------------------------33.哈夫曼编码-------------------------------------------------------------------------------------3哈夫曼编码算法-----------------------------------------------------------------------3哈弗曼编码的特点--------------------------------------------------------------------4哈夫曼实验原理----------------------------------------------------------------------- 4 4.哈夫曼编码的C++实现-----------------------------------------------------------------5程序设计-----------------------------------------------------------------------------------5运行结果-----------------------------------------------------------------------------------8 总结-----------------------------------------------------------------------------------------------------8 参考文献-------------------------------------------------------------------------------------------------81.课题描述实验类别:设计性实验实验目的:掌握哈夫曼编码原理;了解哈夫曼码的最佳性;实验内容:编程实现二元huffman编码;2.信源编码的相关介绍:信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理,前者是可逆编码定理的基础。

数据结构课程设计---- 赫夫曼编码系统

数据结构课程设计---- 赫夫曼编码系统

课程设计报告课程设计题目:赫夫曼编码系统学生姓名:安国栋专业:计算机科学与技术班级:1320701学号:201320070105指导教师:刘志峰2014年06 月19 日目录一、设计要求------------------------------------2二、存储结构------------------------------------2三、设计思想------------------------------------21、设计包含的几个部分-----------------------22、流程图-----------------------------------3四、详细设计------------------------------------4五、算法复杂度分析------------------------------8六、显示结果------------------------------------9七、心得体会------------------------------------11八、附录:源程序代码----------------------------11一、设计要求赫夫曼树任务:建立建立最优二叉树函数要求:可以建立函数输入二叉树,实现赫夫曼树的编码和译码系统,重复地显示并处理编码/解码功能,直到选择退出为止。

二、存储结构:在本次课程设计中,每一个字符的信息用一个结构体存储,包含结点值、权值、双亲结点、左孩子结点、右孩子结点等数据。

赫夫曼码和所有字符都是用一个一维数组建立存储的,所以本次课程设计的存储结构是顺序存储。

三、设计思想哈夫曼编译码系统的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。

在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。

构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。

数据结构课程设计--哈夫曼编码问题的设计和实现

数据结构课程设计--哈夫曼编码问题的设计和实现

题目哈夫曼编码问题的设计和实现课程名称数据结构课程设计院(系、部、中心)专业班级学生姓名学号设计地点指导教师设计起止时间:2008 年6月2日至2008 年6月 6 日目录1 问题描述 (2)1.1 题目内容 (2)1.2 基本要求 (3)1.3 测试数据 (3)2 需求分析 (3)2.1 程序的基本功能 (3)2.2 输入值、输出值以及输入输出形式 (3)2.3 各个模块的功能要求 (4)3 概要设计 (4)3.1 所需的ADT,每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义) (4)3.2 主程序流程以及模块调用关系 (5)3.3 各个模块的算法设计说明 (5)4 详细设计 (8)4.1 数据类型 (8)4.2 函数调用 (9)5 各个算法实现的源程序 (9)6 调试分析 (12)7 使用说明 (12)8 测试结果 (13)9 源程序 (13)1 问题描述1.1 题目内容哈夫曼编码问题的设计和实现输入一个英文字符串,对该字符串中各字符个数进行统计取得各字符的出现次数;以其出现次数作为关键字建立哈夫曼树并进行编码,最后输出各个字符对应的码值。

1.2 基本要求要求:设计存储结构、基本算法(主要采用程序流程图体现);完成基本算法的实现代码;设计测试输入数据对程序进行测试,分析输出结果数据、算法的时间复杂度分析,如有改进算法则提出算法的改进方法。

1.3 测试数据测试数据三组:AAAABBBCCD(判断连续的字符串是否可行)AABBAABCDC(判断间段的字符串是否可行)AAAA BBBCCD(判断含空格的字符串是否可行)2 需求分析2.1 程序的基本功能该程序大体上有两个功能:1.输入任何一个字符串后,该程序能统计不同字符串的个数,并以不同字符串的个数作为权值。

2.已知不同字母的权值,以该权值作为叶结点,构造一棵带权路径最小的树,对该树从叶结点到根结点路径分支遍历,经过一个分支就得到一位夫曼编码值。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

全文结束。

赫夫曼编码课程设计

赫夫曼编码课程设计

赫夫曼编码课程设计一、教学目标本课程旨在让学生了解和掌握赫夫曼编码的基本原理和应用方法。

通过本课程的学习,学生应达到以下目标:1.知识目标:•了解赫夫曼编码的定义、原理和特点。

•理解赫夫曼编码在数据压缩中的应用。

•掌握赫夫曼编码的算法和实现方法。

2.技能目标:•能够运用赫夫曼编码对数据进行压缩和解压缩。

•能够分析和评估赫夫曼编码的压缩效果。

•能够运用编程语言实现赫夫曼编码算法。

3.情感态度价值观目标:•培养学生的创新意识和问题解决能力。

•培养学生对信息技术的兴趣和好奇心。

•培养学生团队合作和沟通的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.赫夫曼编码的基本原理:介绍赫夫曼编码的定义、原理和特点,包括编码的过程和步骤。

2.赫夫曼编码的应用:讲解赫夫曼编码在数据压缩中的应用,包括图像、音频和视频数据的压缩。

3.赫夫曼编码的算法和实现:详细介绍赫夫曼编码的算法步骤,包括建立编码树、生成编码表和进行数据编码和解码的过程。

4.赫夫曼编码的编程实现:通过编程语言(如Python)实现赫夫曼编码算法,并进行实例演示和分析。

5.赫夫曼编码的压缩效果分析:通过实验和案例分析,评估赫夫曼编码的压缩效果和性能。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法:1.讲授法:教师通过讲解赫夫曼编码的基本原理和应用,引导学生理解和掌握相关知识。

2.案例分析法:通过分析实际案例,让学生了解赫夫曼编码在数据压缩中的应用和效果。

3.实验法:学生通过编程实践,实现赫夫曼编码算法,并评估其压缩效果。

4.讨论法:学生分组讨论和合作解决问题,培养团队合作和沟通能力。

四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:选择一本与赫夫曼编码相关的教材,作为学生学习的基础资料。

2.参考书:提供一些与赫夫曼编码相关的参考书籍,供学生深入学习和参考。

3.多媒体资料:制作PPT和教学视频,用于辅助讲解和演示赫夫曼编码的相关概念和算法。

哈夫曼编码的分析与实现课程设计

哈夫曼编码的分析与实现课程设计

哈夫曼编码的分析与实现课程设计吉林建筑⼤学电⽓与电⼦信息⼯程学院信息理论与编码课程设计报告设计题⽬:哈夫曼编码的分析与实现专业班级:电⼦信息⼯程111学⽣姓名:夏纯学号:10211134指导教师:吕卅王超设计时间:2014.11.24-2014.12.5摘要哈夫曼编码(Huffman Coding)是⼀种编码⽅式,以哈夫曼树—即最优⼆叉树,带权路径长度最⼩的⼆叉树,经常应⽤于数据压缩。

在计算机信息处理中,“哈夫曼编码”是⼀种⼀致性编码法(⼜称"熵编码法"),⽤于数据的⽆损耗压缩。

这⼀术语是指使⽤⼀张特殊的编码表将源字符(例如某⽂件中的⼀个符号)进⾏编码。

这张编码表的特殊之处在于,它是根据每⼀个源字符出现的估算概率⽽建⽴起来的(出现概率⾼的字符使⽤较短的编码,反之出现概率低的则使⽤较长的编码,这便使编码之后的字符串的平均期望长度降低,从⽽达到⽆损压缩数据的⽬的)。

本课题通过C语⾔编写适当的函数,对⼀个随机信源进⾏哈夫曼编码,得出码字,平均码长和编码效率。

从⽽理解信源编码的基本思想与⽬的以及哈夫曼编码⽅法的基本过程与特点,并且提⾼综合运⽤所学理论知识独⽴分析和解决问题的能⼒。

关键字:哈夫曼,信源编码,C语⾔⽬录第1章概述 (1)1.1设计的作⽤、⽬的 (1)1.2设计任务及要求 (1)1.3设计内容 (1)第2章哈夫曼编码的分析与实现 (2)2.1哈夫曼编码介绍 (2)2.2设计原理 (3)2.3哈夫曼编码步骤 (3)2.4哈夫曼编码特点 (4)2.5设计步骤 (4)2.5.1 以框图形式画出哈夫曼编码过程 (4)2.5.2 哈弗曼树的介绍 (5)2.5.3 计算平均码长、编码效率、冗余度 (5)第3章哈夫曼编码C语⾔实现 (7)3.1 C语⾔编程 (7)3.1.1编程环境介绍 (7)3.1.2程序介绍 (7)3.1.3程序测试 (8)3.2 运⾏结果及分析 (10)3.3 程序流程图以及说明 (11)第4章总结 (12)参考⽂献 (14)附录⼀哈夫曼编码分析与实现C语⾔源程序 (15)第1章概述1.1设计的作⽤、⽬的从信息论⾓度看,信源编码的⼀个最主要的⽬的,就是要解决数据的压缩问题。

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

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

哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。

2、熟悉掌握一门计算机语言,能够进行数据算法设计。

二、实验原理哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。

在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。

构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。

最简单的二进制编码方式是等长编码。

若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。

哈夫曼树课用于构造使电文的编码总长最短的编码方案。

主要流程图如下:三、实验步骤1:写好流程图,设计实验方案。

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

3:编码。

利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

4:译码。

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

5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

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

6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。

具体函数如下:1:Initialization() 初始化2:Encoding() 编码3:Decoding() 译码4:Print_file() 打印代码文件5:search(k,j,p) 搜索二叉树6:Print_tree() 打印二叉树7:menu() 主菜单9:main() 主函数四、实验结果与分析(1)大致个人测试案例:主界面:初始化:Huofuman.txt初始化存入文件结果如下:编码结果如下:codefile.txt编码存入文件如下:译码结果如下:textfile.txt译码存入文件如下:打印结果如下:打印树结果如下:treeprint.txt存入文件结果如下:(2)本例测试案例_1已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。

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

宜春学院本科课程设计说明书学院:数计学院专业年级:10信息与计算科学课程:信息论与编码课程设计设计题目: Huffman编码的设计与实现指导教师:赵志芳2012年12月学生姓名:刘旭东学号:1031303124中文摘要哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法。

其压缩通常在20%~90%之间。

哈夫曼编码算法使用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。

哈夫曼算法构造的扩充二叉树称为哈夫曼编码树或哈夫曼树。

当然,还有编码和译码部分。

本系统的前端开发工具是Visual C++6.0。

具有输入字符集大小及权值大小,构造哈夫曼树,并对用户输入的字符串进行编码以及译码还有退出四种功能。

本程序经过测试后,功能均能实现,运行稳定。

关键词:哈夫曼树,编码,权值英文摘要Huffman coding is widely used in data file compression coding method is very effective. The compression usually between 20% ~ 90% in. Huffman use of the character encoding algorithm in the document appeared in frequency table with 0 to build a string of optimal each character said means.The algorithm's construction huffman extended binary tree called huffman coding tree or huffman tree. Of course, there are coding and decoding parts. This system the front-end development tools is Visual c + + 6.0. With input character set size and weitht size, structure tree huffman, and user input string coding and decoding and exit four functions. This procedure after testing, functions are realized, steady operation.目录引言 (3)1、问题分析 (4)2、算法设计 (5)3、算法实现 (5)3.1流程图 (5)3.2程序代码 (6)3.3调试结果 (10)3.3.1例题5—7的测试结果 (10)3.3.2习题5-12的调试结果 (11)4、结论 (12)5、参考文献 (12)引言哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。

它是一种变长的编码。

哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。

在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。

构造好哈夫曼树后,就可根据哈夫曼树进行编码。

然而怎样构造一棵哈夫曼树呢?最具有一般规律的构造方法就是哈夫曼算法。

字符根据其出现的概率作为权值构造一棵哈夫曼树后,经哈夫曼编码得到的对应的码值。

只要使用同一棵哈夫曼树,就可把编码还原成原来那组字符。

显然哈夫曼编码是前缀编码,即任一个字符的编码都不是另一个字符的编码的前缀,否则,编码就不能进行翻译。

利用哈夫曼算法的编码和译码功能,重复地显示并处理以下项目,即构造哈夫曼树,编码及译码几项功能,直到选择退出为止。

本次设计就是为这样的一个哈夫曼的编/译码器。

哈夫曼编码所以能产生较短的码文,是因为哈夫曼树具有最小加权路径长度的二叉树。

如果叶结点的权值恰好是某个需编码的文本中各字符出现的次数,则编码后文本的长度就是该哈夫曼树的加权路径长度。

译码过程为自做向右逐一扫描码文,并从哈夫曼树的根开始,将扫到的二进制位串中的相邻位与哈夫曼树上标的0,1相匹配,以确定一条从根到叶子结点的路径,一旦到达叶子,则译出了一个字符。

再回到树根,从二进位串的下一位开始继续译码。

软件运行环境及开发工具是Visual C++6.0。

1、问题分析为了建立哈夫曼树以及实现哈夫曼编码以及译码,因此我们选择了结点结构体,利用这一结构体,我们定义了一个结构体数组和一个树根指针,数组用来纪录输入数据的多少,树根指针用来连接哈夫曼树。

从程序中可以看到使用哈夫曼算法构造哈夫曼树过程,是从n棵知识一个根结点的树组成的森林开始的。

在算法执行中,哈夫曼树是由若干棵树组成的森林,通过不断地合作树,最后得到一棵哈夫曼树。

为了便于实现哈夫曼树的建树运算,定义程序的哈夫曼树类HfmTree,它包括如下两个私有数据成员tree和weight:其中,tree是一个二叉树BinaryTree类型对象,是一棵哈夫曼树,weight是tree所代表的哈夫曼树的权值。

在本课程设计中使用函数Huffman()。

构造哈夫曼树算法:(1)用给定的一组权值{W1,W2,…,Wn},生成一个有n棵树组成的森林F={T1,T2,…Tn},其中每棵二叉树Ti只有一个结点,即权值为Wi的根结点(也是叶子结点);(2)从F中选择两棵根结点权值最小的树,作为新树根的左右子树,新树根的权值是左右子树根结点的权值之和;(3)从F中删除这两棵树,另将新二叉树加入F中;(4)重复(2)和(3),直到F中只包含一棵树为止。

本次程序设计的是哈夫曼编码。

由建立好的哈夫曼树来进行编码,构造一个CodeNode结构体用来存储编码字符及各字符的编码,从根结点开始,左走一步为‘0’,右走一步为‘1’,并将编码结果存入文件中,译码过程为从文件中逐一扫描码文,并从哈夫曼树的根开始,将扫到的二进制位串中的相邻位与哈夫曼树上标的0,1相匹配,以确定一条从根到叶子结点的路径,一旦到达叶子,则译出了一个字符。

再回到树根从二进位串的下一位开始继续译码。

使用transcode()函数即可完成。

2、算法设计Huffman编码是一种可变长编码方式,是由美国数学家David Huffman创立的,是二叉树的一种特殊转化形式。

编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。

Huffman算法的最根本的原则是:累计的(字符的统计数字*字符的编码长度)为最小,也就是权值(字符的统计数字*字符的编码长度)的和最小。

Huffman树是二叉树的一种特殊转化形式。

以下是构件Huffman树的例子:比如有以下数据, ABFACGCAHGBBAACECDFGFAAEABBB先进行统计A(8) B(6) C(4) D(1) E(2) F(3) G(3) H(1) 括号里面的是统计次数生成Huffman树:每次取最小的那两个节点(node)合并成一个节点(node),并且将累计数值相加作为新的接点的累计数值,最顶层的是根节点(root) 注:列表中最小节点的是指包括合并了的节点在内的所有节点,已经合并的节点不在列表。

3、算法实现3.1流程图:3.2程序代码:#include<stdio.h>#include<string.h>#define N 15 /*最大符号数*/#define M 2*N-1 /*编码树最大节点数*/ typedef struct /*编码树节点*/{float weight;int parent,lchild,rchild;}HTNode;typedef struct{char data;float weight;char code[N];}HTCode;void Init(HTCode hc[],int *n){int i;printf("\n input n="); /*输入n的大小*/scanf("%d",&(*n)); /*取n的地址值*/fflush(stdin);/*stdin是默认的输入流文件,对应输入缓冲区fflush(stdin)的作用就是清空输入缓冲区,避免缓冲区内残存读取函数无法取走的内容!*/printf("\n input %d character \n",*n); /*输入各个字符的代号*/for(i=1;i<=*n;i++) /*从1到n个*/{printf("\n the %d character is:",i); /*输出显示的信息提示*/scanf("%c",&(hc[i].data)); /*取hc[i]的地址所对应的data值*/fflush(stdin); /*同上*/}for(i=1;i<=*n;i++) /*从1到n输入它们各自所对应的概率大小,即重量weight*/{printf("\n the %d character weight is:",i); /*输出显示的信息提示*/scanf("%f",&(hc[i].weight)); /*取hc[i]的地址所对应的weight值*/}}void Select(HTNode ht[],int k,int *s1,int *s2) /*定义Select选择函数*/{int i; /*定义一个整形数i*/ for(i=1;i<=k;i++){if(ht[i].parent==0) /*i从1开始到k,如果i没有父节点,则把i赋给*s1,且跳出循环*/{*s1=i;break;}}for(i=1;i<=k;i++) /*找任意不是第一次的节点*/{if(ht[i].parent==0&&ht[i].weight<ht[*s1].weight) /*i再从1开始,如果此时的i没有父节点,且其重量小于*s1的重量,就把当前的i赋给*s1*/ *s1=i;}for(i=1;i<=k;i++){ /*i再从1开始,如果此时的i没有父节点,而且i不等于*s1的值,则把当前的i赋给*s2。

跳出循环*/if(ht[i].parent==0&&i!=*s1){*s2=i;break;}}for(i=1;i<=k;i++){if(ht[i].parent==0&&i!=*s1&&ht[i].weight<ht[*s2].weight)*s2=i;/*i再从1开始,如果此时的i没有父节点,而且i不等于*s1的值,其重量也小于*s2的重量,则把当前的i赋给*s2。

相关文档
最新文档