贪心法【信息技术】.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《算法艺术与信息学竞赛》 标准课件 贪心法 刘汝佳 目录 一、几个简单的问题 二、活动安排问题 三、照亮的山景 四、喷水装置 五、Huffman编码 六、流水作业调度 七、任务时间表问题 一、几个简单的问题 最优装载问题: 给n个物体, 第i个物体重量为wi, 选择尽量多的物体, 使得总重量不超过C (can) 部分背包问题: 有n个物体, 第i个物体的重量为wi, 价值为vi, 在总重量不超过C的情况下让总价值尽量高(和书上的部分背包有出入) (can’t) 乘船问题: 有n个人, 第i个人重量为wi. 每艘船的载重量为C, 最多乘两个人. 用最少的船装载所有人 (can) 二、活动安排问题 有n个活动, 每个活动都有一个开始时间si和结束时间fi 选取尽量多的活动, 使得任意两个的时间都不冲突(前者的结束时间小于等于后者的开始时间) (can)线段覆盖模型 分析 数学模型: 给n个开区间, 选择尽量多的区间, 使得两两不交 算法: 首先按照f1=f2…=fn的顺序排序, 依次考虑各个活动, 如果没有和已经选择的活动冲突, 就选; 否则就不选 三、照亮的山景 山是关于x轴单调的折线, 上方有一条水平线, 一些固定位置上有灯. 开尽量少的灯, 照亮整个山. 一个点被某灯照到, 如果它和灯的连线上没有山上的其他点 分析 至此, 可以看出题目的本质. 数学模型: 给n个闭区间[ai,bi], 在数轴上选尽量少的点, 使每个区间内至少有一个点 算法: 首先按a1=a2…=an排序, a相同时按b从小到大排序. 每次标记当前区间的右端点x, 并右移当前区间指针, 直到当前区间不包含x, 再重复上述操作. (贪心操作,线段覆盖模型) 四、喷水装置 有n个喷水装置, 位于某草坪的中心线上. 每个装置可以润湿半径为r的圆. 开尽量少的喷水装置,润湿整块草坪 分析 至此, 可以看出题目的本质. 数学模型: 给n个闭区间[ai,bi], 选择尽量少的区间覆盖一个给定线段[s, f] 这里的区间是指的圆在草坪上方的割线; 算法: 对于每个区间, 删除在[s, f]之外的部分, 并按a1=a2…=an的顺序排序, a相同时按b从大到小排序. 从左到右扫描, 如果当前区间可以覆盖新的部分, 选择此线段 五、Huffman编码 给n个字符的频率,设计Huffman编码 信息压缩 信息压缩:最少需要多少比特来压缩一个给定的文本? 编码:字符和比特串之间的映射 串越短越好,但一位的串只有0和1两个 直观想法:频率高的字符编码成长串,频率低的编码成短串 问题:如果A?0, B?00,那么0000是代表AAAA, BB, AAB, ABA还是BAA呢? 前缀码 前缀编码:如果任何两个串都不互为前缀,则可以无歧义的解码 前缀编码可以用树来表示,叶子为字符,根到此叶子的路径为比特串, 如下图中E?00, A?010, N?110 分析 性质一:用树来做的编码满足前缀性质 证明:如果A编码是B编码的前缀,则从根走到B之前要先经过A,与A是叶子矛盾 性质二:任何前缀编码都可以用树来表示 证明:可以用无限树来表示任意编码,只需要把字符编码所对应的结点看作叶子,删除不需要经过的其他结点 贪心算法 按频率从小到大排序,每次合并两个树,新树的权为两树旧权之和,生成新树后应保持权有序 贪心算法 解码过程 解码过程是一种树的周游 如果遇到叶子,就输出字符并返回根 否则根据编码结果往编码为0或1的儿子走 程序实现 树序列的实现 有序数组:查找插入位置可以用二分查找,但插入导致的元素移动可能是O(n)的 链表:查找位置本身就是O(n)的 堆:每次需要插入和删除最小值,O(logn) 队列:注意到生成的新树的权一定是越来越大,因此另开一个队列保存新树,和原树一样,是两个有序表,每次O(1) 若频率已经有序,则主过程是线性的 六、流水作业调度 n个作业要在由两台机器M1和M2组成的流水线上完成加工. 每个作业i必须先在M1上然后在M2上加工, 时间分别为ai和bi 确定这n个作业的加工顺序, 使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小 分析 七、任务时间表问题 有n个任务, 每个任务都需要1个时间单位执行. 任务i的截止时间di(1=di=n)表示要求任务i在时间di前结束. 误时惩罚wi表示若任务i未在时间di之前结束将导致wi的惩罚 确定所有任务的执行顺序, 使得最惩罚最小 分析 称在限期内完成的任务为早任务, 收到罚款的任务为迟任务. 如果早任务紧跟在迟任务之后, 交换之后总罚款不变 假设对于相邻两个早任务i和i+1. 由于两个任务都是早任务, 因此tj+1=dj+1. 若didi+1, 则ti+1=di+1di, 交换以后

文档评论(0)

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

1亿VIP精品文档

相关文档