数据结构考试-哈夫曼编码特辑

合集下载

数据结构:哈夫曼树和哈夫曼编码

数据结构:哈夫曼树和哈夫曼编码

数据结构:哈夫曼树和哈夫曼编码哈夫曼树哈夫曼树是⼀种最优⼆叉树,其定义是:给定n个权值作为n个叶⼦节点,构造⼀棵⼆叉树,若树的带权路径长度达到最⼩,这样的树就达到最优⼆叉树,也就是哈夫曼树,⽰例图如下:基本概念深⼊学习哈夫曼树前,先了解⼀下基本概念,并以上⾯的哈夫曼树图为例路径:树中⼀个结点到另⼀个结点之间的分⽀序列构成两个结点间的路径。

路径长度:路径中分⽀的数⽬,从根结点到第L层结点的路径长度为L-1。

例如100和80的路径长度为1,50和30的路径长度为2。

结点的权:树中结点的数值,例如100,50那些。

结点带权路径长度:根结点到该结点之间的路径长度与该结点的权的乘积。

如结点20的路径长度为3,该结点的带权路径长度为:3*20 = 60。

树的带权路径长度:所有叶⼦结点的带权路径长度之和,记为WPL。

例如上图树的WPL = 1100 + 280 +320 +310 = 350。

带权路径长度⽐较前⾯说到,哈夫曼树是最优⼆叉树,因为符合哈夫曼树特点的树的带权路径长度⼀定是最⼩的,我们将哈夫曼树和普通的⼆叉树做个⽐较,仍以上图为例,上图的哈夫曼树是结点10,20,50,100组成的⼆叉树,WPL是350,⽤这四个结点组成普通的⼆叉树,结果如下:不难计算,该⼆叉树的WPL = 210 + 220 + 250 + 2100 = 360,明显⽐哈夫曼树⼤,当然⼆叉树的组成结果不唯⼀,但WPL⼀定⽐哈夫曼树⼤。

所以说哈夫曼树是最优⼆叉树。

哈夫曼树的构造现在假定有n个权值,设为w1、w2、…、wn,将这n个权值看成是有n棵树的森林,根据最⼩带权路径长度的原则,我们可以按照下⾯步骤来将森林构造成哈夫曼树:1. 在森林中选出根结点的权值最⼩的两棵树进⾏合并,作为⼀棵新树的左、右⼦树,且新树的根结点权值为其左、右⼦树根结点权值之和;2. 从森林中删除选取的两棵树,并将新树加⼊森林;3. 重复1、2步,直到森林中只剩⼀棵树为⽌,该树即为所求得的哈夫曼树。

数据结构哈夫曼编码加密文件

数据结构哈夫曼编码加密文件

数据结构哈夫曼编码加密文件数据结构哈夫曼编码加密文件引言数据结构是计算机科学中非常重要的一门课程,它研究了用于组织和存储数据的各种算法和数据结构。

在计算机科学中,编码是将信息从一种形式转化为另一种形式的过程。

在信息安全领域中,加密(encryption)是保护信息不被未经授权的人员访问的过程。

本文将介绍数据结构中一种常用的编码技术——哈夫曼编码,并且将其应用于文件加密中。

1. 哈夫曼编码哈夫曼编码是一种用于数据压缩的编码技术,由David A. Huffman在1952年提出。

这种编码技术基于树形结构,通过对出现频率较高的字符使用较短的编码,对出现频率较低的字符使用较长的编码,以实现对数据的高效压缩。

哈夫曼编码的构建过程主要分为两个步骤:构建哈夫曼树和哈夫曼编码。

1.1 构建哈夫曼树构建哈夫曼树的过程是通过不断合并权值最小的两个节点,直到只剩下一个根节点。

每个节点都有一个权值,该权值是根据字符在文件中的出现频率来确定的。

在构建哈夫曼树的过程中,节点的权值扮演着重要的作用。

1.2 哈夫曼编码哈夫曼编码的过程是根据哈夫曼树的结构,为每个字符对应的编码。

向左的路径被标记为0,向右的路径被标记为1。

对于每个字符,从根节点开始,通过路径上的0和1,就可以找到对应的编码。

2. 数据结构哈夫曼编码加密文件在文件加密中,可以利用哈夫曼编码对文件中的字符进行加密。

具体的步骤如下:2.1 统计字符出现频率首先,需要统计文件中各个字符的出现频率。

可以使用字典等数据结构来记录每个字符的出现次数。

2.2 构建哈夫曼树根据统计得到的字符出现频率,构建哈夫曼树。

构建哈夫曼树的过程可以使用优先队列等数据结构来辅助。

