对哈夫曼树唯一性的探讨

开发研究与设计技术

本栏目责任编辑:谢媛媛

对哈夫曼树唯一性的探讨

沈音乐

(杭州职业技术学院,浙江杭州310018)

摘要:在我们的日常教学中,我们经常会对哈夫曼树的建立给出不同答案,那么是否有唯一标准答案?通过相关程序流程及代码实验,分析了导致认为创建哈夫曼树不唯一的原因,说明了在一种既定的算法下,我们是可以达到哈夫曼树建立的唯一性的。

关键词:哈夫曼树;哈夫曼算法;权值;唯一性中图分类号:TP311.12文献标识码:A文章编号:1009-3044(2007)20-40442-02

DiscussionontheUniquenessforCreatetheBinaryTreebyHuffmanAlgorithm

SHENYin-yue

(HangzhouVocationTechnologyCollege,Hangzhou310018,China)

Abstract:Therearemanycaseinourdailyeducationwork:peopleoftenfindthattheycanworkoutdifferentanswersforacreationofbi-narytreebyHuffmanalgorithm.TheprogramflowandcodesexplainthereasonwhysomepeoplecannotworkoutthesameanswerbasedonHuffmanalgorithm,andfinally,provethatwecangetauniquebinarytreebytheHuffmanalgorithm.

Keywords:BinarytreebasedonHuffmanalgorithm;Huffmanalgorithm;weight;Uniqueness

1概述

我们的二叉树的应用教学中,最优二叉树是重要的内容,而哈夫曼编码又是实用性最强的技术,要完成哈夫曼编码,首先要创建哈夫曼树,哈夫曼树又称为最优二叉树,它是这样定义的:设有n个权值{w1,w2,…,wn},在这些权值为各个叶子结点的权所构成的二叉树中,带权路径长度WPL最小的二叉树叫做哈夫曼树。哈夫曼(Huffman)于1952年提出了得到这种树的算法,因此相应的算法称为哈夫曼算法。一般的教科书上多是讲述了哈夫曼算法的三个步骤:

(1)将n个权值{w1,w2,…,wn}按递增次序排列,设其顺序为w1,w2,…,wn,取出最小的两个w1和w2,分别作为根结点的左、右儿子结点的权组成一个二叉树,并认为其根结点的权w12=w1+

图2

情况3如图3所示:

w2;

(2)将w12按其数值大小插入到w3至wn之间,使数值仍保持为递增的次序;

右儿子的权组成二叉树,(3)再取出最小的两个作为根的左、

也令根的权等于此两数值之和,并同样将此根结点按权值大小插入到剩下的数据中,保持数值的递增次序。如此重复进行下去,直到构成一个二叉树为止,即得到哈夫曼树。

左边结果是正确的。情况4如图4所示:

图3

2问题分析

按照以上这样的程度讲授,经常会遇到如下情况:一般教师给出一个数列,希望学生给出相应得Huffman树,并都有一个标准答案。但我们在讲课时哈夫曼树只讲其解题思路,并不提及具体的编码,这势必造成学生在不了解计算机计算步骤的情况下,对类似以下四种情况产生困惑:(我们暂时以哈夫曼编码时以字母频度计算权值为例)情况1如图1所示:

图4

图1

比如对于原始输入数列:chartext[128]="AB";左边结果就是正确的。

情况2如图2所示:

A权值最小,放在左边结果是正确的。

其中右边结果是正确的。

以上四种情况,我们来逐一进行分析:

当两个字母的权值(出现的频度)相等时,如何安排左右子树?我们的程序开始时都有数据输入,数据输入是有先后的(有序性),答案在于此,因为只有大小不等才会发生最小值的变动,在没有大小差异的情况下,输入的原始数列是不会发生易位的,故原始序列中,相等的两个值谁在前,谁将放置在最小值中,谁在后,谁将放置在次小值中。程序中,首先定义了两个最小值min1,min2,而min1与min2之间的关系是确定的,即min1<min2,min1与min2次小,对应得代码:

