构建哈夫曼树(哈夫曼树的构造规则是什么)

2024-07-24 08:14:44 4

构建哈夫曼树(哈夫曼树的构造规则是什么)

本文目录

哈夫曼树的构造规则是什么

哈夫曼树的构造规则是若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

哈夫曼树的数据

为使不等长编码为前缀编码(即要求一个字符的编码不能是另一个字符编码的前缀),可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下。

于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度效果上就是传送报文的最短长度。

因此,求传送报文的最短长度问题转化为求由字符集中的所有字符作为叶子结点,由字符出现频率作为其权值所产生的哈夫曼树的问题。利用哈夫曼树来设计二进制的前缀编码,既满足前缀编码的条件,又保证报文编码总长最短。

数据结构 哈夫曼树在构造时 有顺序要求吗 比如左右子树的顺序要固定什么的 必须谁左谁右之类的

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的。

节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include《stdio.h》

#include《iostream》

#define INF 0x3f3f3f3f

#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct

{

int weight;

int parent, lchild, rchild;

}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;

{

int min1 = INF;

int min2 = INF;

for(int i=1; i《=n; ++i)

int m = 2*n-1;

for(int i=1; i《=2*n-1; ++i)

cout 《《 "结点序号 " 《《 i;

cout 《《 " 权重 " 《《 HT.weight;

cout 《《 " parent " 《《 HT.parent;

cout 《《 " Lchild " 《《 HT.lchild;

cout 《《 " Rchild " 《《 HT.rchild 《《 ’\n’;

int main()

{

Huffmantree HT;

cout 《《 "开始构建哈夫曼树" 《《 ’\n’;

cout 《《 "请输入哈夫曼树的叶子结点的个数: ";

int n;

cin 》》 n;

cout 《《 "请输入每个叶子结点的权值: " 《《 ’\n’;

CreatHuffmantree(HT, n);

print(HT, n);

return 0;

}

扩展资料:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

哈夫曼树怎么画

1、先准备一组数字,以1、7、3、4、9、8为例。

2、对这一组数字进行从小到大的规则排序,排序后为1、3、4、7、8、9。

3、在这些数字中,选择两个最小的数字。

4、用类似树杈的“树枝”连接两个最小的数,在顶点处计算出这两个数字的和,比较剩下的数字和这个和的大小,再取出两个最小的数字进行排序。

5、若两个数的和正好是下一步两个最小数其中一个,那么这个树直接往上生长。若两个数的和比较大,不是下一步两个最小数其中一个,那么就并列生长。

6、继续用倒V型的树杈,向上延伸,算出最后一个结果,就证明哈夫曼树构建成功。

 

哈夫曼树的构造是什么

哈夫曼树构造:结构化的Huffman算法生成的Huffman树子树都是有序的,所以一般生成Huffman树时都为节点排序,即使这样结果也不唯一。

哈夫曼静态编码:它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,即把字符0-255(2^8=256)的频率值以2-4BYTES的长度顺序存储起来,以便解压时创建同样的哈夫曼树进行解压;第二遍则根据第一遍扫描得到的哈夫曼树进行编码,并把编码后得到的码字存储起来。

历史

1951年,哈夫曼在麻省理工学院(MIT)攻读博士学位,他和修读信息论课程的同学得选择是完成学期报告还是期末考试。

导师罗伯特·法诺(Robert Fano)出的学期报告题目是:查找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。

哈夫曼使用自底向上的方法构建二叉树,避免了次优算法香农-范诺编码(Shannon–Fano coding)的最大弊端──自顶向下构建树。

1952年,于论文《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)中发表了这个编码方法。

哈夫曼树的构造

第一步:排序 2 4 5 9第二步:挑出2个最小的 2 4 为叶子构造出 62 4第三步:判断 6 不大于 5或9(剩余叶子中最小的2个)=》 同方向生长,得出: 11 6 52 4第四步:继续生长 20 11 9 6 5 2 4权值为 2*3+4*3+5*2+9*1=37也可以20+11+6=37例题:6、13、18、30、7、16排序 6 7 13 16 18 30 13 6 7 26 26大于16或18 =》分支生长 13 13 6 7 26 34 13 13 16 18 6 7此时最小的2个数为 26 30 得出 56 34 26 30 16 18 13 136 7最后得出 90 56 34 26 30 16 18 13 13 6 7 权值 21990+56+26+13+34 or 6*4+7*4+13*3+30*2+16*2+18*2

二叉树实现符号不等长高效编码

