哈夫曼编码问题

本博客的代码的思想和图片参考:好大学慕课浙江大学陈越老师、何钦铭老师的《数据结构》

哈夫曼编码问题

1 引子

1.1

将百分制的考试成绩转换成五分制的成绩,程序如下:

if( score < 60 ) grade =1;
else if( score < 70 ) grade =2;
else if( score < 80 ) grade =3;
else if( score < 90 ) grade =4;
else grade =5;

那么上面这个其实是一棵判断树:

我们发现,在这个判断树中,60分以下的需要查找一次,60-69的需要查找两次

70-79需要查找三次,80-89的需要查找四次,90以上的需要查找五次

如果全部的分数集中在70—80之间,那么这棵树就不够优化。

1.2

如果我们考虑学生的成绩分布情况,如下表所示:


分数段


0-59


60-69


70-79


80-89


90以上


比例


0.05


0.15


0.40


0.30


0.10

根据上面的判断树和学生成绩的分布情况,那么我们计算平均的查找效率:

0.05*1+0.15*2+0.40*3+0.30*4+0.10*4=3.15

如何我们重新设计程序,让频率高优先判定,那么就会减少判定的次数,我们重新设计判断程序和判断树

if(score<80){

if(score<70){

if(score<60){

grade=1;

}else{

grade=2;

}

}else{

grade=3;

}

}else{

if(score<90){

grade=4;

}else{

grade=5;

}

}

这样的判断树就如下所示:


分数段


0-59


60-69


70-79


80-89


90以上


比例


0.05


0.15


0.40


0.30


0.10

那么我们再根据判断树和分数的频率来计算平均查找效率:

0.05*3+0.15*3+0.4*2+0.3*2+0.10*2=2.2

平均查找效率明星变高了。

思考:如果根据节点的频率不同,构造更高效率的搜索树

2 哈夫曼树

2.1 定义

定义:带权路径长度(WPL):设二叉树有n个叶子节点,每个节点带有权值,从根节点到每个叶子节点的长度为,则每个叶子的带权路径之和为

最优二叉树或者哈夫曼数:WPL值最小

2.2 例子

现有五个叶子节点,他们的权值为{1,2,3,4,5},用此权值序列可以构造多个不同形状的二叉树。

3哈夫曼编码

3.1例子

给定一段字符串,如何对字符进行编码,可以使得该字符串的
存储空间最少?
[例] 假设有一段文本,包含58个字符,并由以下7个字符构: a,
s, t,空格( sp),换行( nl);这7个字符出现的次数不同。如
这7个字符进行编码,使得总编码空间最少?
【 分析】
( 1)用等长ASCII编码: 58 ×8 = 464位;
( 2)用等长3位编码: 58 ×3 = 174位;
( 3)不等长编码:出现频率高的字符用的编码短些,出现频率低
的字符则可以编码长些?

3.2如何进行不等长编码

3.2.1 编码的二义性

例如:

a:1

e:0

s:10

t:11

那么1011是什么编码

aeza:1101

aet:1101

st:1011

这样就产生了编码的二义性。

那么如何避免二义性呢?使用前缀码

前缀码(prefix code):任何字符的编码都不是另一个字符编码的前缀,就可以无二义的解码

3.2.2 使用二叉树进行编码

使用二叉树进行编码:

a):左右分支表示0,1

b)字符只在叶子节点上

四个字符的频率:

a:4,u:1,x:2,z:1

那么我们可以使用二叉树进行编码

可以看出,使用二叉树进行哈夫曼编码可以减少编码的总长度

3.3 哈夫曼编码的一个具体的例子

该例子出自于:慕课浙江大学数据结构陈越老师何钦铭老师

需求:

二叉树的哈夫曼编码

 

时间: 2024-10-29 22:02:34

哈夫曼编码问题的相关文章

基于python的二元霍夫曼编码译码详细设计

一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图片转为灰度的bmp图像,此时每个像素点可以用单个像素点来表示. ②:二元霍夫曼编码: 程序流程图: 详细设计: 统计像素点频率,首先通过python自带的PIL库的图像像素点读取函数read()获取灰度图像的所有像素点,通过循环遍历每个像素点,将每个出现的像素点值以及其次数以键值对的形式放入到pyt

