哈夫曼编码(贪心算法)

作者&投稿:荣诗 (若有异议请与网页底部的电邮联系)
~

参考: 哈夫曼编码

哈夫曼编码是一种十分有效的编码方法,广泛应用于 数据压缩
通过采用 不等长 的编码方式,根据 字符频率的不同 ,选择 不同长度的编码 ,对频率 越高 的字符采用 越短 的编码实现数据的高度压缩。
这种对频率越高的字符采用越短的编码来编码的方式应用的就是贪心算法的思想。

下面看一个例子:
假如我们有一个包含1000个字符的文件,每个字符占1个byte(1byte=8bits),则存储这100个字符一共需要8000bits。这还是有一些大的
那我们统计一下这1000个字符中总共有多少种字符,原来需要8bit来表示一个字符,如果使用更少的位数来表示这些字符,则可以减少存储空间。
假设这1000个字符中总共有a、b、c、d、e、f共6种字符,使用使用3个二进制位来表示的话,存储这1000个字符就只需要3000bits,比原来更节省存储空间。

或许还可以再压缩一下:
根据字符出现的 频率 给与字符 不等长 的编码,频率越高的字符编码越短,频率越低的字符编码越长。
它不能像等长编码一样直接按固定长度去读取二进制位,翻译成字符,为了能够准确读取翻译字符,它要求一个字符的编码不能是另外一个字符的前缀。

假设a、b、c、d、e、f这6个字符出现的频率依次降低,则我们可以给与他们这样的编码

假如字符的出现频率如图所示,按照这样的编码表示的话,总位数如图,一共2100bits,更加节省空间了

贪心策略:频率小的字符,优先入队。

步骤:
1.将每一个字符作为节点,以出现频率大小作为权重,将其都放入 优先队列 中(一个最小堆);
2.每次出队两个节点并创建一个父节点,使其权值为刚刚出队的节点的权值和,并且为两个节点的父节点(合并)。然后将这个树入队。
3.重复操作2,直到队列中只有一个元素(此时这个元素表示形式应该为一个树)时,完成创建。

创建好了树,该怎么编码呢?
我们对一个哈夫曼树,从父节点开始的所有节点,往左边标0,右边标1。那么到达叶子节点的顺次编码就可以找到了。

C:字符集合
Q:优先队列
EXTRACT-MIN:传入一个队列,出队最小的元素
INSERT:将z插入到Q中

当for循环结束之后,此时队列中只有一个元素,就是我们需要的哈夫曼树,最后返回此树即可。

假设T树已经是一个最优的树,假设x、y的频率小于等于最低处的a、b,然后交换x、a,y、b。

计算代价是否发生变化。
比如这里比较 T 变成 T ’ 后代价是否变化,发现代价变小或不变。

同理T’到T’’,又因为T本来假设就是最优的,所以只能相等
所以T’’也应该符合条件,即贪婪算法,每次取最小的两个节点出来这种做法是正确的




计算机科学与技术系列教材·算法设计与分析目录
第4章专门研究图的搜索算法,如广度优先搜索、深度优先搜索、回溯法以及各种图的特殊问题,如n-皇后问题、背包问题等。第5章介绍贪心算法,讲解了贪心选择性质和最优子结构性质的应用,包括背包问题、带有限期作业排序、哈夫曼编码和最小生成树等。第6章至第11章分别涵盖了动态规划、并行算法、分支限界法...

数据结构与算法分析
数据结构课程重在讨论软件开发过程中的方案设计阶段、同时设计编码和分析阶段的若干基本问题。此外,为了构造出好的数据结构及其实现,还需考虑数据结构及其实现的评价与选择。因此,数据结构的内容包括三个层次的五个“要素”,如图1.3所示。数据结构的核心技术是分解与抽象。通过分解可以划分出数据的三个...

几种经典算法回顾
今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路。大致翻了翻,重温了一下几种几种经典的算法,做一下小结。分治法动态规划贪心算法回溯法分支限界法分治法1)基本思想将一个问题分解为...

计算机程序设计师要学什么?
计算机程序设计是一门计算机基础课。主要学习了以下四部分:1、计算机程序设计的背景介绍。计算机程序设计这门课,最开始会介绍这门课程的相关背景,了解其发展历史。介绍一些计算机程序设计的思想。毕竟人的思想和计算机还是有所不同的。因此,了解其背景很重要。2、程序设计的算法。计算机程序设计的算法,...

oier的知识能力体系
整数理论 同余与模线性方程计算几何数据结构存储结构线性表(一级结构)静态:数组 栈 队列 广义表 字符串动态:指针链表 动态数组树(二级结构)表示法(静态、动态) 二叉树 森林图(三级结构)表示法(矩阵、邻接表、三元组)特殊结构散列表(HASH表) 并查集 线段树 后缀树 哈夫曼树与哈夫曼编码 ...