二叉树中的最优二叉树(也就是哈夫曼树)可以实现符号不等长高效编码。

哈夫曼树(最优二叉树):就是将二叉树的WPL降到最低(WPL最小的二叉树)。当用n个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。在构建哈弗曼树时,要使树的带权路径长度最小,只需要遵循一个原则:权重越大的结点离树根越近。

哈夫曼树构造的编码中,最主要的是“如何选择两个最小的结点?”。可以利用堆来解决,把结点的权值构造成最小堆,从里面挑两个最小的。当然也可以用排序的方法来选择两个最小的结点,但是排序的方法效率不如堆。构建哈夫曼树时,首先需要确定树中结点的构成。

哈夫曼树的特点

1、没有度为1的结点。

2、n个叶子结点的哈夫曼树公有2n-1个结点。

3、哈夫曼树的任意非叶结点的左、右子树互换后,还是哈夫曼树。

4、同一组权值,可能存在不同构的哈夫曼树。

怎样构建哈夫曼树 C语言大师帮帮忙

/********************************************************** 我也贴个现成的,这个是以前上课用的示范代码,有注释* 另外,像《malloc.h》、《conio.h》这种非标准头文件最好不要用**********************************************************//* huffman树的构造方法*/#include《stdlib.h》#include《stdio.h》#define MAXINT 2147483647#define MAXNUM 50 /* 数组w中最多容纳的元素个数,注意 m《=MAXNUM */#define MAXNODE 100 /* 哈夫曼树中的最大结点数,注意 2*m-1《MAXNODE */struct HtNode { /* 哈夫曼树结点的结构 */ int ww; int parent,llink,rlink;};struct HtTree { int root;/* 哈夫曼树根在数组中的下标*/ struct HtNode ht;};typedef struct HtTree *PHtTree; /* 哈夫曼树类型的指针类型 *//* 构造具有m个叶结点的哈夫曼树*/PHtTree huffman(int m, int *w) { PHtTree pht; int i, j, x1, x2, m1, m2; pht = (PHtTree)malloc(sizeof(struct HtTree)); /* 创建空哈夫曼树 */ if (pht == NULL) { printf("Out of space!! \n"); return pht; } for (i = 0; i 《 2*m-1; i++) {/* 置初态 */ pht-》ht.llink = -1; pht-》ht.rlink = -1; pht-》ht.parent = -1; if (i 《 m) pht-》ht; else pht-》ht.ww = -1; } for ( i = 0; i 《 m-1; i++) {/* 每循环一次构造一个内部结点 */ m1 = MAXINT; m2 = MAXINT;/* 相关变量赋初值 */ x1 = -1; x2 = -1; for (j = 0; j 《 m+i; j++) /* 找两个最小权的无父结点的结点 */ if (pht-》ht.parent == -1) { m2 = m1; x2 = x1; m1 = pht-》ht.ww; x1 = j; } else if (pht-》ht.parent == -1) { m2 = pht-》ht.ww; x2 = j; } pht-》ht.parent = m+i; /* 构造一个内部结点 */ pht-》ht.parent = m+i; pht-》ht.ww = m1+m2; pht-》ht.llink = x1; pht-》ht.rlink = x2; pht-》root = m+i; } return pht;}int main() { int m = 0, j = 0, i = 0, parent = 0; int* w; PHtTree pht; printf("please input m = ");/*输入外部结点个数*/ scanf("%d", &m); if (m 《 1) { printf("m is not reasonable!\n"); return 1; } w = (int *)malloc(sizeof(int)*m); if (w == NULL) { printf("overflow!\n"); return 1; } printf("please input the %d numbers:\n",m);/*输入权值*/ for (j = 0; j 《 m; j++) scanf("%d", w+j); pht = huffman(m, w); for (j = 0; j 《 m; j++) { printf("the Reverse code of the %d node is:", j+1);/*得到的编码应倒过来*/ i = j; while (pht-》ht.parent != -1) { parent = pht-》ht.parent; if (pht-》ht.llink == i) printf("0"); else printf("1"); i = parent; } printf("\n"); } return 0;}

构建哈夫曼树(哈夫曼树的构造规则是什么)

本文编辑:admin

更多文章:


tended(tended to live shorter lives)

tended(tended to live shorter lives)

“tended”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看tended(tended to live shorter lives)!本文目录tended to live shorter livestend这是什么单词te

2024年8月13日 11:40

安卓平板开发工具(Android 操作系统下 可以 安装Eclipse么 和Tomcat MSQL Server 等相关开发工具么 将 平板电脑 用于开发)

