既然是从霍夫曼压缩入手的,就先来看看它是个什么东西:
一种压缩算法,用较少的比特表示出现频率高的字符,用较多的比特表示出现频率低的字符。
它的大致过程是这样的:
- 假设压缩
“beep boop beer!”
计算字符频次,由小到大排序,得到Priority Queue
字符 次数 ‘r’ 1 ‘!’ 1 ‘p’ 2 ‘o’ 2 ‘ ‘ 2 ‘b’ 3 ‘e’ 4 每次取前两个节点,分别作为左、右节点,次数相加合并为根节点,将根节点按由小到大的顺序插入Priority Queue,由此生成二叉树
将二叉树左支编码0,右支编码1,由路径得出字符的编码
字符 编码 ‘b’ 00 ‘e’ 11 ‘p’ 101 ‘ ‘ 011 ‘o’ 010 ‘r’ 1000 ‘!’ 1001
详细过程见参考2
Python代码如下(基本思路和上述过程一致,利用堆的特性操作数据,每次执行得到的具体树和编码不保证相同):
class HuffmanCompression:
class Trie:
def __init__(self, val, char=''):
self.val = val