if(t->arr[i].weight<min2){/*结点的权比最次小权小*/if(t->arr[i].weight<min1){/*如果它比最小的结点还小*/

min2_i=min1_i;min2=min1;

min1_i=i;min1=t->arr[i].weight;//则它成为最小结点}

收稿日期:2007-09-18

作者简介:沈音乐(1973-),女,上海人,讲师,硕士,研究方向为软件工程、数据挖掘和信息编码。

442

电脑知识与技术

本栏目责任编辑:谢媛媛

开发研究与设计技术

else{

min2_i=i;min2=t->arr[i].weight;//则它成为次小结点}}

当有不同大小时,是放在左子树上,还是放在有子树上?结论是min1放在左子树上,min2放在有子树上。对应代码段:

t->arr[t->total].lchild=min1_i;t->arr[t->total].rchild=min2_i;

新生成的二叉树,根结点的权值与原有结点权值相等,是放

因为从情在左子树上,还是放在有子树上?结论是放在有子树上。

况1看,首先我们的输入序列为arr[0]…arr[n-1],新的根结点生成后是以[n]…[2n-1]的序列出现的,所以从次序上可知,新生成的结点只能落在原有数列之后,当权值相等时未发生大小易位,故按照情况1一样,后者放在新根结点的右边。

当新生成的根结点权值与次小的相同时,是否替代次小的位置?结论是否定的。因为新增的根结点排位在后arr[++total],所以再次组合时,该根结点排在右子树。对应代码:

t->total++;

t->arr[t->total].weight=min1+min2;

t->arr[t->total].parent=-1;//新生成结点标志创建哈夫曼树的程序流程现分析如图5所示。

由以上分析,我们可以发现,如果按这样的流程建立哈夫曼树,答案肯定是唯一的。

许多教科书上所说的“将n个权值{w1,w2,…,wn}按递增次序排列,设其顺序为w1,w2,…,wn,取出最小的两个w1和w2,分别作为根结点的左、右儿子结点的权组成一个二叉树,…..将w12按其数值大小插入到w3至wn之间,使数值仍保持为递增的次

右儿子的权组成二叉树,也序;…;再取出最小的两个作为根的左、

令根的权等于此两数值之和,并同样将此根结点按权值大小插入到剩下的数据中,保持数值的递增次序。如此重复进行下去,直到构成一个二叉树为止,即得到哈夫曼树。”这里算法描述强调了首先排序,然后取最小的两个,没有说明左右摆放的细节。而排序的方法是不一定的,如果选择的排序的算法是不稳定的,那么对于同样大小的权值,排序后就可能颠倒次序。这样的描述,因为缺少重要的细节,而又没有具体程序相辅,无法给大多数读者一个明确的解题过程。这就是造成认为不唯一的原因。

图5

(2)最小值成为左孩子结点,次小值成为右孩子结点,最终决定了在哈夫曼树种的一个重要特征:同层从左到右,结点的权值是由小到大排列的。

明确这两点,再繁琐的数列转化成哈夫曼树,都会得到唯一的一个解。

参考文献:

[1]严蔚敏,吴伟民编著.数据结构(C语言版)[M].北京:清华大学出版社,1997.

[2]佟维,谢爽等编著.实用数据结构[M].北京:科学出版社,2003.

[3]徐长梅,严洁.Huffman编码的一种实现方法[J].长沙大学学报,1997(2):62-67.

[4]邱林海,余胜生,周敬利.快速Huffman解码算法及其实现[J].计算机工程与应用,1999(4):1-3.

[5]王群芳.哈夫曼编码的另一种实现算法.[J].安徽教育学院学报,2006,24(6):36-38.

[2]李红臣,史美林.工作流模型及其形式化描述.计算机学报,2003.11.

[3]唐邦志,魏生民,景韶宇,周欣.工作流网XPDL映射.计算机工程与应用,2003.36.

[4]马达,严隽薇,戴毅茹.可视化工作流管理系统的设计与开发.制造业自动化2004.11

技术、应用.电子工[5]史美林.计算机支持的协同工作-概念、

业出版社,2001.

[6]胡锦敏,张申生.支持动态企业联盟的敏捷工作流系统.计算机研究与进展,1999.3:17-23.

[7][美]ErichGammaRichardHelmRalphJohnsonJohnVlis-sides.著.李英军,马晓星.等.译.设计模式-可复用面向对象软件的基础.机械工业出版社.2000.9:60-75.

[8]赵仲孟.等.基于EJB和JMS实现的Workflow系统.计算机应用研究,2003.6:32-34.

3结论

综合以上的分析,有两个关键性的认识:

(1)min1,min2的存储内容。min1小于min2,min1是最小值,min2则是次小值;在P147中提到的算法6.12,关键在于select()函数的实现,中未说明select的结果s1,s2的大小,这是一个不够明确之处,以致读者不能从程序中得到有力的证明,进而也就不能明确得到唯一的哈夫曼树,同样的疏漏在许多参考书上都有,究其缘由,主要事在翻译国外原著时,没能将唯一性的证明写入。

(上接第434页)

异),提高了活动定义的复用能力。

解析和执行,但采ECA规则很适合工作流过程定义的存储、

用ECA规则进行建模,也存在一些缺点,主要是缺少有力的模型分析手段,无法确保复杂结构建模的正确性,需要借助其他具有严

分析、验证,再转换格数学基础的建模工具(如petri网)进行建模、

成ECA规则模型。

因此,本系统在工作流引擎中采用ECA规则的工作流模型作为其存储和执行对象,将过程定义工具与过程执行系统分离,任何过程定义工具定义的过程描述都必须通过转换工具转换为本引擎所支持的ECA规则式的工作流定义语言,这样,当过程定义工具变化时,只修改转换工具,而工作流引擎无须变动。

参考文献:

[1]徐正权,王治国.基于ECA规则的工作流过程建模.计算机工程与科学,2005.5:105-108.

443

开发研究与设计技术

本栏目责任编辑:谢媛媛

对哈夫曼树唯一性的探讨

沈音乐

(杭州职业技术学院,浙江杭州310018)

摘要:在我们的日常教学中,我们经常会对哈夫曼树的建立给出不同答案,那么是否有唯一标准答案?通过相关程序流程及代码实验,分析了导致认为创建哈夫曼树不唯一的原因,说明了在一种既定的算法下,我们是可以达到哈夫曼树建立的唯一性的。

关键词:哈夫曼树;哈夫曼算法;权值;唯一性中图分类号:TP311.12文献标识码:A文章编号:1009-3044(2007)20-40442-02

DiscussionontheUniquenessforCreatetheBinaryTreebyHuffmanAlgorithm

SHENYin-yue

(HangzhouVocationTechnologyCollege,Hangzhou310018,China)

Abstract:Therearemanycaseinourdailyeducationwork:peopleoftenfindthattheycanworkoutdifferentanswersforacreationofbi-narytreebyHuffmanalgorithm.TheprogramflowandcodesexplainthereasonwhysomepeoplecannotworkoutthesameanswerbasedonHuffmanalgorithm,andfinally,provethatwecangetauniquebinarytreebytheHuffmanalgorithm.

Keywords:BinarytreebasedonHuffmanalgorithm;Huffmanalgorithm;weight;Uniqueness

1概述

我们的二叉树的应用教学中,最优二叉树是重要的内容,而哈夫曼编码又是实用性最强的技术,要完成哈夫曼编码,首先要创建哈夫曼树,哈夫曼树又称为最优二叉树,它是这样定义的:设有n个权值{w1,w2,…,wn},在这些权值为各个叶子结点的权所构成的二叉树中,带权路径长度WPL最小的二叉树叫做哈夫曼树。哈夫曼(Huffman)于1952年提出了得到这种树的算法,因此相应的算法称为哈夫曼算法。一般的教科书上多是讲述了哈夫曼算法的三个步骤:

(1)将n个权值{w1,w2,…,wn}按递增次序排列,设其顺序为w1,w2,…,wn,取出最小的两个w1和w2,分别作为根结点的左、右儿子结点的权组成一个二叉树,并认为其根结点的权w12=w1+

图2

情况3如图3所示:

w2;

(2)将w12按其数值大小插入到w3至wn之间,使数值仍保持为递增的次序;

右儿子的权组成二叉树,(3)再取出最小的两个作为根的左、

也令根的权等于此两数值之和,并同样将此根结点按权值大小插入到剩下的数据中,保持数值的递增次序。如此重复进行下去,直到构成一个二叉树为止,即得到哈夫曼树。

左边结果是正确的。情况4如图4所示:

图3

2问题分析

按照以上这样的程度讲授,经常会遇到如下情况:一般教师给出一个数列,希望学生给出相应得Huffman树,并都有一个标准答案。但我们在讲课时哈夫曼树只讲其解题思路,并不提及具体的编码,这势必造成学生在不了解计算机计算步骤的情况下,对类似以下四种情况产生困惑:(我们暂时以哈夫曼编码时以字母频度计算权值为例)情况1如图1所示:

图4

图1

比如对于原始输入数列:chartext[128]="AB";左边结果就是正确的。

情况2如图2所示:

A权值最小,放在左边结果是正确的。

其中右边结果是正确的。

以上四种情况,我们来逐一进行分析:

当两个字母的权值(出现的频度)相等时,如何安排左右子树?我们的程序开始时都有数据输入,数据输入是有先后的(有序性),答案在于此,因为只有大小不等才会发生最小值的变动,在没有大小差异的情况下,输入的原始数列是不会发生易位的,故原始序列中,相等的两个值谁在前,谁将放置在最小值中,谁在后,谁将放置在次小值中。程序中,首先定义了两个最小值min1,min2,而min1与min2之间的关系是确定的,即min1<min2,min1与min2次小,对应得代码:

if(t->arr[i].weight<min2){/*结点的权比最次小权小*/if(t->arr[i].weight<min1){/*如果它比最小的结点还小*/

min2_i=min1_i;min2=min1;

min1_i=i;min1=t->arr[i].weight;//则它成为最小结点}

收稿日期:2007-09-18

作者简介:沈音乐(1973-),女,上海人,讲师,硕士,研究方向为软件工程、数据挖掘和信息编码。

442

电脑知识与技术

本栏目责任编辑:谢媛媛

开发研究与设计技术

else{

min2_i=i;min2=t->arr[i].weight;//则它成为次小结点}}

当有不同大小时,是放在左子树上,还是放在有子树上?结论是min1放在左子树上,min2放在有子树上。对应代码段:

t->arr[t->total].lchild=min1_i;t->arr[t->total].rchild=min2_i;

新生成的二叉树,根结点的权值与原有结点权值相等,是放

因为从情在左子树上,还是放在有子树上?结论是放在有子树上。

况1看,首先我们的输入序列为arr[0]…arr[n-1],新的根结点生成后是以[n]…[2n-1]的序列出现的,所以从次序上可知,新生成的结点只能落在原有数列之后,当权值相等时未发生大小易位,故按照情况1一样,后者放在新根结点的右边。

当新生成的根结点权值与次小的相同时,是否替代次小的位置?结论是否定的。因为新增的根结点排位在后arr[++total],所以再次组合时,该根结点排在右子树。对应代码:

t->total++;

t->arr[t->total].weight=min1+min2;

t->arr[t->total].parent=-1;//新生成结点标志创建哈夫曼树的程序流程现分析如图5所示。

由以上分析,我们可以发现,如果按这样的流程建立哈夫曼树,答案肯定是唯一的。

许多教科书上所说的“将n个权值{w1,w2,…,wn}按递增次序排列,设其顺序为w1,w2,…,wn,取出最小的两个w1和w2,分别作为根结点的左、右儿子结点的权组成一个二叉树,…..将w12按其数值大小插入到w3至wn之间,使数值仍保持为递增的次

右儿子的权组成二叉树,也序;…;再取出最小的两个作为根的左、

令根的权等于此两数值之和,并同样将此根结点按权值大小插入到剩下的数据中,保持数值的递增次序。如此重复进行下去,直到构成一个二叉树为止,即得到哈夫曼树。”这里算法描述强调了首先排序,然后取最小的两个,没有说明左右摆放的细节。而排序的方法是不一定的,如果选择的排序的算法是不稳定的,那么对于同样大小的权值,排序后就可能颠倒次序。这样的描述,因为缺少重要的细节,而又没有具体程序相辅,无法给大多数读者一个明确的解题过程。这就是造成认为不唯一的原因。

图5

(2)最小值成为左孩子结点,次小值成为右孩子结点,最终决定了在哈夫曼树种的一个重要特征:同层从左到右,结点的权值是由小到大排列的。

明确这两点,再繁琐的数列转化成哈夫曼树,都会得到唯一的一个解。

参考文献:

[1]严蔚敏,吴伟民编著.数据结构(C语言版)[M].北京:清华大学出版社,1997.

[2]佟维,谢爽等编著.实用数据结构[M].北京:科学出版社,2003.

[3]徐长梅,严洁.Huffman编码的一种实现方法[J].长沙大学学报,1997(2):62-67.

[4]邱林海,余胜生,周敬利.快速Huffman解码算法及其实现[J].计算机工程与应用,1999(4):1-3.

[5]王群芳.哈夫曼编码的另一种实现算法.[J].安徽教育学院学报,2006,24(6):36-38.

[2]李红臣,史美林.工作流模型及其形式化描述.计算机学报,2003.11.

[3]唐邦志,魏生民,景韶宇,周欣.工作流网XPDL映射.计算机工程与应用,2003.36.

[4]马达,严隽薇,戴毅茹.可视化工作流管理系统的设计与开发.制造业自动化2004.11

技术、应用.电子工[5]史美林.计算机支持的协同工作-概念、

业出版社,2001.

[6]胡锦敏,张申生.支持动态企业联盟的敏捷工作流系统.计算机研究与进展,1999.3:17-23.

[7][美]ErichGammaRichardHelmRalphJohnsonJohnVlis-sides.著.李英军,马晓星.等.译.设计模式-可复用面向对象软件的基础.机械工业出版社.2000.9:60-75.

[8]赵仲孟.等.基于EJB和JMS实现的Workflow系统.计算机应用研究,2003.6:32-34.

3结论

综合以上的分析,有两个关键性的认识:

(1)min1,min2的存储内容。min1小于min2,min1是最小值,min2则是次小值;在P147中提到的算法6.12,关键在于select()函数的实现,中未说明select的结果s1,s2的大小,这是一个不够明确之处,以致读者不能从程序中得到有力的证明,进而也就不能明确得到唯一的哈夫曼树,同样的疏漏在许多参考书上都有,究其缘由,主要事在翻译国外原著时,没能将唯一性的证明写入。

(上接第434页)

异),提高了活动定义的复用能力。

解析和执行,但采ECA规则很适合工作流过程定义的存储、

用ECA规则进行建模,也存在一些缺点,主要是缺少有力的模型分析手段,无法确保复杂结构建模的正确性,需要借助其他具有严

分析、验证,再转换格数学基础的建模工具(如petri网)进行建模、

成ECA规则模型。

因此,本系统在工作流引擎中采用ECA规则的工作流模型作为其存储和执行对象,将过程定义工具与过程执行系统分离,任何过程定义工具定义的过程描述都必须通过转换工具转换为本引擎所支持的ECA规则式的工作流定义语言,这样,当过程定义工具变化时,只修改转换工具,而工作流引擎无须变动。

参考文献:

[1]徐正权,王治国.基于ECA规则的工作流过程建模.计算机工程与科学,2005.5:105-108.

443


相关内容

  • 信息论与编码第二版复习课件第五章
  • 第5章 信源编码 第 5 章 信源编码 5.1 编码的定义 5.2 无失真信源编码 5.3 限失真信源编码定理 5.4 常用信源编码方法简介 1 1 第5章 信源编码 编码 通信的实质是传输信息,通信系统的性能指标主 要有有效性.可靠性.安全性等,这些指标正是信息 论研究的对象.编码的目的是为了优化 ...

  • [故事会][作品赏析]看不见的敌人
  • 二战结束后,瑞士伯尔尼搬来了一对夫妻,丈夫佩夫曼五十岁左右,是个做木材生意的商人:夫人朱莉是个貌美的少妇.然而谁也不会想到,这个外表谦和的佩夫曼先生,竟然是二战时德国纳粹的高级军官,还是个出色的狙击手,被他亲手杀死的犹太人不计其数.战争结束前夕,佩夫曼这只老狐狸敏锐地察觉到失败的预兆,他带着从犹太人 ...

  • 身体社会学眼中的两性健身
  • 摘 要:通过梳理身体社会学的理论观点,以<健与美>期刊为考察样本,提取杂志所传达的健身理念与商业信息,运用福柯.布迪厄.戈夫曼以及女性主义的理论思考两性在健身活动中体现出来的身体.身体资本以及性别不平等等相关问题,肯定女性身体解放的同时,也被男性主导的消费文化所束缚. 关键词:健身:身体 ...

  • 霍夫曼编码
  • <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实验原理 通信的根本问题是如何将信源输出的信息在接收端的信宿精确或近似的复制出来.为了有效地复制信号, ...

  • 自适应霍夫曼编码
  • 哈尔滨工业大学(威海) 自适应霍夫曼编码 信息论论文 隋沛君 10S030092 一.霍夫曼编码概述: Huffman 算法是一种用于数据压缩的算法,由D.A. Huffman 最先提出.它完全依据字符出现概率来构造平均长度最短的编码,有时称之为最佳编码,一般叫做Huffman编码.频繁使用的数据用 ...

  • 新闻的框架理论简介
  • 新闻的框架理论简介 新闻学传播学研究中的框架理论(Framing theory),源自美国社会学家欧文·戈夫曼(Erving Goffman)的思想.不过,戈夫曼的框架概念却是借用人类学家.心理学家柏特森(Bateson,G)的.框架概念经历了从柏特森的人类学到戈夫曼的符号互动理论,再到传播学的历程 ...

  • 数据结构大纲
  • 数据结构大纲 第1章 数据结构概述 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科.数据结构主要有三个方面的内容: 数据的逻辑结构.数据的存储结构和对数据的算法. 逻辑结构:反映数据之间的逻辑关系,是对数据之间关系的描述,主要有集合.线性表.树.图等四种结 ...

  • [树和二叉树]习题[1]
  • 一.选择题 1.对于先序遍历和中序遍历结果相同的二叉树为( BF ):对于先序遍历和后序遍历结果相同的二叉树为( B ) A. 一般二叉树 B. 只有根结点的二叉树 C. 根结点无左孩子的二叉树 D. 根结点无右孩子的二叉树 E. 所有结点只有左孩子的二叉树 F. 所有结点只有右孩子的二叉树. 2. ...

  • 哈夫曼编码实验报告
  • 实验报告与总结 一.实验目的 1.掌握哈夫曼编码原理: 2.熟练掌握哈夫曼树的生成方法: 3.理解数据编码压缩和译码输出编码的实现. 二.实验要求 实现哈夫曼编码和译码的生成算法. 三.实验内容 先统计要压缩编码的文件中的字符字母出现的次数,按字符字母和空格出现的概率对其进行哈夫曼编码,然后读入要编 ...