1. 问题
问题:给定字符集c={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。
2. 解析
构造最优前缀码的贪心算法就是哈夫曼算法(Huffman)
初始化n个单节点的树,每个字符的概率记在树的根中,用作树的权重。
找到两棵权重最小的树,作为新树中的左右子树,并把权重和作为新的权重记录在新树的根中。
重复第二步直至所有的数据都变成哈夫曼树的叶子结点
实例:
{5,5,10,10,10,15,20,25}
3. 设计
[核心伪代码]
For i =1 to n-1{
creat z //构造新父节点
z.left = C中最小元x
z.right = C中最小元y
z.weight=x.weight+y.weight
insert(T,z) //将节点插入树T中
}
return T
4. 分析
O(nlogn)频率排序;
for 循环:O ( n );
插入操作: O(logn)
算法时间复杂度是O(nlogn)