安卓平板开发工具(Android 操作系统下 可以 安装Eclipse么 和Tomcat MSQL Server 等相关开发工具么 将 平板电脑 用于开发)

本文目录Android 操作系统下 可以 安装Eclipse么 和Tomcat MSQL Server 等相关开发工具么 将 平板电脑 用于开发安卓开发工具那个好用android平板有C/C /java编译器吗安卓平板上层应用软件现在的平板

2024年7月4日 22:46

matlab把c盘弄炸了(我在虚拟机安装了matlab程序后发现C盘小了3G,于是我又把他它卸载了,但发现C盘容量并没有回复是怎么回事)

matlab把c盘弄炸了(我在虚拟机安装了matlab程序后发现C盘小了3G,于是我又把他它卸载了,但发现C盘容量并没有回复是怎么回事)

本篇文章给大家谈谈matlab把c盘弄炸了,以及我在虚拟机安装了matlab程序后发现C盘小了3G,于是我又把他它卸载了,但发现C盘容量并没有回复是怎么回事对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望

2024年7月20日 13:18

objectoutputstream是什么流(java中有哪些常用的输入/输出流,它们的主要区别是什么)

objectoutputstream是什么流(java中有哪些常用的输入/输出流,它们的主要区别是什么)

本文目录java中有哪些常用的输入/输出流,它们的主要区别是什么Java中有哪些常见的包装流,包装流的作用是什么JAVA中的objectinputstream 和objectoutputstream有什么用DataOutputStream和

2024年7月17日 15:07

playground(Andy Rubin和他联手创立的Playground风投还有联系吗)

playground(Andy Rubin和他联手创立的Playground风投还有联系吗)

本文目录Andy Rubin和他联手创立的Playground风投还有联系吗操场英语playground怎么读playground谐音怎么读“playground”怎么读swift playground里怎么开发ui界面swift play

2024年7月3日 11:27

江苏移动网上营业厅积分兑换商城(江苏中国移动网上营业厅积分兑换商城)

江苏移动网上营业厅积分兑换商城(江苏中国移动网上营业厅积分兑换商城)

本文目录江苏中国移动网上营业厅积分兑换商城移动如何兑换话费中国移动网上营业厅积分兑换话费怎么兑换中国移动积分怎么兑换移动积分兑换礼品怎么兑换移动营业厅积分兑换话费怎么兑换江苏中国移动网上营业厅积分兑换商城你可以搜索下江苏移动,进入江苏移动官

2024年7月3日 09:58

if函数怎么用三个条件(excel中if函数怎么用里面有三个值,)

if函数怎么用三个条件(excel中if函数怎么用里面有三个值,)

本文目录excel中if函数怎么用里面有三个值,if函数三个条件是什么EXCEL中的IF函数如何满足3个条件三个以上if条件设置公式excel中if函数怎么用里面有三个值,典型的用法:=IF(A1》18, “成人“, “孩子“)三

2024年6月10日 06:50

dizzy怎么读音发音(dizzy怎么读音发音)

dizzy怎么读音发音(dizzy怎么读音发音)

本文目录dizzy怎么读音发音ɪ和ei发音有什么区别 dizzy[ ˈdɪzi ]和daisy[ ˈdeɪzi ]两个发音有什么区别字母“Z”究竟如何读j和z用英文怎么发音谢谢!dizzy怎么读dizzy是什么意思z的发音音标怎么读音diz

2024年5月18日 09:15

亚洲杯决赛中国vs日本直播(今晚男排比赛有直播吗)

亚洲杯决赛中国vs日本直播(今晚男排比赛有直播吗)

这篇文章给大家聊聊关于亚洲杯决赛中国vs日本直播,以及今晚男排比赛有直播吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录今晚男排比赛有直播吗亚洲杯决赛时间亚洲杯女排决赛几点比赛亚洲女排决赛中国对日本什么时间开始转播吗哪里可以

2024年7月12日 10:46

人类一败涂地登录界面图片(人类一败涂地手游有什么特色好玩不)

人类一败涂地登录界面图片(人类一败涂地手游有什么特色好玩不)

各位老铁们好,相信很多人对人类一败涂地登录界面图片都不是特别的了解,因此呢,今天就来为大家分享下关于人类一败涂地登录界面图片以及人类一败涂地手游有什么特色好玩不的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录人类

2024年7月29日 22:55

加拿大发生车祸(加拿大新移民需要知道的驾驶规则)

加拿大发生车祸(加拿大新移民需要知道的驾驶规则)

