算法分析与设计实践(作业十一):最优前缀码 [贪心法——哈夫曼编码]

本文介绍了使用贪心算法实现哈夫曼编码的过程,通过不断合并权值最小的二叉树来构造最优前缀码。详细解析了算法的步骤,包括权值排序、树的合并以及编码生成。最后,展示了具体的数据结果,包括字符频率、哈夫曼编码表等。整个算法的时间复杂度为O(nlogn)。
摘要由CSDN通过智能技术生成

算法分析与设计实践(作业十一):最优前缀码[贪心法——哈夫曼编码]

1. 问题

在这里插入图片描述

2. 解析

实例与实现过程如下:
在这里插入图片描述
在这里插入图片描述

  1. 根据给定的n个权值w1,w2,…,wn构成n棵二叉树的森林F={T1,T2,…,Tn}(其中每棵二叉树Ti中只有一个权值为wi的根节点,其左右子树均为空)

  2. 在森林F中选出两棵根结点权值最小的树,将这两棵树和并称一棵新树。(为了保证新树仍是二叉树,需要增加一个新结点作为新树的根,并将所选的两棵树根分别作为新树的左右孩子,将这两个孩子的权值之和作为新树根的权值) 在这里插入图片描述

  3. 对新的森林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) //插入点

5. 源码

源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值