Huffman树与Huffman编码

Huffman树与Huffman编码

Huffman树的定义

Huffman Tree(哈夫曼/霍夫曼树)即最优二叉树,特点为给定n个权值作为n个叶子结点构造一棵二叉树,使得带权路径长度达到最小。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

在树的基本定义中,树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作:

WPL=i=1nwili

其中, n 为叶子结点的数目,wi为叶子结点 i 的权值,li为叶子结点 i 到根节点的路径长度。
带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。
例如下面三个树的叶子节点权重均为5,8,1,9
这里写图片描述

这里写图片描述

这里写图片描述

其中树B的带权路径长度最小,即为Huffman树或最优二叉树。

Huffman树的构造

哈夫曼树的构造算法即为哈夫曼算法,步骤如下:
1. 根据给定的n个权值分别为{w1,w2,,wn} 的节点构成二叉树集合 F={T1,T2,,Tn} ,其中每棵二叉树 Ti 中只有一个权为 wi 的根结点,其左右子树为空
2. 在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和
3. 在F中删除这两棵树,同时将新的二叉树加入F中
4. 重复2、3,直到F只含有一棵树为止

图示步骤如下:
1 单独叶子节点作为根节点集合
第1步

2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
第2步

2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
第3步

4 最终只剩下一棵树成为Huffman树
这里写图片描述

Python 代码参考:https://github.com/nicktimko/huffman

Huffman编码及Huffman树的应用

Huffman Coding(哈夫曼编码)是Huffman Tree的一种应用,是一种可变字长编码(VLC),于1952年提出,依据字符出现概率来构造异字头的平均长度最短的码字,广泛地用于数据文件压缩,其压缩率通常在20%~90%之间。
深度阅读:
Huffman 编码压缩算法
哈夫曼树在判定问题中的应用
哈夫曼(huffman)树和哈夫曼编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值