2.3 哈夫曼编码根据构建的哈夫曼树,为每个字符对应的哈夫曼编码。

可以使用递归或者栈等数据结构来遍历哈夫曼树,编码。

2.4 加密文件利用的哈夫曼编码,对文件中的字符进行加密。

将文件中的每个字符替换为对应的哈夫曼编码。

数据结构 哈夫曼编码

数据结构 哈夫曼编码

数据结构哈夫曼编码【标题】数据结构:深入探索哈夫曼编码的奥秘【引言】数据结构是计算机科学中重要的基础知识,而哈夫曼编码作为一种经典的数据压缩算法更是备受推崇。

本文将深入探索哈夫曼编码的原理与应用,帮助读者全面理解该数据结构的大局及其潜在的威力。

通过从简到繁、由浅入深的方式,本文将层层拆解哈夫曼编码,从而带领读者揭示其背后的奥秘。

【正文】一、哈夫曼编码的概念及基本原理1. 哈夫曼编码的定义哈夫曼编码是一种变长编码方式,将出现频率较高的字符赋予较短的编码,从而实现数据压缩的目的。

其核心思想是根据字符出现频率构建一颗哈夫曼树,对于每个字符的编码规则,以其所在路径的0和1来表示。

2. 哈夫曼编码的构建过程(1)统计字符出现频率,构建字符频率表。

(2)使用字符频率表构建哈夫曼树。

(3)递归遍历哈夫曼树,生成每个字符的编码规则表。

二、哈夫曼编码的应用1. 数据压缩哈夫曼编码的最大优势在于可以有效地减少数据的存储空间,实现数据的压缩。

通过将高频字符赋予短编码,低频字符赋予长编码,哈夫曼编码可以最大程度地降低数据的存储需求。

2. 传输效率提升在数据传输过程中,哈夫曼编码可以减少数据的传输量,提高传输效率。

尤其是在网络传输中,由于带宽的限制,通过使用哈夫曼编码可以显著减少数据传输的时间和资源消耗。

3. 数据加密哈夫曼编码也可以作为一种简单的数据加密手段。

通过将字符的真实含义隐藏在编码中,哈夫曼编码为数据加密提供了一种简单而高效的方法。

三、哈夫曼编码的实际案例1. 文本文件压缩将文本文件进行哈夫曼编码压缩后,可以有效地减少存储空间的占用,提高文件的传输效率。

2. 图像文件压缩在图像文件中,像素的出现频率决定了其在哈夫曼编码中的编码长度。

对于像素出现频率较高的区域,通过哈夫曼编码可以显著减少存储空间,保持图像质量的同时提高传输效率。

3. 音频文件压缩哈夫曼编码在音频文件的压缩中也有广泛应用。

通过合理地构建哈夫曼编码表,可以实现对音频文件的高效压缩和传输。

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

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

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。

二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。

写出技术工作报告并附源程序。

三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。

2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。

实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。

2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。

②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。

③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。

④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。

3)练习通过普通树来构造霍夫曼树。

数据结构C语言哈夫曼编码译码

数据结构C语言哈夫曼编码译码

题目:哈夫曼树编码译码院系:信息工程系专业:计算机科学与技术(网络方向)*名:***学号: **********指导教师:赵莹莹刘欣日期: 2013年7月3日桂林电子科技大学信息科技学院实训报告目录一、设计思想............................. 错误!未定义书签。

1.1建立哈夫曼树的思想................. 错误!未定义书签。

1.2建立哈夫曼编码表................... 错误!未定义书签。

1.3对文件进行编码 (2)1.4对文件进行解码 (2)二、算法流程图 (3)三、运行结果 (8)四、遇到的问题及解决 (10)五、心得体会............................. 错误!未定义书签。

一、设计思想要完成哈夫曼的编码和解码需要首先建立哈夫曼树,之后对所有字符根据权重进行编码,最后再对文件内容进行编码和解码。

1.1建立哈夫曼树的思想。

首先定义适合哈夫曼树的节点类型,需要定义的有当前节点的字符,当前节点的左子、右子和父亲指针。

在建立哈夫曼树之前还需要对出现的字符和权重进行统计和记录,并且定义一个可以筛选出最小权重的函数。

初始化树节点之后开始建立哈夫曼树。

先在所有可能出现的字符中筛选出当前权重最小的两个字符,将这两个字符分别作为新节点的左子和右子建立一个小的二叉树,并将两个字符的权重之和赋值给新节点,将新二叉树放入筛选字符中,再将筛选过的两个字符从筛选列表中淘汰掉。

依次对列表中剩下的字符进行权重最小的筛选,直到根节点(如果编码表共有N个字符,则2*N-1就为最终根节点)为止,也就是当筛选列表为空的时候,哈夫曼树即建立完成。

对于哈夫曼编码树来说,由于哈夫曼编码是前缀码,所以所有要编码的字符最终都将是这颗树的叶子节点,而其它节点并没有真正的字符意义。

即当哈夫曼编码树建立之后,对树的所有叶子节点进行打印可知道是否有字符遗漏或多余。

1.2建立哈夫曼编码表。

数据结构哈弗曼编译码———c语言版

数据结构哈弗曼编译码———c语言版

HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY数据结构课程设计报告课设题目:哈夫曼(Huffman)编/译码器专业:计算机科学与技术(嵌入式)班级:计算机143姓名:王龙完成日期:2016年1月21日指导教师:魏本昌1、题目的内容及要求【问题描述】利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

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

【任务要求】一个完整的系统应具有以下功能:1)I:初始化(Initialization)。

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

2)E:编码(Encoding)。

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

3)D:译码(Decoding)。

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

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

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

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

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

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

2、需求分析利用哈夫曼树(Huffman)编/译码(一)、初始化哈夫曼树(二)、建立哈夫曼树(三)、对哈夫曼树进行编码(四)、输出对应字符的编码(五)、译码过程(六)、输出哈夫曼树3、概要设计(包括选择什么数据结构?数据结构采用哪种存储方式?选择的原因?设计哪些操作?这些操作之间的调用关系等等)选择了线性数据结构,数据结构采用顺序存储方式,选择的原因:结构简单,可以方便调用任何一个数组,无需为结点间的逻辑关系而增加额外的空间。

数据结构c+python代码6:哈夫曼树构造及编码

数据结构c+python代码6:哈夫曼树构造及编码

数据结构c+python代码6:哈夫曼树构造及编码⾸先介绍⼀下什么是哈夫曼树?给定N个权值作为N个叶⼦结点,构造⼀棵⼆叉树,若该树的带权路径长度达到最⼩,称这样的⼆叉树为最优⼆叉树,也称为哈夫曼树(Huffman Tree)。

哈夫曼树是带权路径长度最短的树,权值较⼤的结点离根较近。

哈夫曼树⼜称为最优树.1、路径和路径长度在⼀棵树中,从⼀个结点往下可以达到的孩⼦或孙⼦结点之间的通路,称为路径。

通路中分⽀的数⽬称为路径长度。

若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

2、结点的权及带权路径长度哈夫曼树哈夫曼树(3张)若将树中结点赋给⼀个有着某种含义的数值,则这个数值称为该结点的权。

结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

3、树的带权路径长度树的带权路径长度规定为所有叶⼦结点的带权路径长度之和,记为WPL。

哈夫曼树的构造假设有n个权值,则构造出的哈夫曼树有n个叶⼦结点。

n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有⼀个结点);(2) 在森林中选出两个根结点的权值最⼩的树合并,作为⼀棵新树的左、右⼦树,且新树的根结点权值为其左、右⼦树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加⼊森林;(4)重复(2)、(3)步,直到森林中只剩⼀棵树为⽌,该树即为所求得的哈夫曼树。

c代码过程分析构造哈夫曼树算法的实现可以分成两⼤部分:1、初始化:⾸先动态申请2n个单元;然后循环2n-1次,从1号单元开始,依次将1⾄2n-1所有单元中的双亲、左孩⼦、右孩⼦的下标都初始化为0;最后再循环n次,输⼊前n个单元中叶⼦节点的权值。

2、创建树:循环n-1次,通过n-1次的选择、删除与合并来创建哈夫曼树。

选择是从当前森林中选择双亲为0且权值最⼩的两个树跟节点是s1和s2;删除是指将节点s1和s2的双亲改为⾮0;合并就是将s1和s2的权值和作为⼀个新节点的权值依次存⼊到数组的第n+1之后的单元中,同时记录这个新节点左孩⼦的下标为s1,右孩⼦的下标为s2。

数据结构哈夫曼树编码

数据结构哈夫曼树编码

数据结构哈夫曼树编码一、引言二、哈夫曼树的定义1. 节点的概念2. 哈夫曼树的定义三、哈夫曼编码的概念1. 编码方式2. 码长和平均码长四、哈夫曼编码的实现方法1. 构建哈夫曼树a. 构建思路及步骤b. 构建示例图解2. 编码过程a. 编码步骤及示例图解b. 编码实现代码示例3. 解码过程a. 解码步骤及示例图解b. 解码实现代码示例五、哈夫曼编码的优缺点1. 优点2. 缺点六、应用实例七、总结一、引言:随着信息技术的飞速发展,数据处理已经成为当今社会中一个不可或缺的部分。

