先来看一个例子:
如果需要传输 一串文本:
abcdaabbbc(假设是ascii码)
一个英文字符是 1个字节,那么这里需要10 * 8=80bit(80位来表示)
能否使用某种编码,来减少位的使用,节省空间呢?
比如 高频率出现的字符使用较少的位来表示
低频率出现的字符可以使用相对较多的字符来表示
哈夫曼编码就是这个思想.
一 为什么哈夫曼算法能节省空间??
- 统计其中字符出现的次数
字符 | 次数 | 频率 |
---|---|---|
a | 3 | 3/10=0.3 |
b | 3 | 4/10= 0.4 |
c | 1 | 2/8= 0.2 |
d | 3 | 1/8= 0.1 |
- 将字符按照频率由低到高排列
字符 | 频率 | |||
---|---|---|---|---|
d | 0.1 | A= cd=c+d=0.3 | b=0.4 | C=B+b=1 |
c | 0.2 | a=0.3 | B=A+a=0.6 | |
a | 0.3 | b=0.4 | ||
b | 0.4 |
- 自底向上构建出一棵树:哈夫曼树(所有字符都在叶子节点,频率越小,深度越大),如下
C
/ \
B b
/ \
A a
/ \
c d
- 编码表:如果将向左记为1,向右记为0,
那么从根节点到各自叶节点的路径顺序即为编码:
字符 | 编码 | 频率 | 编码位数 |
---|---|---|---|
b | 0 | 0.4< |