哈夫曼编码( huffman编码),哈夫曼树(也翻译赫夫曼)

哈夫曼编码( huffman编码),哈夫曼树(也翻译赫夫曼)_第1张图片

解决的问题:带权路径长度WPL最小的二叉树称作赫夫曼树(也叫做最优二叉树)。

赫夫曼树构造方法:

1.先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列

2.取头两个最小权值的结点作为一个新结点N1的两个子结点,注意相对较小的是左孩子

3.将N1替换它的子结点,插入有序序列中,保持从小到大排序

4.重复步骤2和3直到得到根结点,完成赫夫曼树的构造。

 

赫夫曼编码解决的问题:解决当年远距离通信(主要是电报)的数据传输的最优化问题。

传输都是使用二进制0和1串进行的,如果采用相同的长度进行编码,那么当信息很长那么二进制串长度是非常可怕的。但是事实上,文字出现的频率是不相同的,那么可以使用赫夫曼树来规划。如果采用长短不等的编码,那么必须要使得任一字符的编码都不是另一个字符的编码的前缀(这种编码叫做前缀编码),恰好,赫夫曼树来规划的编码(即赫夫曼编码)就是前缀编码。前缀编码的长度相比等长度编码的形式更加短了,也就是说数据被压缩了,节省了存储和传输成本。并且随着字符的增加和各字符权重的不同,这种压缩会更加凸显其优势。使用赫夫曼编码,为了方便解码(无损编码和无错解码),一般发送方和接收方必须要约好同样的赫夫曼编码规则。

赫夫曼编码的步骤:

1.一般的,设需要编码的字符集为{d1,d2,...,dn},各个字符在电文中出现的频率集合为{w1,w2,...,wn},以d1,d2,...,dn作为叶子结点,以w1,w2,...,wn作为相应叶子节点的权值来构造一棵赫夫曼树。

2.规定赫夫曼树的做分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列,该序列就是该结点所对应字符的编码

3.以上就是赫夫曼编码

 

另外的补充:

1)哈夫曼编码是一种无前缀编码,即一组编码中任一编码都不是其他编码的前缀,使得解码时不易混淆。常用于数据压缩,加密解密等场合。

2)哈夫曼编码也是一种可变字长编码,每个字符编码的长度可以是不相等的。

3)哈夫曼编码的过程其实是在构造一棵二叉树,其中每个待编码的字符是这棵二叉树的叶子节点。

注意:1)叶子节点的权值:是对叶子节点赋予的一个有意义的数值量,通常表示对应字符在所在字符串中出现的次数。

           2)二叉树的带权路径长度:是从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。

           3)给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,其中带权路径长度最小的二叉树就称之为哈夫曼树

哈夫曼结构通过贪心性质选取局部最优解(这里是概率最高),左右子树没有严格划分 ,哈夫曼树左右子树可以换

上面题目的赫夫曼编码流程:

哈夫曼编码( huffman编码),哈夫曼树(也翻译赫夫曼)_第2张图片

 

 

你可能感兴趣的:(算法)