贪心算法及其应用课件.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
区间问题3.有最终期限的区间调度问题 与上例相似的一道题:TOJ 1681 唯一的一点不同是toj 1681同一时刻只能处理一件产品,即上页算法中的L是1。因此toj 1681要简单一些。大家回去可以按照上述算法做一做。 参见如下部分代码: sort (a, a + n, cmp); memset (s, -1, sizeof(s)); for (i = 0; i n; i++) { for (j=a[ i ].d - 1; j = 0; j--) if (s[ j ] == -1) { s[ j ] = i; break; } } 区间问题4.最小区间覆盖问题 有n个区间,选择尽量少的区间,使得这些区间完全覆盖某线段[s,t]。 算法: 按左端点坐标排序 每次选择覆盖点s的区间中右端点坐标最大的一个,并更新s 直到所选区间已包含t 区间问题5.区间和点的有关问题 有n个区间,m个点。若某区间包含了某点,则构成一对匹配关系。选出最多的区间和相同数量的点,使对应的区间和点构成匹配关系。 算法: 所有点按坐标排序 选取包含该点且右端点坐标最小的区间 优化 按区间左端点排序,得到有序表 维护二叉堆,以区间右端点为关键字 所有点按坐标从小到大依次处理 维护二叉堆: 插入左端点小于等于该点坐标的区间 删除右端点小于该点坐标的区间 取出右端点坐标最小的与该点匹配并删除 区间问题总结 有序性——大多数问题都要先排序,经常要用到结构体、写比较函数。排序的时候要选好排序的关键字。 算法的选择与设计 优化——数据结构的选择:有时候为了避免超时,要进行适当优化,比如用二叉堆来维护,等等。 应用4——哈夫曼编码 哈夫曼编码是用于数据文件压缩的一个十分有效的编码方法。其压缩率在20%~90%之间。哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。 哈夫曼树(即最优二叉树),带权路径长度最小的二叉树。 应用4——哈夫曼编码 以自底向上的方式构造最优二叉树T。以|C|个叶子结点开始,执行|C|-1次的“合并”运算后产生最终所要求的树T,每次找到两个频度最低的对象进行合并,合并的结果是一个新对象,其频度为被合并的两个对象的频度之和。最终使得 (即树T的代价)最小。其中, f(c)——c出现的频度; ——c的深度。 应用4——哈夫曼编码 例:共有6个字母,各自频度如下: f:5 e:9 c:12 b:13 d:16 a:45 应用4——哈夫曼编码 应用4——哈夫曼编码 例题:TOJ 2849 题目大意:把一根长木板切成要求的n段,每段长度Li已知,共需切割n-1次。每次切割的花销与切割之前木板长度相等。求最小的花销。n=20000; Li=50000. Sample Input Sample Output 3 34 8 5 8 应用4——哈夫曼编码 TOJ 2849 尝试不同的贪心策略: 对于Sample,三段8,5,8,答案34。 34 = 21 + 13 = (8 + 8 + 5)+(8 + 5) 猜想贪心策略1:按照长度排序,每次切割下剩余部分中最长的?这种方法是否可行? 不可行!!! 原因:反例:输入:5、6、8、9,按上面的猜想策略做,9、8、6、5,每次切割前总长度分别是28、19、11,总花销=28+19+11=58.而实际上,这个例子的最优解应该是 56 = 28 + 11 + 17,也就是说第一次切成11和17两段,第二次把11切成5和6两段,第三次把17切成8和9两段。 应用4——哈夫曼编码 TOJ 2849 注意数据范围。可能超int,故而用long long。 参见如下代码: #include iostream #include algorithm using namespace std; const int N = 20002; long long heap[ N ]; int hcmp( int a, int b ) { return a b; //小顶堆的比较函数 } 应用4——哈夫曼编码 int main() { long long i, n, len, Length, TotalLength; while (scanf( %lld, n ) != EOF) { for (i = 0; i n; i++) scanf(%lld,

文档评论(0)

lxm + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档