问题
给出n个字符的频率,给每个字符赋予一个01编码串,使得任意一个字符的编码不是另一个字符编码的前缀,而且编码后总长度(每个字符的频率与编码长度乘积的总和)尽量小。
解析
哈夫曼算法
第一步:初始化n个单节点的树,并为它们标上字母表中的字符。把每个字符的概率记在树的根中,用来指出树的权重(更一般地来说,树的权重等于树中所有叶子的概率之和)。
第二步:重复下面的步骤,直到只剩一棵单独的树。找到两棵权重最小的树(对于权重相同的树,可任意选择其一)。把它们作为新树中的左右子树,并把其权重之和作为新的权重记录在新树的根中。
例:n=7,概率:1/10,1/10,1/10,1/10,1/10,2/10,3/10
为计算简便,只取分子,即1,1,1,1,1,2,3
权重:(1+1)*4+(1+1+1)*3+(2+3)*2/10=2.7
设计
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>