哈夫曼树和哈夫曼编码
2.6哈夫曼树和哈夫曼编码
2.6.1什么是哈夫曼树(Huffman Tree)?
带权路径长度(WPL):设有二叉树有n个叶子结点,每个叶子结点带有权值wk,从根结点到每个结点的长度为lk,则每个叶子结点的带权路径长度之和就是WPL,WPL=$\sum _{n=1}^n w_k l_k$
最优二叉树/哈夫曼树:WPL最小的二叉树。
2.6.2哈夫曼树的构造
每次把权值最小的两棵二叉树合并(如何选取权值最小的树?利用最小堆!)
1 //构造哈夫曼树 2 HuffmanTree Huffman(MinHeap H) { 3 HuffmanTree T; 4 BuildMinHeap(H);//调整成最小堆 5 //做S->Size-1次合并 6 for (int i = 1; i < H->Size; i++) { 7 T = CreateHuff(); 8 T->left = DeleteHeap(H); 9 T->right = DeleteHeap(H); 10 T->weight = T->left->weight + T->right->weight; 11 InsertHeap(H, T); 12 } 13 T = DeleteHeap(H);//最小堆的树根 14 return T; 15 }
时间复杂度为O(NlogN)
2.6.3哈夫曼树的特点
- 没有度为 1 的结点
- n 个叶结点的哈夫曼树共有 2n-1 个结点(因为n2=n0-1,又n1=0,故n=2*n0-1)
- 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树
- 对同一组权值,可能存在不同构的多棵哈夫曼树,但是得到的最优的WPL是一样的
2.6.4哈夫曼编码
怎么进行不等长编码?如何避免二义性?
前缀码(prefix code):任何字符的编码都不是另一个字符编码的前缀
- 左右分支分别代表0、1
- 字符只出现在叶结点上
a:4 x:1 u:2 z:1
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。