知识大全 树 - 哈夫曼树及其应用 - 哈夫曼编码 (二)
Posted 叶子
篇首语:一身转战三千里,一剑曾当百万师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 树 - 哈夫曼树及其应用 - 哈夫曼编码 (二)相关的知识,希望对你有一定的参考价值。
根据最优二叉树构造哈夫曼编码
利用哈夫曼树很容易求出给定字符集及其概率(或频度)分布的最优前缀码 哈夫曼编码正是一种应用广泛且非常有效的数据压缩
技术 该技术一般可将数据文件压缩掉 %至 % 其压缩效率取决于被压缩文件的特征
具体做法
( )用字符c i 作为叶子 p i 或f i 做为叶子c i 的权 构造一棵哈夫曼树 并将树中左分支和右分支分别标记为 和 ;
( )将从根到叶子的路径上的标号依次相连 作为该叶子所表示字符的编码 该编码即为最优前缀码(也称哈夫曼编码)
哈夫曼编码为最优前缀码
由哈夫曼树求得编码为最优前缀码的原因
① 每个叶子字符c i 的码长恰为从根到该叶子的路径长度l i 平均码长(或文件总长)又是二叉树的带权路径长度WPL 而哈
夫曼树是WPL最小的二叉树 因此编码的平均码长(或文件总长)亦最小
② 树中没有一片叶子是另一叶子的祖先 每片叶子对应的编码就不可能是其它叶子编码的前缀 即上述编码是二进制的前缀码
求哈夫曼编码的算法
( )思想方法
给定字符集的哈夫曼树生成后 求哈夫曼编码的具体实现过程是 依次以叶子T[i]( ≤i≤n )为出发点 向上回溯至根为止
上溯时走左分支则生成代码 走右分支则生成代码
注意
① 由于生成的编码与要求的编码反序 将生成的代码先从后往前依次存放在一个临时向量中 并设一个指针start指示编码在
该向量中的起始位置(start初始时指示向量的结束位置)
② 当某字符编码完成时 从临时向量的start处将编码复制到该字符相应的位串bits中即可
③ 因为字符集大小为n 故变长编码的长度不会超过n 加上一个结束符 \\ bits的大小应为n+
( )字符集编码的存储结构及其算法描述
typedef struct
char ch; //存储字符
char bits[n+ ]; //存放编码位串
CodeNode;
typedef CodeNode HuffmanCode[n];
void CharSetHuffmanEncoding(HuffmanTree T HuffmanCode H)
//根据哈夫曼树T求哈夫曼编码表H
int c p i;//c和p分别指示T中孩子和双亲的位置
char cd[n+ ]; //临时存放编码
int start; //指示编码在cd中的起始位置
cd[n]= \\ ; //编码结束符
for(i= i
H[i].ch=getchar();//读入叶子T[i]对应的字符
start=n; //编码起始位置的初值
c=i; //从叶子T[i]开始上溯
while((p=T[c].parent)>=0)//直至上溯到T[c]是树根为止
//若T[c]是T[p]的左孩子,则生成代码0;否则生成代码1
cd[--start]=(T[p).1child==C)?\'0\':\'1\';
c=p; //继续上溯
strcpy(H[i].bits,&cd[start]); //复制编码位串
//endfor
//CharSetHuffmanEncoding
文件的编码和解码
有了字符集的哈夫曼编码表之后,对数据文件的编码过程是:依次读人文件中的字符c,在哈夫曼编码表H中找到此字符,若
H[i].ch=c,则将字符c转换为H[i].bits中存放的编码串。wingwiT.
对压缩后的数据文件进行解码则必须借助于哈夫曼树T,其过程是:依次读人文件的二进制码,从哈夫曼树的根结点(即T[m-
1])出发,若当前读人0,则走向左孩子,否则走向右孩子。一旦到达某一叶子T[i]时便译出相应的字符H[i].ch。然后重新从根出发
继续译码,直至文件结束。
文件的编码和解码算法【参见练习】。
cha138/Article/program/sjjg/201311/23862相关参考
构造最优二叉树 哈夫曼算法 哈夫曼首先给出了对于给定的叶子数目及其权值构造最优二叉树的方法故称其为哈夫曼算法其基本思想是 ()根据给定的n个权值wlw…wn构成n棵二叉树的森林F=TT…Tn
树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和在结点数目相同的二叉树中完全二叉树的路径长度最短 树的带权路径长度(WeightedPathLengthofTree简记为WPL)
知识大全 数据结构考研分类复习真题 第六章 答案 (四)[29]
字符ABCD出现的次数为其哈夫曼编码如下A:B:C:D: . ()wpl=(+)*+*+(++)*+(+)*= ()编码为:::::::: ()常用哈夫曼树为通讯用的字符编码本题中集合的数
知识大全 数据结构考研分类复习真题 第六章 答案 (四)[28]
树的后根遍历(对应二叉树的中序遍历)全线索链表 虽然哈夫曼树的带权路径长度是唯一的但形态不唯一本题中各字母编码如下c: c: c: c: c:&nbs
平衡化方法 LL型右旋一次 RR型左旋一次 LR型左旋一次右旋一次 RL型右旋一次左旋一次 哈夫曼树和哈夫曼编码 叶子结点的权值对叶子结点赋予的
树的前序遍历与相对应的二叉树的前序遍历一致;树的后序遍历与相对应的二叉树的中序遍历一致 树的带权路径长度是树中所有叶结点的带权路径长度之和树的带权路径长度最小的二叉树就称为最优二叉树(即哈夫曼树
编码方案.编码和解码 数据压缩过程称为编码即将文件中的每个字符均转换为一个惟一的二进制位串 数据解压过程称为解码即将二进制位串转换为对应的字符.等长编码方案和变长编码方案 给定的字符集C可能存在
四解答下列各题(共分) 以数据集为叶子结点的权值()构造一棵哈夫曼树 (分)()计算其带权路径长度(分) 已知二叉树的先序中序和后序序列分别如下但其中有一些已模
知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (一)[11]
.在下列情况中可称为二叉树的是( )【西安交通大学三(分)】 A.每个结点至多有两棵子树的树 B哈夫曼树 
知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (一)[4]
设给定权值总数有n个其哈夫曼树的结点总数为( )【福州大学一(分)】 A.不确定 &nbs