
贪心算法是一种求可行解的算法,它并不像遗传算法一样可以求出全局最优解,贪心算法只是为了求出可行解,并不肯定是最优的。
有一堆大小不同的包裹需要装到箱子里,假如用贪心算法实现的话,那么方式就是先拣大个的包裹往箱子里塞,至于以后的事他就不论了,每次都是先挑出最大的包裹装在箱子里。
首先,贪心算法有两个性质
什么叫贪心选择?从字义上就是贪心也就是目光短线。贪图眼前利益。在算法中就是仅仅依据当前已有的信息就做出选择,并且以后都不会改变这次选择。(这是和动态规划法的主要差别)
所以对于一个详细问题。要确定它能否具备贪心选择性质,必需证实每做一步贪心选择能否终于导致问题的总体最优解。
当一个问题的最优解包括其子问题的最优解时,称此问题具备最优子结构性质。
这个性质和动态规划法的一样,最优子结构性质是可用动态规划算法或者贪心算法求解的关键特征。
哈夫曼编码是一种变长编码方式,浅显来说就是假如给定一段文字或者者一段字符,在这里面出现次数多的字符的编码长度更短,比方给定“ABABDGDBAAA”这样一段字符串,显著看出A出现的次数最多,所以他的权重值更大。按照权重值从小到大的顺序先进行排列,取出权重值最小的两个构成一棵二叉树的左右孩子节点,父节点的权重值就是两个孩子节点权重值的加和。将两个孩子节点删除,让新的父节点加入到排列顺序当中,继续选出新的两个最小权重值重复上述动作,直到最后形成一个根节点。而后将最终形成的树的根节点编码为0,所有的左孩子节点也编码为0,右孩子节点为1,则每个字符的编码就是从根节点到该字符节点的路径编码。
image
image关于具体的哈夫曼树的数据结构可以参考数据结构书上的二叉树章节。
哈夫曼编码步骤: