哈夫曼编码:
哈夫曼编码常用于通讯中压缩数据
每一字母在文中出现的次数就是一个结点的权值
然后按照权值生成最小二叉树(哈夫曼树) 确保字母节点都是叶节点
然后用哈夫曼树查询每个字母的编码
构造哈夫曼编码:
构造哈夫曼编码需要用到哈夫曼树
哈夫曼树:
我们现在有 一段讯息 "a b h c d c c b h d" 只考虑字母,那么:
a 1
b 2
c 3
d 2
h 2
哈夫曼编码旨在使用的多的编码长度更小,而使用少的就可以长一些 所以我们从小的开始 每次取两个最小的合并
取ab合并为一个权值为3的新节点删除ab 现在的节点为
重复上述步骤会得到:
我们规定向左为0向右为1
所以 a->000 b->001 c->01 d->10 h->11
在这里有一个性质
那就是传输的总长度就是各个新节点的和
a b h c d c c b h d
000 001 11 01 10 01 01 001 11 10
3 + 3 + 2 + 2 + 2 + 2 + 2 + 3 + 2 + 2 = 23
而各个新节点 10+6+4+3=23
构建哈夫曼树可以用优先队列实现