1、基本思想:贪心法通过分步决策的方式求解问题。贪剑法每一步用作决策根据的选择准则称为最优量度标准(局部最优解)。在按照最优量度标准选择份量的过程中哈夫曼编码贪心算法时间复杂度,还须要使用一个可行解判断函数(约束条件)。
2、贪武学通常具有2个重要的性质:
贪心选择性质、最优子结构性质
贪心选择性质:是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别(贪剑法有贪心选择性质)。
最优子结构性质:一个问题的最优解包含其子问题的最优解。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特点。
3、两类挎包问题:
0/1挎包问题:假若每一件物品不能分割,只能作为整体或则放入挎包哈夫曼编码贪心算法时间复杂度,或则不放入;
通常挎包问题:简称挎包问题,假若物品是可以分割的,也就是容许将其中的一部份放入挎包。(贪剑法)
贪剑法不能解决0/1挎包问题。
贪心选择指把这些单位价值(pi/wi)最高的物体先倒入挎包。
4、贪武学算法特性:
(1)一步一步进行,按照某个最优测度标准,每一步都要保证获得局部最优解。
(2)每一步只考虑一个输入,它的选定应满足局部优化条件。
(3)若下一个输入与部份最优解连在一起不再是可行的解时,就不把该输入加到部分解中。
(4)直至把所有输入枚举完或则不能再加入为止。
5、活动安排问题
各活动的起始时间和结束时间储存于一维链表s[]和f[]中,且按结束时间的非减序排列。算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。该算法的贪心选择的意义是使剩余的可安排时间段极大化,便于安排尽可能多的相容活动。
时间复杂度
当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间即可安排n个活动,使最多的活动能相容地使用公共资源;假如所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。
6、最佳合并模式
两路合并最佳模式的最优量度标准为带权外路径宽度最小。
带权外路径宽度是针对扩展二叉树而言的。
扩展二叉树中除叶子结点外,其余结点都必须有两个儿子。扩展二叉树的带权外路径宽度定义为:
7、最小代价生成树
最优量度标准:选择促使迄今为止已入围S中边的代价之和增量最小的边。
普里姆算法的贪心准则是:在保证S所代表的子图是一棵树的前提下,选择一条最小代价的边e=(u,v)。普里姆算法的时间复杂度是O(
)。
克鲁斯卡尔算法的贪心准则是:按边代价的非减顺序考察E中的边,从中选择一条代价最小的边e=(u,v)。克鲁斯卡尔算法的时间复杂度是O(nlogn)。
8、哈夫曼编码
用于数据文件压缩的非常有效的编码方式。假设待压缩的数据为字符序列和字符在序列中出现的频度。
哈夫曼贪心算法:借助每位字符出现的频度构建一棵表示各字符的最优二叉树,之后用0和1两个元素构成的串表示各字符的最优表示方法。
前缀码:只用0/1对字符进行编码,并限定任一字符的编码都不是另一个字符编码的前缀,则称这样的编码为前缀码。
哈夫曼编码构造:哈夫曼提出的构造最优前缀码的贪心算法,以及由此形成的编码方案称为哈夫曼编码。哈夫曼算法以自底向下的形式构造表示最优前缀码的二叉树T。算法以|C|个叶结点开始,执行|C|-1次的“合并”运算后形成最终所要求的树T。
9、多机调度问题
这个问题是NP完全问题,到目前为止还没有有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。
采用最长处理时间作业优先的贪心选择策略可以设计出解多机调度问题的较好的近似算法。按此策略:
当n≤m时,只要将机器i的[0,ti]时间区间分配给作业i即可,算法只须要O(1)时间(作业可同时进行)。
当n>m时,首先将n个作业依其所需的处理时间从大到小排序。之后依此次序将作业分配给空闲的处理机。算法所需的估算时间为O(nlogn)。(作业个数比服务器多)