在数据处理中,如何高效地压缩数据是一个非常重要的问题。

而哈夫曼树编码作为一种高效的压缩算法,在数据传输和存储方面有着广泛应用。

二、哈夫曼树的定义:1. 节点的概念:哈夫曼树是一种二叉树,由根节点、左子树和右子树组成。

每个节点可以有零个或两个子节点。

叶子节点是指没有子节点的节点,而非叶子节点则至少有一个子节点。

2. 哈夫曼树的定义:哈夫曼树是一种特殊的二叉树,它的所有叶子节点都带有权值。

对于任意一个哈夫曼树,将其所有叶子节点按照权值从小到大排列,则可得到一组序列W={w1,w2,...,wn}。

哈夫曼树的构建过程就是将这组序列转化为一棵二叉树。

三、哈夫曼编码的概念:1. 编码方式:哈夫曼编码是一种前缀编码方式,即每个字符的编码都不是其他字符编码的前缀。

2. 码长和平均码长:对于一个字符c,其在哈夫曼编码中所占用的位数称为其码长Lc。

而整个字符串的平均码长Lavg则是所有字符在哈夫曼编码中所占用位数之和除以字符串长度n。

四、哈夫曼编码的实现方法:1. 构建哈夫曼树a. 构建思路及步骤:(1)将所有字符按照权值从小到大排序,构成初始节点集合。

(2)从节点集合中选出两个权值最小的节点作为左右子节点,构建一棵新的二叉树,并将该二叉树的根节点插入到节点集合中。

(3)重复步骤2,直到只剩下一个节点为止。

b. 构建示例图解:2. 编码过程a. 编码步骤及示例图解:(1)遍历哈夫曼树,对于每个叶子节点记录其路径上所有非叶子节点的左右分支信息,用0表示左分支,用1表示右分支。

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

能求哈夫曼树、哈夫曼编码,能求平均编码长度
哈夫曼树:
举个例子
有个序列是(7,9,2,6,32,3,21,10)
叫你求哈夫曼树
注意:一般小的数放左边,大的放右边。

左右节点可以互换的,编码也有不同。

哈夫曼编码没有唯一性的,它的目的是用最短的代价去表示一系列数。

步骤一:把这些点都看成是一个只有根结点的树的集合F
步骤二,选2个值最小的树
步骤三:在这些树的集合F中删除这2棵树
然后把构成一颗二叉树
变成了(5 = 2 + 3)
然后把这个树加入到集合F
5代表这棵树的权值
然后继续上述步骤
肯定是选5 和6
把这2个构成二叉树
在F中删除5 6 加入11这棵树变成了
继续上述步骤
选7 和 9
在F中删除7 和9加入16这棵树变成了
继续上述步骤选10 和11
在F中删除10 和11 加入21这棵树
继续上述步骤
选16和21 (有2个21,随便选哪个)我选那个只有一个根结点的21好了
16和21构成二叉树
在F中删除这16和21这两棵树
加入37这棵树
继续上述步骤
选21和32
构成二叉树
在F中删除21和32这2两棵树加入53这棵树
还是继续上面步骤
把F 中的两棵树合并成一棵树
完成了!
这个就是哈夫曼树
哈夫曼编码:
以上图结果为例,左边为0,右边为1,进行编码,结果如下图:
{7,9,2,6,32,3,21,10}编码为:
7的编码为000
9的编码为001
2的编码为10100
6的编码为1011
32的编码为11
3的编码为10101
21的编码为01
10的编码为100
以上述结果为例,如果题目为:
要输出的字符集D={A,B,C,D,E,F,G,H}
字符出现频率w={0.07,0.09,0.02,0.06,0.32,0.03,0.21,0.10} 对应编码就是:
(A)0.07的编码为000
(B)0.09的编码为001
(C)0.02的编码为10100
(D)0.06的编码为1011
(E)0.32的编码为11
(F)0.03的编码为10101
(G)0.21的编码为01
(H)0.10的编码为100
以上述结果为例,求
平均编码长度:
3*0.07+3*0.09+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+3*0.10=2.33
以3*0.07为例,0.07为频率w里面的0.07,因为编码是000,有3位数,所以是3。

公式是:编码位数*频率w。

以上述结果为例,如果题目为:
若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总长平均压缩多少?
答:用三位二进行数进行的等长编码平均长度为3
2.33/3=0.77=77%
其平均码长是等长码的77%。

所以平均压缩率为23%。

注释:三位二进制数(0…7)对这8个字母进行等长编码意思是:
(0)A=000,(1)B=001,(2)C=010,(3)D=011,(4)E=100,(5)F=101,(6)G=110,(7)H=111。

相关文档
最新文档