Huffman Tree(霍夫曼树)是一种二叉树,用于压缩数据和编码。它的结构和模样如下图所示:
Huffman Tree 由一个权值列表(通常是字符的出现频率)建立而成。透过一系列的操作,可以把权值最小的两个节点合并为一个新节点,新节点的权值等于它的两个子节点的权值之和。这个新节点会被插入回原权值列表中,并重复上述操作,直到只剩下一个节点,即为霍夫曼树的根节点。
对于一个待压缩的文本,可以透过霍夫曼编码将每个字符用另一个代表它的二进制码替代,使得密码簿的长度缩短,节省储存空间。具体方法是在霍夫曼树中,左子节点代表的二进制码为 0,右子节点为 1,将每个字符所对应的路径即可构成其二进制码。
举例来说,假设有一个文本 “aaabbcdddd”,每个字母的权值为:
则可以建立出以下的霍夫曼树:
从上图可知,字符 a 的二进制码为 0,字符 b 为 10,字符 c 为 110,字符 d 为 111。纪录压缩后的二进制码即可将原文本压缩。在解压缩时,透过霍夫曼树的路径,即可将每个二进制码替换成原本的字符,还原原文本。
Huffman Tree 是一种二叉树,用于进行有效的资料压缩和解压缩。
每个节点都有一个权值,该权值表示对应字符的出现频率。
民采用贪婪算法来构建Huffman Tree,即从权值最小的两个节点开始合并,直到所有节点都结合成一个树。
每个节点都是由两个子节点组成,左子树表示第一位二进制数0,右子树表示第一位二进制数1。
通过对Huffman Tree的遍历,可以编码每个字符,使其代表的二进制序列最短。
解码时,根据遍历Huffman Tree的路径来查找相应的字符,并将它们组合成原始数据。
Huffman Tree是一种可变长编码,字符的编码长度根据出现频率不同而不同,出现频率越高的字符编码越短。
Huffman Tree广泛应用于数据压缩和传输中,使数据传输更快,减少存储空间,并提高数据使用效率。
________0_______
/ \
____1____ ___0___
/ \ / \
d:13 e:16 ____1 c:12
/ \
b:9 a:5
_________0_________
/ \
___1___ ____0___
/ \ / \
c:15 ___1___ d:13 e:11
/ \
a:12 ___0___
/ \
b:5 f:3
__0__
/ \
/ \
_1_ 0
/ \ / \
1 __0__ 1 0
/ \ / \ / \
c:40 d:30 a:50 e:10 b:20
0
/ \
_1_ 1
/ \
0 __1__
/ \
0 _1_
/ \
a:20 b:15
/ / \
c:25 d:10 e:30
__0__
/ \
_1_ _1_
/ \ / \
a:40 b:25 __1__ f:5
/ \
c:15 __0__
/ \
d:10 e:5