贪心算法,np完全问题
一:课程调度问题,若干节课都在同一个空教室上,如何排课最优?
答:step0:选出还没上课的结束最早的课,上课
step1:重复step0
在这个问题中,这个直接了当的算法就是最优解,同时它也为我们介绍了贪心算法的概念:
每步都选择局部最优解,最终得到全局优解
but不是每次都可以都得到全局最优解
二:小偷的背包问题
背包存放物品重量有限,偷取总价值最高的物品放在背包内,如何设计?
贪心策略会是这样设计:
step0:盗窃还可以装入背包的最贵物品
step1:重复step0
很轻易可以举出例子,证明这并不能全局最优
小偷能偷的东西个数不会很多,这个题可以用其他算法获取最优解,但下面这个例子告诉了我们贪心算法的意义所在
三:集合覆盖问题
每个集合包含不同的元素,如何用最少的集合覆盖掉全部的元素?
贪心策略:step0:选出最能覆盖掉还没被覆盖掉的元素的集合
step1:重复step0
一般思考策略,暴力求最优的解:算出能覆盖全部元素的所有集合组合(幂集),找出集合个数最少的那一个组合,则最多需要求解2的n次方个集合,效率很慢
而贪心算法的运行时间最多为n的平方,效率快的多
四:旅行商问题
一个旅行商想去n个不同的城市,求去完所有城市的较短路径
贪心策略:step0:选择还没去的最近的城市
step1:重复step0
一般思考策略:计算所有线路,可以发现线路数量会是n的阶乘,速度很慢
小小总结
三和四都属于经典的np完全问题(基本不可能设计出快速解决算法的问题)
广度优先算法,狄克斯特拉算法等,都属于贪心算法
元素增加运行效率会大大变慢,需要列出所有组合的问题大概率是np完全问题
可以画成集合覆盖问题,旅行商问题的一定是np完全问题
贪婪算法经常用于对np完全问题的近似求解
动态规划
小偷的背包问题,动态规划求解
由动态规划表格知:最优解是头手表和手机,总价值3000元
表格具体求解思路:
表格[行][列] = Max{表格[行-1][列],行头物品价值+表格[行][背包剩余容量]}
此题中,背包分为了0.5,1,1.5,的原因是存在重0.5的物品,如果全是整数则不用分成小数,如果小数为0.4或者其他,那么背包的表格还要分成0.4,1.4等
字符串最长公共子序列,动态规划求解
可以知道,以上三个字符串与源字符串最大公共子序列(最右下角的值)
此题的表格构造方法是,若字符不相等,则值为左边或者上面的元素值
若字符相等,值为左上角的值加一
小小总结
动态规划,需要我们不断根据前面数据规划子问题,前面的数据可以用一维数组,二维数组(看起来就是表格)来存储
动态规划的数据,应该是离散的,即数据之间没有关联性,不会互相影响
所以动态规划的思想,是将大问题分散成一个个离散子问题
(不知不觉居然写了1100字诶!!(0.o惊讶))