霍夫曼编码求节省空间

霍夫曼编码将频繁出现的字符采用短编码,出现频率较低的字符采用长编码.具体的操作过程为:i)以每个字符的出现频率作为关键字构建最小优先级队列:ii)取出关键字最小的两个结点生成子树,根节点的关键字为孩子节点关键字之和,并将根节点插入到最小优先级队列中,直至得到一棵最优编码树. 霍夫曼编码方案是基于______策略的.用该方案对包含a到f6个字符的文件进行编码,文件包含100000个字符,每个字符的出现频率(用百分比表示)如表1-3所示,则与固定长度编码相比,该编码方案节省了______存储空间.

哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 术语: i)路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径. 路径中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. ii)结点的权及带权路径长度 若对树中的每个结点赋给一个有着某种含义的数值,则这个数值称为该结点的权. 结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积. iii)树的带权路径长度 树的带权路径长度:所有叶子结点的带权路径长度之和,记为WPL. 先了解一下

《数据结构复习笔记》--哈夫曼树,哈夫曼编码

先来了解一下哈夫曼树. 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值 wk,从根结点到每个叶子结点的长度为 lk,则每个叶子结点的带权路径长度之和就是: 最优二叉树或哈夫曼树: WPL最小的二叉树. [例]有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树. 其中结果wpl最小值的是:33=(1+2)*3+(3)*2+(4+5)*2: 哈夫曼树的构造: 每次把权值最小的两棵二叉树合并, 代码: typedef struct Tr

C语言之霍夫曼编码学习

?1,霍夫曼编码描述哈夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩. 在计算机信息处理中,"哈夫曼编码"是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩.这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码.这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目

数据结构课程设计-哈夫曼编码译码

//******************************************** //程序功能:哈夫曼编码及译码 // //日期:2014年11月18 // //******************************************** #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #define MAX 128 //叶子节点

哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Method for the Construction of Minimum-Redundancy Codes>的文章.编码这种编码的过程叫做哈夫曼编码,它是一种普遍的熵编码技术,包括用于无损数据压缩领域.由于哈夫曼编码的运用广泛,本文将简要介绍: 哈夫曼编码的编码(不包含解码)原理 代码(java)实现过程 一

基于哈夫曼编码的文件压缩(c++版)

本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录一下自己写该程序学到的东西.因为本人写的程序在压缩率上,还有提升的空间,所以本文将不定期更新,但程序整体的思路不会有较大的改动. 一.基于哈夫曼编码可实现压缩文件的原理分析 在计算机中,数据的存储都是二进制的,并且以字节作为基本的存储单位,像英文字母在文本中占一个字节,汉字占两个字节,我们把这种每一

哈夫曼编码和译码

构建哈夫曼原理:(每个元素都是叶子结点,N 个元素共有 2N-1 个结点) 有 N 个带权值的结点,将其按以下方法构建:①②③ ①选取 N 个结点集合中最小的两个权值结点构造成一个新的二叉树,且设置新结点的权值为左右孩子权值之和 ②将以上选取的两个最小权值结点从原集合中删除,向集合中加入 这两个结点的跟,即 1 中创建的新结点,此时集合 元素为 N = N - 2 + 1;  ③重复 ① ② 直到只剩下一个结点,该结点就是构建的二叉树的根 哈夫曼编码原理: 在哈夫曼树中,凡是左分支,即左孩子的全

机智零崎不会没梗Ⅱ (哈夫曼编码、优先队列)

题目描述 你满心欢喜的召唤出了外星生物,以为可以变身超人拥有强大力量战胜一切怪兽,然而面对着身前高大的外星生物你一脸茫然,因为,你懂M78星云语吗?不过不用担心,因为零崎非常机智,他给出了关键性的提示:“讲道理,日语可是全宇宙通用语,所以为什么不试试和外星人讲日语呢?” 不过现在外星生物说的话都是“[email protected]#$%^&%#%I&!……”这样的东西,你要怎么转换成日语呢? 作位全宇宙通用的日语,自然有一套万能的转换算法,那就是Huffman编码转换!当然了这肯定不是普