哈弗曼树和哈夫曼编码

1 基本概念

①结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。
②路径长度:结点路径上的分支数目称为路径长度。
③树的路径长度:从树根到每一个结点的路径长度之和。
④结点的带权路径长度:从该结点的到树的根结点之间的路径长度与结点的权(值)的乘积。
权(值):各种开销、代价、频度等的抽象称呼。
⑤ 树的带权路径长度:树中所有叶子结点的带权路径长度之和,记做:
WPL=w_1\times l_1 + w_2\times l_2 +\cdots+ w_n\times l_n=\sum w_i\times l_i(i=1,2,⋯,n)其中:n 为叶子结点的个数;w_i 为第 i 个结点的权值; l_i 为第 i 个结点的路径长度。
⑥Huffman 树:具有 n 个叶子结点(每个结点的权值为w_i) 的二叉树不止一棵,但在所有的这些二叉树中,必定存在一棵 WPL 值最小的树,称这棵树为 Huffman 树(或称最优树) 。

在许多判定问题时,利用 Huffman 树可以得到最佳判断算法。权值分别为 2、3、6、7, 具有 4 个叶子结点的二叉树,它们的带权路径长度分别为:
(a) WPL=2\times2+3\times2+6\times2+7\times2=36 ;
(b) WPL=2\times1+3\times2+6\times3+7\times3=47
(c) WPL=7\times1+6\times2+2\times3+3\times3=34
其中(c)的 WPL 值最小,可证明是Huffman 树

2 Huffman 树的构造

①根据 n 个权值{w_1,w_2,\cdots,w_n},构造成 n 棵二叉树的集合 F={T_1,T_2,\cdots,T_n},其中每棵二叉树只有一个权值为 w_i 的根结点,没有左、右子树;
②在F中选取两棵根结点权值最小的树作为左、右子树构造一棵新的二叉树,且新
的二叉树根结点权值为其左、右子树根结点的权值之和;
③在F中删除这两棵树,将新得到的树加入F中;
④重复②、③,直到F只含一颗树为止。

规定权值小的二叉树作为新构造的二叉树的左子树,权值大的二叉树作为新构造的二叉树的右子树;
在取值相等时,深度小的二叉树作为新构造的二叉树的左子树,深度大的二叉树作为新构造的二叉树的右子树。

权值集合 W={8, 3, 4, 6, 5, 5}构造 Huffman 树的过程:


WPL=6\times2+3\times3+4\times3+8\times2+5\times3+5\times3=79

3 Huffman 编码

电报收发等数据通讯中,常需要将传送的文字转换成由二进制字符 0、1 组成的字符串来传输。
保证任意字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。
Huffman 树可以用来构造编码长度不等且译码不产生二义性的编码。
设电文中的字符集 C={c_1,c_2,\cdots,c_n},各个字符出现的次数或频度集 W={w_1,w_2,\cdots,w_n}。
Huffman 编码方法:
以字符集 C 作为叶子结点,次数或频度集 W 作为结点的权值来构造 Huffman 树。
规定左分支代表“0”,右分支代表“1” 。
从根结点到每个叶子结点所经历的路径分支上的“0” 或“1”所组成的字符串,为该结点所对应的编码,称之为 Huffman 编码。
由于每个字符都是叶子结点,不可能出现在根结点到其它字符结点的路径上,所以一个字符的 Huffman 编码不可能是另一个字符的 Huffman 编码的前缀。
若字符集 C={a, b, c, d, e, f}所对应的权值集合为 W={8, 3, 4, 6, 5, 5},则字符 a,b, c,d, e,f所对应的 Huffman 编码分别是:10,010,011,00 ,110,111。

4 Huffman 编码算法实现

(1)数据结构设计
Huffman 树中没有度为 1 的结点。
1 棵有 n 个叶子结点的 Huffman 树共有 2n-1 个结点。
可存储在大小为 2n-1 的一维数组中,即 2n-1 =2(n-1)+1。
结点类型定义:

#define MAX_NODE 200
typedef struct {
    unsigned int weight; /* 权值域 */
    unsigned int parent, lChild, rChild;
} HTNode;

(2)Huffman 树的生成
算法实现

(3) Huffman 编码算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容