问题
给出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>
#include<cstdlib>
#include</

本文介绍了最优前缀编码的问题背景,详细解析了哈夫曼编码算法的步骤,通过示例展示了如何计算编码后的总长度。接着讨论了算法的设计,并分析了其时间复杂度,最后提供了源码的github地址。
最低0.47元/天 解锁文章
852

被折叠的 条评论
为什么被折叠?