求c++数据结构问题 1.判断有向树是以v0为根的生成树; 2.求无向图的边...
、抽象数据类型 循环队列 最优二叉树 邻接矩阵和邻接表 稳定排序和不稳定排序 2、四种逻辑结构的前驱和后继的关系 3、顺序存储结构要求存储空间是连续的、元素之间的关系用下标表示;链式存储要求存储空间是不连续的,元素之间的关系用指针表示。4、T(n)和S(n)分别表示什么?5、何谓上溢...

信息学的技术发展
整数理论 同余与模线性方程计算几何数据结构存储结构线性表(一级结构)静态:数组 栈 队列 广义表 字符串动态:指针 链表 动态数组树(二级结构)表示法(静态、动态) 二叉树 森林图(三级结构)表示法(矩阵、邻接表、三元组)特殊结构散列表(HASH表) 并查集 线段树 后缀树 哈夫曼树与哈夫曼编码 ...

请高手回答:什么是行程编码? 请解释!
2009-01-05 哈夫曼编码算法的实现 40 2007-12-21 贪心算法实现哈夫曼编码 14 2008-12-08 求C++编码 来压缩 解压 文件 (哈弗曼算法)! 36 更多关于行程编码的知识 > 网友都在找: 行程编码. 码长 二维行程编码 zigzag编码 正在求助 换一换 回答问题,赢新手礼包 苦等15分钟: 制动和脚刹的结构原理,谁...

C语言常用算法分析的目录
第1篇 算法基础篇第1章 程序之魂——算法( 自学视频、源程序:配套资源\\mr\\01\\) 21.1 魂之说 31.2 算法的特性 41.3 算法的表示方式 51.3.1 用自然语言描述算法 51.3.2 用流程图描述算法 51.3.3 用N-S图描述算法 81.3.4 用计算机语言描述算法 91.4 算法性能分析与度量...

greedy 是什么意思
Greedy是指在一个决策过程中,始终选择当前最优的方案,而不考虑它对未来决策的影响。在某些场景下,greedy算法能够获取到最优解,一些经典的优化问题,如背包问题、最小生成树问题、赫夫曼编码就可以使用贪心算法求解。然而,在其他场景中,贪心算法可能会失效,例如在一些带有约束性的问题中,简单的贪心...

丁青县15823213100: 贪心算法实现哈夫曼编码
倚爱多糖: // 哈夫曼编码(算法) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码 typedef struct { unsigned int weight; //用来存放各个结点的权值 unsigned int parent,LChild,RChild; ...

丁青县15823213100: 什么是哈夫曼算法 -
倚爱多糖: 题目的阐述: 以n进制编码方式对一个英文字串中的字符进行编码,每个不同的字符其编码不同.使得由新的编码替代原串后总码长最小,且输入0,1,2,...,n-1构成的数字串后,依照该编码方式可以正确的对译出唯一的英文原串. 如: n=3 英文原...

丁青县15823213100: 几种经典算法回顾 -
倚爱多糖: 今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路.大致翻了翻,重温了一下几种几种经典的算法,做一下小结....

丁青县15823213100: 什么是哈夫曼编码? -
倚爱多糖: 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种. Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作...

丁青县15823213100: 用动态规划解决矩阵链乘法问题时,最优子结构问题是什么 -
倚爱多糖: 1、两种重要算法思想: 动态规划,贪心算法 2、动态规划: 基本原理:动态规划英文名dynamic programming.其中pogramming指的是表格法,而非编写计算机程序.因此,可以初步得出动态规划的基本思想:将一个具有最优子结构性质的...

丁青县15823213100: 有关哈夫曼树的代码 -
倚爱多糖: 我想讲下 哈夫曼是贪心的思想 每次选两个 最小的加到树中1.较简单2 3.#include #include int hf[202][3];//0-p 1-l 2-r double hfw[202]; int n; void G(int nn,int &a,int &b) //找两个最小的 {int i;double t1,t2,t3;for(i=1,t1=t2=200;i {if(hf[i][0]==-1...

丁青县15823213100: 求解,关于数据结构的哈夫曼编码的问题 -
倚爱多糖: 方案一应该指的就是下面那个图了.下面那个图是一棵二进制的哈夫曼树,其中因为是二进制编码,所以使用的是0\1的边.那么对于每一个叶子节点来说,从根节点到叶子节点走过的边就是这个数字的编码.那么举一个例子,比如频数=2的也就是最...

丁青县15823213100: 哈夫曼编码原理 -
倚爱多糖: 原发布者:a2420092945 Huffman树及其应用一、最优二叉树(霍夫曼树)预备知识:若干术语路d径:由一结点到另一结点间的分支所构成a→e的路径长度=2beacfg路径长度:路径上的分支数目树长度=10树的路径长度:从树根到每一结点的...

丁青县15823213100: 哈夫曼编码的编码方法怎样?
倚爱多糖: 哈夫曼编码是一种编码方式,是可变字长编码(VLC)的一种.以哈夫曼树-即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩. 在计算机信息处理中,“...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网