Huffman编码(Huffman Coding),又称霍夫曼编码或赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法,由大卫·霍夫曼(David A. Huffman)在1952年发明。Huffman编码属于可变字长编码(VLC)的一种,其基本思想是根据字符在数据中出现的频率来分配不同长度的编码,出现频率高的字符分配较短的编码,出现频率低的字符分配较长的编码,从而达到数据压缩的目的。
Huffman编码的基本步骤
-
统计频率:首先,对需要编码的数据进行扫描,统计出每个字符(或符号)出现的频率。
-
构建Huffman树:
- 将每个字符看作一个节点,其权值(weight)设为该字符的频率。
- 创建一个优先队列(最小堆),将所有节点按权值从小到大排序并加入队列。
- 从队列中取出两个权值最小的节点,合并为一个新的节点,新节点的权值为这两个节点权值之和,并将这两个节点作为新节点的左右子节点。
- 将新节点加入队列,重复上述过程,直到队列中只剩下一个节点,这个节点就是Huffman树的根节点。
-
生成编码:从Huffman树的根节点开始,为到达每个字符节点的路径分配“0”或“1”(通常约定左子树为“0”,右子树为“1”),路径上的所有位构成的序列就是该字符的Huffman编码。