Alexis何春光
2019-01-12
留言里feifei说的两种解决思路都是错的,给的链接也失效了.... 老师可以回复一下防止误导后来的同学呀!
以及没有看出来霍夫曼算法和贪心算法有什么联系,求详细讲解
9
29
评论 9
auko
文章里有说 : "根据贪心的思想,我们可以把出现频率比较多的字符,用稍微短一些的编码;出现频率比较少的字符,用稍微长一些的编码。"
我的理解 :
限制值 : 1. 压缩后信息不丢失
2. 易解压缩
期望值 : 尽可能地压缩
↓
用长短不一的编码来标识唯一字符 , 保证信息不丢失 , 同时解压缩时可识别
此时根据贪心 , 满足限制值 , 要想期望值更高 , 需要短的编码更经常地"被使用" , 所以高频字符用短的编码
↓
霍夫曼编码
2020-02-09
1
风
个人觉得,教程里从贪心算法,引导读者接受huffman树,是不合适的。正确的顺序我建议是:
二进制编码,前缀编码最省空间,以编码目标为叶子结点的一个二叉树代表了一种前缀编码方案,带权路径长度,贪心,huffman树。
2020-01-19
驹哥
用一个实际例子来说,假设字符串为“ABBCCCDDDDEEEEEFFFFFFGGGGGGGHHHHHHHH”,出现频率分别为A1B2C3D4E5F6G7H8:
如果按照每次合并最小两节点来构造哈夫曼树,那么最终树的高度为5,最常出现的字符H的编码为11,最不常出现的字符A的编码为00000。
如果按照每次合并最大两节点来构造哈夫曼树,则最终树的高度为7,最常出现的H编码为1111111,最不常出现的A的编码为0。
现在知道哈夫曼编码和贪心算法的关系了吗?
2019-12-26
1
驹哥
哈夫曼编码最重要的一步就是构造哈夫曼树,构造了哈夫曼树之后,则哈夫曼编码就呼之欲出了。
而构造哈夫曼树的过程,采用了贪心算法的思想:每次只选择值(出现频率)最小的2个元素作为左右孩子,这俩孩子的父节点的值,就等于这俩孩子之和;它俩的父节点作为下一轮参选的元素之一,如此循环,直到根节点被构造出来,则哈夫曼树构建完毕。
至于为什么每次都选择最小的俩节点就是最优解呢?可以借鉴 2-way merge sort的过程。
举例,有4个队列,分别有1、2、3、4个元素。先合并1、2需操作3次,得到3、3、4,然后合并3、3需操作6次,得到6、4,然后合并6、4需操作10次,一共操作3+6+10=19次,得到一个10元素的数组。
另一种做法,如果先合并3、4操作7次,得到7、2、1,再合并7、2操作9次,得到9、1,再合并9、1操作10次,一共操作7+9+10=26次后,得到一个10元素数组。
可见,每次合并最小的两个有序数组是归并排序的最优做法。而哈夫曼树的构造,这些“操作次数”就变成了树的内节点的值,哈夫曼树的目的是为了压缩空间占用,那么当然是树的所有节点之和越小越好。
2019-12-26
1
水手
数据结构与算法分析 书中是这样说的,“该算法是贪婪算法的原因在于,在每一阶段我们都进行一次合并而没有进行全局的考虑。我们只是选择两颗最小的树。”
2019-11-27
1
ttttt
谢谢提醒
2019-10-01
AllenGFLiu
霍夫曼编码的目的是为了减少编码占用的空间大小,通过让出现频率最高的字符使用最短编码的形式来达成
2019-08-24
Jerry银银
核心是这句话: “出现频率高的字符使用较短的编码,出现频率低的字符使用较长的编码,从而保证整体编码最短”
2019-07-19
2
DriveMan_邱...
Jerry银银
又在这里碰见了你
2019-09-10
1
✕