[1 什么是贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解
哈夫曼编码问题,可以用贪心算法来解还是比较爽的啊(上一篇博客我还在想贪心算法能解的问题不多)。下面来详细讨论一下哈夫曼编码问题。
问题描述:现有一个文本文件,其中包含的字符数据出现的次数各不相同,先要求对该文本中包含的字符进行编码,使文本占用的位数更小。
问题分析:我们知道文件的存储都是以二进制数表示的,如:字符c可以表示为010101...之类的。因为不同的操作系统对于不同的数据类型会分配给相同的数据容器长度,如java中int型数据固定占用4个字节的存储空间。现在问题时因为各个字符出现的概率不同,那么我们就可以给出现概率高的字符分配以"短"的二进制表示数,给出现概率低的字符分配以"长"的二进制表示数。从而达到降低平均每字符占用的空间数,进而实现无损的空间压缩。
OK,我们来论证哈夫曼编码问题的贪心选择性质。这里必须介绍一下的是,我们会使用二叉树这种数据结构来解哈夫曼问题。从根节点到叶节点经过的路径就是某个叶节点对象(这里就是字符)的编码值。那么从直觉(恩,直觉,我觉的解贪心算法的话,直觉很重要)上将讲,应该将概率低的元素放置到树的底部,将概率高的元素放置到树的顶部。代码如下:
package com.wly.algorithmbase.greedy;
import java.util.ArrayList;
/**
* 贪心算法解哈夫曼编码问题
*
* @author wly
*
<