算法分析与设计实践(作业十一):最优前缀码[贪心法——哈夫曼编码]
1. 问题
2. 解析
实例与实现过程如下:
-
根据给定的n个权值w1,w2,…,wn构成n棵二叉树的森林F={T1,T2,…,Tn}(其中每棵二叉树Ti中只有一个权值为wi的根节点,其左右子树均为空)
-
在森林F中选出两棵根结点权值最小的树,将这两棵树和并称一棵新树。(为了保证新树仍是二叉树,需要增加一个新结点作为新树的根,并将所选的两棵树根分别作为新树的左右孩子,将这两个孩子的权值之和作为新树根的权值)
-
对新的森林F重复2。
但这样得到的前缀码不是最优的
在每次和并时,若新的一个加数小于等于另一个加数时,将前者放在后者左边(树中)。
结果为以下数据
分别为:
排序后节点序号:字符频率:字符的哈夫曼编码表
1:5:0110
2:5:0111
3:10:000
4:10:001
5:10:010
6:15:110
7:20:111
8:25:10
3. 分析
O(nlogn)频率排序;for 循环 O(n),插入操作 O(logn),算法时间复杂
度是 O(nlogn)
4. 设计
//按频率递增构成队列 Q
for i<-1 to n-1 do //循环
分配新节点z
z.left左节点为Q中最小元
z.right右节点为Q中最小元
z的计算根节点
Insert(Q,z) //插入点