哈夫曼树和哈夫曼编码

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

 

posted @ 2020-04-18 10:42  PennyXia  阅读(410)  评论(0编辑  收藏  举报