哈夫曼编码

二叉树的应用——哈夫曼编码

懵懂的女人 提交于 2019-12-21 23:50:08
程序要求 构建一个赫夫曼树编/译码器。根据提供的字符集和统计结果,按赫夫曼算法构造赫夫曼树,根据赫夫曼树得到每个赫夫曼编码并输出结果,能够将一个字符串转化为对应的赫夫曼编码串,能够将赫夫曼编码字符串译码。 数据结构题集(C语言版)清华大学出版社 p149 5.2 程序代码 # include <stdio.h> # include <malloc.h> # include <string.h> typedef int Status ; typedef char TElemType ; # define ERROR 0 # define OK 1 # define N 4 typedef struct { unsigned int weight ; unsigned int parent , lchild , rchild ; } HTNode , * HuffmanTree ; //动态分配数组存储赫夫曼树,Huffmantree是指针->HTNode typedef char * * HuffmanCode ; //动态分配数组存储赫夫曼编码表 void select ( HuffmanTree HT , int k , int & s1 , int & s2 ) //select函数,从一组数中选出两个最小者 { //假设s1对应的权值总是<=s2对应的权值 int tmp =

最优二叉树&&哈夫曼编码

大憨熊 提交于 2019-12-20 18:06:52
树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。 树的带权路径长度(weighted path length of tree,wpl) 结点的权值:在一些应用中,赋予树中结点的一个有某种意义的实数、 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积 树的带权路径长度(wpl):定义为树中所有结点的带权路径长度之和 最优二叉树 在权为w1,w2,...,wn的n个 叶子结点 所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树成为最优二叉树。 注意: 叶子上的权值均相同时,完全二叉树一定是最优二叉树,否则完全二叉树不一定是最优二叉树。 最优二叉树中,权值越大的叶子结点离根越近 最优二叉树的形态不唯一,wpl最小 构造最优二叉树 哈夫曼算法 根据给定的n个权值w1,w2,...,wn构成n棵二叉树的森林F={T1,T2,..,Tn},其中每棵二叉树Ti中只有一个权值为wi的根节点,其左右子树均为空。 在森林F中选出两棵根结点权值最小的树(当这种的树不止两棵时,可以从中任选两棵),将这两棵树和并称一棵新树,为了保证新树仍是二叉树,需要增加一个新结点作为新树的根,并将所选的两棵树根分别作为新树的左右孩子,将这两个孩子的权值之和作为新树根的权值 对新的森林F重复2,直到森林F只剩一棵树为止。 注意

【转】数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

放肆的年华 提交于 2019-12-19 12:40:47
以上转载自 http://www.cnblogs.com/QG-whz/p/5175485.html 阅读目录 0. 数据结构图文解析系列 1. 哈夫曼编码简介 2. 哈夫曼树简介 哈夫曼树的定义 3. 构造哈夫曼树 3.1 哈夫曼树的节点结构 3.2 哈夫曼树的抽象数据类型 3.3 哈夫曼树的构造步骤 3.4 哈夫曼树的其他操作 3.5 哈夫曼树代码测试 4. 再看哈夫曼编码 5. 哈夫曼树完整代码 正文 回到顶部 0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现 回到顶部 1. 哈夫曼编码简介 哈夫曼编码(Huffman Coding)是一种编码方式,也称为“赫夫曼编码”,是David A. Huffman1952年发明的一种构建极小多余编码的方法。 在计算机数据处理中,霍夫曼编码使用 变长编码表 对源符号进行编码

哈夫曼树与哈夫曼编码

女生的网名这么多〃 提交于 2019-12-19 12:40:03
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码。 首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树, 是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点 的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度 为叶结点的层数)。树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln) ,N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径 长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。 哈夫曼编码步骤: 一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。) 二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。 三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。 四、重复二和三两步

哈夫曼树与哈夫曼编码

不羁岁月 提交于 2019-12-19 12:39:41
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码。 首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树, 是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点 的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度 为叶结点的层数)。树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln) ,N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径 长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。 哈夫曼编码步骤: 一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。) 二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。 三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。 四、重复二和三两步

哈夫曼编码

