Huffman算法/编码不一定能得出最优二叉树
来源:互联网 发布:淘宝店铺负责人更改 编辑:程序博客网 时间:2024/06/05 09:17
最优二叉树或Huffman树是带权路径长度(WPL)最小的二叉树
在一般的书籍上,Huffman算法(哈夫曼编码,赫夫曼编码)是一种能构造出Huffman树的一个带有一般规律的算法,同时是能构造出最优前缀码的贪心算法。
以前一直以为哈夫曼算法/编码一定能构造出最优二叉树。
但在看到石子合并问题时:
http://www.cnblogs.com/SCAU_que/articles/1893979.html
用3 ,4, 6, 5 ,4 ,2去构造最优二叉树。
(1)如果使用贪心法求最小得分,应该是如下的合并步骤:
第一次合并 3 4 6 5 4 2 2,3合并得分是5
第二次合并 5 4 6 5 4 5,4合并得分是9
第三次合并 9 6 5 4 5,4合并得分是9
第四次合并 9 6 9 9,6合并得分是15
第五次合并 15 9 15,9合并得分是24
总得分=5+9+9+15+24=62
(2)但是如果采用如下合并方法,却可以得到比上面得分更少的方法:
第一次合并 3 4 6 5 4 2 3,4合并得分是7
第二次合并 7 6 5 4 2 7,6合并得分是13
第三次合并 13 5 4 2 4,2合并得分是6
第四次合并 13 5 6 5,6合并得分是11
第五次合并 13 11 13,11合并得分是24
总得分=7+13+6+11+24=61
首先方法(1)确实是按哈夫曼算法构造出来的,但从上面的例子可以看出,方法(2)的WPL更小,可见最优二叉树不一定由哈夫曼算法来构造。
转一段话
”贪心算法是一个快速的、不稳定的算法。贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的近似(具有不稳定性)。当“贪心序列”中的每项互异且当问题没有重叠性时,看起来总能通过贪心算法取得(近似)最优解的。“
同时我看到网上仍然有不少用贪心算法解决石子合并问题的,比如
http://blog.csdn.net/acdreamers/article/details/18039073
这个帖子中说到当合并的是任意两堆,用贪心就可以得出最优二叉树了。但在我分析下,任意两堆和相邻两堆并没什么区别,不管你"任意"怎么取,始终可以按取的顺序排列为相邻的。所以这个帖子里的第一个问题应该还是用第二个问题用到的动态规划方法解,不知道我的理解是否有问题,希望有人能给我指出。
由于我英语渣,谷歌/stackoverflow了仍然找不到哈夫曼算法/贪心算法构造的二叉树一定是最优二叉树的证明,网上更多的是哈夫曼算法构造哈夫曼编码的应用,即前缀编码。
- Huffman算法/编码不一定能得出最优二叉树
- 最优二叉树以及huffman编码
- Huffman算法(最优二叉树)
- 哈夫曼树(huffman)--最优二叉树的编码实现
- 构造最优二叉树-赫夫曼(Huffman)树算法
- Huffman算法实现最优二叉树(C++)
- 最优二叉树(哈弗曼(Huffman)树)
- 哈夫曼Huffman树(最优二叉树)
- C++实现Huffman最优二叉树
- 基于二叉树和双向链表实现限制长度的最优Huffman编码
- 基于二叉树和数组实现限制长度的最优Huffman编码
- 二叉树和Huffman编码
- [C/C++] 构造最优二叉树-赫夫曼(哈夫曼、Huffman)树算法实现
- C语言实现最优二叉树——霍夫曼(Huffman)树算法
- [C/C++] 构造最优二叉树-赫夫曼(哈夫曼、Huffman)树算法实现
- 最优二叉树算法
- 最优二叉树&&哈夫曼编码
- poj 3253 Huffman树(最优二叉树)
- MyEclipse的优化,加快打开和编辑的速度
- jvm垃圾收集策略和算法
- 从B 树、B+ 树、B* 树谈到R 树
- 如何给python安装.whl文件
- iOS开发系列--地图与定位
- Huffman算法/编码不一定能得出最优二叉树
- iOS开发系列--通知与消息机制
- 配置Filter
- 源代码的设计、控制、实现与合作
- RTMP特性分析
- C3P0的详细配置说明(com.mchange.v2.c3p0.ComboPooledDataSource)
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- 活动——Intent在活动之间穿梭
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总