算法考前突击第四章贪心算法

本文介绍了贪心算法的概念,强调了贪心选择性质和最优子结构的重要性。通过哈夫曼编码展示了贪心算法的应用,包括哈夫曼树的构建、前缀码和最优前缀码的定义。此外,还探讨了贪心算法在解决单源最短路径、最小生成树等问题中的应用。同时,对比了0-1背包问题和背包问题,说明了贪心算法在某些问题中的局限性。最后,提供了一些实际问题如最优装载、活动选择和多元Huffman编码问题的贪心解法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重要函数:
头文件#include
sort(数组名,数组名+要排序的元素个数) 函数作用:递增排序
reverse(数组名,数组名+要排序的元素个数) 函数作用:逆置数组
1概念
顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。
可以用贪心算法求解的问题的性质:贪心选择性质,最优子结构性质。
贪心选择性质:每一步所作的贪心选择最终导致问题的整体最优解。
最优子结构:一个问题的最优解包含其子问题的最优解。
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行。
2哈夫曼编码
如何画哈夫曼树?
https://jingyan.baidu.com/article/a501d80c16dfa0ec620f5e70.html
哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表格来建立一个用0,1串表示各字符的最优表示方式。给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码,可以大大缩短总码长。
例:一个包含100,000个字符的文件,各字符出现频率不同,频率表格如下所示。在定长变码的情况下文件共需要需要100,000x3=300,000位。
a b c d e f
频率(千次) 45 13 12 16 9 5
定长码 000 001 010 011 100 101
变长码 0 101 100 111 1101 1100
按表中变长编码方案,文件的总码长为:(45×1+13×3+12×3+16×3+9×4+5×4)×1000=224,000。比用定长码方案总码长较少约45%
前缀码:对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。
例下图对应的前缀码为{00,011,1}
这里写图片描述
前缀码与二叉树存在一一对应关系。且最优前缀码是一棵完全二叉树。
完全二叉树:每个结点都有两个儿子。
设C为编码字符集。C中字符c的频率为f(c),字符c在树T中的深度记为这里写图片描述,它依然是字符c的前缀码长。
平均码长定义为:这里写图片描述

使平均码长达到最小的前缀码编码方案称为给定编码字符集C的最优前缀码。
哈夫曼提出构造最优前缀码的贪心算法,由此产生的编码方案称为哈夫曼编码。
3单源最短路径
4最小生成树
5.基础
0-1背包问题与背包问题
0-1背包问题:
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。
背包问题:
与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。
用贪心算法解背包问题的基本步骤:首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。
最优装载:有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
用贪心算法解最优装载的基本步骤:采用重量最轻者先装的贪心选择策略。
活动会选择http://blog.youkuaiyun.com/myloveprogrmming/article/details/78406035
最优合并http://blog.youkuaiyun.com/myloveprogrmming/article/details/78407282
会场安排:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)对于给定的k个待安排的活动,计算使用最少会场的时间表。
Input
输入数据的第一行有1 个正整数k(k≤10000),表示有k个待安排的活动。接下来的k行中,每行有2个正整数,分别表示k个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。
输出一个整数,表示最少会场数。
Sample Input 5:
1 23 ;12 28 ;25 35 ;27 80 ;36 50 .
若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
将各个活动按照开始时间从小到大排列,遍历每一个活动,先确定一组相容的颜色,然后从不相容的开始用剩下的活动确定另一组颜色…依次。这里写图片描述
多元Huffman编码问题
在一个操场上摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。对于给定n堆石子,计算合并成一堆的最大总费用和最小总费用。
输入数据的第1 行有2 个正整数n和k(n≤100000,k≤10000),表示有n堆石子,每次至少选2 堆最多选k堆石子合并。第2 行有n个数,分别表示每堆石子的个数。
将计算出的最大总费用和最小总费用输出,两个整数之间用空格分开。
Sample Input
7 3
45 13 12 16 9 5 22
Sample Output
593 199
Source
例:7 3 45 13 12 16 9 5 22
贪心策略:
最小费用:每次选最多的堆数,从石子数小的开始选择。最大费用:每次选2队,从石子数最大的开始选择。
排序:5,9,12,13,16,22,45
最小费用= (5+9+12)+(13+16+22)+ (5+9+12)+(13+16+22 )+45)
最大费用=(((45+22
+45+22 +16)+ 45+22 +16 +13
+45+22 +16 +13 +12)+ 45+22 +16 +13 +12 +9+ + 45+22 +16 +13 +12 +9 +5)
13,16,22,26,45
26,45,51

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值