哈夫曼编码原理

哈夫曼编码原理

参考:

1. 简介

定义

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是Huffman于1952年提出的一种编码方式,是一种可变字长编码(VLC)。该方法完全依据字符出现概率进行构造的平均长度最短的编码,因此也称之为最佳编码。

应用

得益于哈夫曼编码可以得到一个平均长度最短的码文,因此应用场景很多,在此列举三个:

  • apache负载均衡的按权重请求策略的底层算法
  • 路由器的路由算法
  • zip文件的其中一种压缩算法

2. 编码原理

哈夫曼编码大致分为三步:

① 统计字符出现频率;

② 根据频率构造一颗哈夫曼树,这也是一颗最优二叉树。

③ 对哈夫曼树进行01编码,得到最后的码文。

最优二叉树的定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树。

假设一条文本内容(100 bytes)如下:

AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCDDDEEEEEEEEEEEFFFFFFFFFFFFFFGGGGGGGHHHHHHHH

步骤一:统计字符出现频率

字符频数(便于观察,频数当作频率)
A5
B29
C23
D3
E11
F14
G7
H8

步骤二:构造哈夫曼树

赫夫曼编码的具体方法:先按出现的概率大小排队,把两个最小的概率相加,作为新的概率 和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。

构造过程如下图:

在这里插入图片描述

步骤三:进行01编码

根据最终得到的哈夫曼树,向左为0,向右为1,可得到每个字符的编码如下表:

字符频数(便于观察,频数当作频率)编码
A500001
B2901
C2311
D300000
E11101
F14001
G70001
H8100

最终得到码文为:

0000100001000010000100001010101010101010101010101010101010101010101010101010101010111111111111111111111111111111111111111111111110000000000000001011011011011011011011011011011010010010010010010010010010010010010010010010001000100010001000100010001100100100100100100100100

最后,我们比较一下编码前后的长度:

编码前:100 bytes
编码后:25+58+46+15+33+42+28+24=271/8 = 33.875 bytes

实际上,对于同一组频数(也称频率或权值),存在不同构的哈夫曼树,例如任意非叶结点的左右子树交换后仍是该组频数的哈夫曼树,但最终编码长度是相同的。同时,哈夫曼编码也是一种非前缀码,要求任一字符的编码都不能是另一字符编码的前缀。

未完待续:哈夫曼编码算法实现

  • 14
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值