◇◆丶佛笑我妖孽 提交于 2019-12-12 07:15:28
哈夫曼编码 哈夫曼编码主要是用于 文件压缩和加密解密。 哈夫曼编码的理解:https://blog.csdn.net/qq_36653505/article/details/81701181 哈夫曼树的创建 为每个字符都创建一个Node 对象,放入列表中然后根据其使用频率从大到小进行排序。 从列表的末尾拿(取出并删除)两个节点组成一个新的节点,新节点的值为两个子节点的和,然后将这个新节点重新插入到列表当中。 重复2.当列表中只有一颗树的时候,即成功生成哈夫曼树。 《Java数据结构和算法》第二版的图示。 图片是从小到大排序的。 来源: CSDN 作者: afei111111 链接: https://blog.csdn.net/afei111111/article/details/103486706

哈夫曼树的建立

寵の児 提交于 2019-12-06 04:51:27
#include<stdio.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define MAXVALUE 10000 typedef struct{ int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char **HuffmanCode; void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n); void Select(HuffmanTree t, int k, int *s1, int *s2); void main() { HuffmanTree HT;HTNode t; HuffmanCode HC; int n,w[8] ={5, 29, 7, 8, 14, 23, 3, 11}; HT = &t; n = 8; HuffmanCoding(HT,&HC,w,n); } void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n){ HuffmanTree p; int i,m,s1,s2,start,c,f,j; char *cd; if(n<=1)

哈夫曼编解码解压缩文件—C++实现

丶灬走出姿态 提交于 2019-12-05 18:06:56
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩。本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现。 哈夫曼编码的概念 哈夫曼树又称作最优树,是一种带权路径长度最短的树,而通过哈夫曼树构造出的编码方式称作哈夫曼编码。 也就是说哈夫曼编码是一个通过哈夫曼树进行的一种编码,一般情况下,以字符 “0” 与 “1” 表示。编码的实现过程很简单,只要实现哈夫曼树,通过遍历哈夫曼树,这里我们从根节点开始向下遍历,如果下个节点是左孩子,则在字符串后面追加 “0”,如果为其右孩子,则在字符串后追加 “1”。结束条件为当前节点为叶子节点,得到的字符串就是叶子节点对应的字符的编码。 哈夫曼树实现 根据贪心算法的思想实现,把字符出现频率较多的字符用稍微短一点的编码,而出现频率较少的字符用稍微长一点的编码。哈夫曼树就是按照这种思想实现,下面将举例分析创建哈夫曼树的具体过程。下面表格的每一行分别对应字符及出现频率,根据这些信息就能创建一棵哈夫曼树。 字符 出现频率 编码 总二进制位数 a 500 1 500 b 250 01 500 c 120 001 360 d 60 0001 240 e 30 00001 150 f 20 00000 100 如下图,将每个字符看作一个节点,将带有频率的字符全部放到优先队列中

哈夫曼编码实践

好久不见. 提交于 2019-12-05 14:20:37
实践内容 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。 给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。 并完成对英文文件的编码和解码。 要求: (1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 (2)构造哈夫曼树 (3)对英文文件进行编码,输出一个编码后的文件 (4)对编码文件进行解码,输出一个解码后的文件 (5)撰写博客记录实验的设计和实现过程,并将源代码传到码云 (6)把实验结果截图上传到云班课 实践过程 读取文件 构造哈夫曼树 哈夫曼树被称为最优树,有着二叉树的所有性质,但是要带上权重和记住左边的编码为“0”,右边的编码为“1”,所以重写了哈弗曼树的节点类 private T data;//数据 public T getData() { return data; } public void setData(T data) { this.data = data; } protected double weight;//权重 protected Node<T> leftChild; protected Node<T> rightChild; public String codeNumber; public Node(T

20182323 哈夫曼编码测试

孤街浪徒 提交于 2019-12-05 11:24:25
20182323 哈夫曼编码测试 课程:《程序设计与数据结构》 班级: 1823 姓名: 曹骞 学号: 20182323 实验教师:王志强 实验日期:2019年10月21日 必修/选修: 必修 1.实验内容 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。 给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。 并完成对英文文件的编码和解码。 要求: 1.准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 2.构造哈夫曼树 3.对英文文件进行编码,输出一个编码后的文件 4.对编码文件进行解码,输出一个解码后的文件 2.实现过程 哈夫曼树的建立 (1) 8个结点的权值大小如下: (2). 从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出这两个结点的和5。 (3). 从19,21,6,7,10,32,5中选出两个权小结点。选中 5,6。同时计算出它们的和11。 (4). 从19,21,7,10,32,11中选出两个权小结点。选中7,10。同时计算出它们的和17。(PS:这时选出的 两个数字都不是已经构造好的二叉树里面的结点 ,所以要另外开一棵二叉树;或者说, 如果两个数的和正好是下一步的两个最小数的其中的一个