这篇文章给大家聊聊关于加拿大发生车祸,以及加拿大新移民需要知道的驾驶规则对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录加拿大新移民需要知道的驾驶规则加拿大约克大学中国留学生遭遇车祸身亡加拿大发生交通事故导致中国公民多少人死伤

2024年7月1日 19:38

eclipse中的 jsp是什么(eclipse为什么写成jsp)

eclipse中的 jsp是什么(eclipse为什么写成jsp)

本文目录eclipse为什么写成jspECLIPSE 中的 JSPeclipse与myeclipse与tomcat与jsp是什么关系啊,糊涂啦Eclipse PHP 与 JSP 什么区别eclipse为什么写成jsp1.确定你的版本是jee

2024年7月17日 19:37

直方图和柱形图一样吗(测试数据分析技术中直方图技术与柱状图技术有什么区别(直方图X轴为定量数据,柱状图X轴为分类数据))

直方图和柱形图一样吗(测试数据分析技术中直方图技术与柱状图技术有什么区别(直方图X轴为定量数据,柱状图X轴为分类数据))

其实直方图和柱形图一样吗的问题并不复杂,但是又很多的朋友都不太了解测试数据分析技术中直方图技术与柱状图技术有什么区别(直方图X轴为定量数据,柱状图X轴为分类数据),因此呢,今天小编就来为大家分享直方图和柱形图一样吗的一些知识,希望可以帮助到

2024年7月17日 08:45

load tray1(p355d load tray1是什么意思)

load tray1(p355d load tray1是什么意思)

各位老铁们好,相信很多人对load tray1都不是特别的了解,因此呢,今天就来为大家分享下关于load tray1以及p355d load tray1是什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录p

2024年7月23日 14:06

excel做成软件录入界面(excel表格怎么样做成app软件)

excel做成软件录入界面(excel表格怎么样做成app软件)

大家好,关于excel做成软件录入界面很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于excel表格怎么样做成app软件的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有

2024年9月8日 23:30

table border是什么意思(代码有问<table border=“0“ cellpadding=“0“ cellspacing=“0“ class=““ width=“950“>)

table border是什么意思(代码有问<table border=“0“ cellpadding=“0“ cellspacing=“0“ class=““ width=“950“>)

本文目录代码有问html中代表什么意思代码有问cell是小格子的意思,如果把table看做是一个一个小格子看着的话, border就是小格子的边框,把border设为0 ,就看不到小格子周围有边框了,padding你懂吗,就是盒子里面的内容

2024年5月24日 02:11

java map排序treemap 键为int(java TreeMap 中的key是怎么排序的呢 如果说key是 Double 类型的,自动排序的结果是从小到大的么)

java map排序treemap 键为int(java TreeMap 中的key是怎么排序的呢 如果说key是 Double 类型的,自动排序的结果是从小到大的么)

本文目录java TreeMap 中的key是怎么排序的呢 如果说key是 Double 类型的,自动排序的结果是从小到大的么用java实现TreeMap的排序问题急急急Map排序 根据key排序,key可以是int或stringjava

2024年7月24日 12:37

hamburger是什么意思中文(hamburger翻译中文是什么意思)

hamburger是什么意思中文(hamburger翻译中文是什么意思)

本文目录hamburger翻译中文是什么意思hamburger什么意思中文翻译汉堡包英文是什么hamburger的中文意思hamburger中文翻译hamburger的中文是什么hamburgur是什么意思中文翻译是什么意思中文汉堡包用英语

2024年6月30日 22:28

他们有一台电脑吗翻译成英语(还有一台电脑吗翻译成英语)

他们有一台电脑吗翻译成英语(还有一台电脑吗翻译成英语)

本文目录还有一台电脑吗翻译成英语英语翻译:1、他有一台电脑,我也有 2、 她的任务完成了吗他们有电脑吗翻译成英文是有一台电脑 用英语怎么说他有一台电脑吗 英文翻译翻译句子 她有一个足球吗不,她没有 他们有一台电脑吗不,他们没有 他有一只网球

2024年5月13日 23:44

typedef的用法线性表(C语言中怎么定义个线性表)

typedef的用法线性表(C语言中怎么定义个线性表)

本文目录C语言中怎么定义个线性表线性表的创建,删除插入等操作如何建立一个线性表,用c++的基本语法是什么线性表c语言实现 求高人完善线性表的基本操作实验内容: 一、 线性顺序表1: 函数调用方式实现建立线性表及线性表的各项功能 typede

2024年7月24日 14:37

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1154
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1151
标签列表

热门搜索