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了仍然找不到哈夫曼算法/贪心算法构造的二叉树一定是最优二叉树的证明,网上更多的是哈夫曼算法构造哈夫曼编码的应用,即前缀编码。




0 0
原创粉丝点击