贪婪算法是关注局部最优而非全局最优的算法策略,在对问题求解时,每次选择,都是当前最佳。当找出一个大致能解决问题的优秀解,而不需要要找出最完美的解的情况下,贪婪算法还是不错的。优秀和完美之间,需要考虑实现代价。例如:精确算法的时间复杂度是冥函数或阶乘函数,其实现代价将远远高于结果还不错的贪婪算法
数据量 | 精确算法 | 贪婪算法 |
---|---|---|
时间复杂度 | O(2N) | O(N2) |
5 | 3.2秒 | 2.5秒 |
10 | 102.4秒 | 10秒 |
32 | 13.6年 | 102.4秒 |
100 | 4x1021年 | 16.67分钟 |
NP完全问题:不能在确定的多项式时间内解决的问题,为NP完全问题,例如:集合覆盖问题、旅行商问题(经由几个点的最短路径)、所有涉及排列组合的问题。NP完全问题,在数据量少的时候,还可求解;在数据量大的时候,求解时间不可控,速度非常慢;遇到NP完全问题,直接放弃求最优解,直接用贪婪算法求近似解即可。
集合覆盖/排列组合问题计算公式参考:
- 有序为排列,Permutation,解决从N个物体中有序选出K个物体的所有可能性,P(N,K) = N!/(N-K)!,例如:给8个人发金银铜三个奖牌,有几种发放方法,金银铜是有序的,所以P(8,3) = 336
- 无序为组合,Combination,解决从N个物体中选出K个物体的所有组合,K个物体的顺序可能为:K!,所以:C(N,K)=P(N,K)/K!,例如:给8个人发三杯水,有几种发放方法,每杯水是一样,所以C(8,3) = P(8,3)/3! = 56
- N个物体的任意组合为2N,3种物体任意组合的可能性为8,4种物体任意组合的可能性为16。