数据结构哈夫曼树课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转换10000个分数所需的
a 60 不及格 a 70
总比较次数= 10000
(0.05 1+0.15 2+0.4 3+0.3 4 +0.1 4)
二叉树的 带权路径长度
及格 a 80
中等 a 90
良好
优秀
3.哈夫曼树的构造
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个 权值分别设为 w1,w2,…,wn,则哈夫曼树的构造规则为:
if(i<=n) t[i].weight=w[i];
else t[i].weight=0;}
for(i=1;i<n;i++) { m1=m2=MAX;
x1=x2=0; for(j=1;j<(n+i);j++) { if((t[j].weight<m1)&&(t[j].parent==-1))
{ m2=m1; x2=x1; m1=t[j].weight; x1=j;}
判定树
设有10000个百分制分数要转换,设学生成绩在5个等
级以上的分布如下:
分数 0-59 60-69 70-79 80-89 90-构100造以分数的分布比例为权值
比例数0.05 0.15 0.40 0.30 0.10
的哈夫曼树
按图的判定过程:
转换一个分数所需的比较次数= 从根到对应结点的路径长度
n 个权值构造哈夫曼树需n-1次合并,每次合并,森 林中的树数目减1,最后森林中只剩下一棵树,即 为我们求得的哈夫曼树。
例:
W(权)={2,4,2,3,3},叶子结点个数m=5 试设计Huffman树。
哈夫曼树的算法模拟演示
3、哈夫曼树构造程序 一棵有n个叶子结点的Huffman树有2n-1个结点 顺序存储结构—一维结构数组存储结点信息,结点类型定义为:
数据结构哈夫 曼树
6.6 哈夫曼树
一、基本术语
1.路径和路径长度
A
在一棵树中,从一个结点往下
B
C
可以达到的孩子或子孙结点之
间的通路,称为路径。通路中 分支的数目称为路径长度。
D
E
若规定根结点的层数为1,则 从根结点到第L层结点的路径 长度为L-1。
F
G
2.结点的权及带权路径长度
给树的结点附加的这个有 着某种意义的实数,称为 该结点的权(weight)。
ABACCDA 00010010101100
若将编码设计为长度不等的二进制编码,即让待传字符串中出 现次数较多的字符采用尽可能短的编码,则转换的二进制字符 串便可能减少。
设要传送的字符为:ABACCDA 若编码为: A—0
B—00 C—1 D---01
ABACCDA
但: 0000 AAAA ABA BB
构造哈夫曼树的模拟演示
下面给出哈夫曼树的构造过程,假设给定的叶子结点的 权分别为1,5,7,3,则构造哈夫曼树过程如图所示。
1
5
7
3
5
7
4
(a) 初 如 森 林
1
3
(b) 一 次 合 并 后 的 森 林
7
9
4
5
16
7
9
1
3
4
5
1
3
(c) 二次合并后的森林
(d) 三合并后的森林
图 哈夫曼树的构造过程
例:
W(权)={2,4,2,3,3},叶子结点个数,m=5 试设计Huffman树。
14
6
3
3
8
4
4
22
构造的 Huffman树
三、哈夫曼树的应用(哈夫曼编码)
在远程通讯中,要将待传字符转换成由二进制组成 的字符串:
设要传送的字符为: 若编码为:A—00 (等长) B—01
C—10 D---11
else if((t[j].weight<m2)&&(t[j].parent==-1))
{ m2=t[j].weight; x2=j; } } k=n+i; t[x1].parent=t[x2].parent=k; t[k].weight=m1+m2; t[k].lchild=x1; t[k].rchild=x2;}}
typedef struct { int weight;
int parent,lchild,rchild; }JD; #define MAX 100 void huffman(int n,int w[],JD t[]) { int i,j,k,x1,x2,m1,m2;
for(i=1;i<(2*n);i++) { t[i].parent=t[i].lchild=t[i].rchild=-1;
if ( x<60) score=’不及格’;
a 60
else if ( x<70) score=’及格’;
else if ( xຫໍສະໝຸດ Baidu80)
不及格 a 70 及格 a 80
score=’中’; else if ( x<90)
中等 a 90
score=’良’;
良好
优秀
else
score=’优’;
二、构造哈夫曼树
1.哈夫曼树的定义
在一棵二叉树中,若带权路径长度达到最小,称这样的 二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
例 有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树
4d
a 7
n
c
2
WPL
WKLK
k1
a
bc
d
b
7
52
4
5
WPL=7*2+5*2+2*2+4*2=36
WPL=7*3+5*3+2*1+4*2=46 7a
要使二叉树WPL 小,就须在构造
树时, 将权值大的 结点靠近根.
5b
2c
d4
WPL=7*1+5*2+2*3+4*3=35
2 应用举例
在求得某些判定问题时,利用哈夫曼树获得最佳判定算法。 例 编制一个将百分制转换成五分制的程序。
最直观的方法是利用if语句来的实现。
结点的带权路径长度为: 从根结点到该结点之间的 路径长度与该结点的权的 乘积。
A
B7
C
5
D
E3
4
F
G
1
2
3.树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长 n
度之和,记为wpl= w i l i i1
其中n 为叶子结点数目,wi为第i 个叶子结点的权值, li 为第i 个叶子结点的路径长度。
(1) 将w1,w2,…,wn看成是有n 棵树的森林(每棵树仅有一个 结点); (2) 在森林中选出两个根结点的权值最小的树合并,作为 一棵新树的左、右子树,且新树的根结点权值为其左、右 子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即 为我们所求得的哈夫曼树。
a 60 不及格 a 70
总比较次数= 10000
(0.05 1+0.15 2+0.4 3+0.3 4 +0.1 4)
二叉树的 带权路径长度
及格 a 80
中等 a 90
良好
优秀
3.哈夫曼树的构造
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个 权值分别设为 w1,w2,…,wn,则哈夫曼树的构造规则为:
if(i<=n) t[i].weight=w[i];
else t[i].weight=0;}
for(i=1;i<n;i++) { m1=m2=MAX;
x1=x2=0; for(j=1;j<(n+i);j++) { if((t[j].weight<m1)&&(t[j].parent==-1))
{ m2=m1; x2=x1; m1=t[j].weight; x1=j;}
判定树
设有10000个百分制分数要转换,设学生成绩在5个等
级以上的分布如下:
分数 0-59 60-69 70-79 80-89 90-构100造以分数的分布比例为权值
比例数0.05 0.15 0.40 0.30 0.10
的哈夫曼树
按图的判定过程:
转换一个分数所需的比较次数= 从根到对应结点的路径长度
n 个权值构造哈夫曼树需n-1次合并,每次合并,森 林中的树数目减1,最后森林中只剩下一棵树,即 为我们求得的哈夫曼树。
例:
W(权)={2,4,2,3,3},叶子结点个数m=5 试设计Huffman树。
哈夫曼树的算法模拟演示
3、哈夫曼树构造程序 一棵有n个叶子结点的Huffman树有2n-1个结点 顺序存储结构—一维结构数组存储结点信息,结点类型定义为:
数据结构哈夫 曼树
6.6 哈夫曼树
一、基本术语
1.路径和路径长度
A
在一棵树中,从一个结点往下
B
C
可以达到的孩子或子孙结点之
间的通路,称为路径。通路中 分支的数目称为路径长度。
D
E
若规定根结点的层数为1,则 从根结点到第L层结点的路径 长度为L-1。
F
G
2.结点的权及带权路径长度
给树的结点附加的这个有 着某种意义的实数,称为 该结点的权(weight)。
ABACCDA 00010010101100
若将编码设计为长度不等的二进制编码,即让待传字符串中出 现次数较多的字符采用尽可能短的编码,则转换的二进制字符 串便可能减少。
设要传送的字符为:ABACCDA 若编码为: A—0
B—00 C—1 D---01
ABACCDA
但: 0000 AAAA ABA BB
构造哈夫曼树的模拟演示
下面给出哈夫曼树的构造过程,假设给定的叶子结点的 权分别为1,5,7,3,则构造哈夫曼树过程如图所示。
1
5
7
3
5
7
4
(a) 初 如 森 林
1
3
(b) 一 次 合 并 后 的 森 林
7
9
4
5
16
7
9
1
3
4
5
1
3
(c) 二次合并后的森林
(d) 三合并后的森林
图 哈夫曼树的构造过程
例:
W(权)={2,4,2,3,3},叶子结点个数,m=5 试设计Huffman树。
14
6
3
3
8
4
4
22
构造的 Huffman树
三、哈夫曼树的应用(哈夫曼编码)
在远程通讯中,要将待传字符转换成由二进制组成 的字符串:
设要传送的字符为: 若编码为:A—00 (等长) B—01
C—10 D---11
else if((t[j].weight<m2)&&(t[j].parent==-1))
{ m2=t[j].weight; x2=j; } } k=n+i; t[x1].parent=t[x2].parent=k; t[k].weight=m1+m2; t[k].lchild=x1; t[k].rchild=x2;}}
typedef struct { int weight;
int parent,lchild,rchild; }JD; #define MAX 100 void huffman(int n,int w[],JD t[]) { int i,j,k,x1,x2,m1,m2;
for(i=1;i<(2*n);i++) { t[i].parent=t[i].lchild=t[i].rchild=-1;
if ( x<60) score=’不及格’;
a 60
else if ( x<70) score=’及格’;
else if ( xຫໍສະໝຸດ Baidu80)
不及格 a 70 及格 a 80
score=’中’; else if ( x<90)
中等 a 90
score=’良’;
良好
优秀
else
score=’优’;
二、构造哈夫曼树
1.哈夫曼树的定义
在一棵二叉树中,若带权路径长度达到最小,称这样的 二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
例 有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树
4d
a 7
n
c
2
WPL
WKLK
k1
a
bc
d
b
7
52
4
5
WPL=7*2+5*2+2*2+4*2=36
WPL=7*3+5*3+2*1+4*2=46 7a
要使二叉树WPL 小,就须在构造
树时, 将权值大的 结点靠近根.
5b
2c
d4
WPL=7*1+5*2+2*3+4*3=35
2 应用举例
在求得某些判定问题时,利用哈夫曼树获得最佳判定算法。 例 编制一个将百分制转换成五分制的程序。
最直观的方法是利用if语句来的实现。
结点的带权路径长度为: 从根结点到该结点之间的 路径长度与该结点的权的 乘积。
A
B7
C
5
D
E3
4
F
G
1
2
3.树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长 n
度之和,记为wpl= w i l i i1
其中n 为叶子结点数目,wi为第i 个叶子结点的权值, li 为第i 个叶子结点的路径长度。
(1) 将w1,w2,…,wn看成是有n 棵树的森林(每棵树仅有一个 结点); (2) 在森林中选出两个根结点的权值最小的树合并,作为 一棵新树的左、右子树,且新树的根结点权值为其左、右 子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即 为我们所求得的哈夫曼树。