贪心算法总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案。贪心算法正是"活在当下,看清楚眼前”的算法,从问题的初始解开始,一步步地做出当前最好的选择,逐步逼近问题的目标,尽可能得到最优解;即使得不到最优解,也可以得到最优解的近似解。
但是贪心算法并不是从整体最优来考虑的,它所做出的选择只是某种意义上的局部最优。
1、贪心本质
我们在遇到具体问题时,往往分不清对哪些问题可以用贪心算法,对哪些问题不可以用贪心算法。实际上,如果问题具有两个特性:贪心选择性质和最优子结构性质,则可以用贪心算法。
- 贪心选择性质:原问题的整体最优解可以通过一系列局部最优的选择得到;
最优子结构性质:当一个问题的最优解包含其子问题的最优解。
2、最优装载
package 贪心算法; import java.util.Arrays; public class 古董装箱 { public static void main(String[] args) { double a[]= {1.4,5,7,18.1,6.7,9.5,7,4,5,8,12,3,4,5,5,6,4};//各个商品的重量 Arrays.sort(a); int b=a.length;//商品的数量 int c=30;//船的载重 double tmp=0.0;//tmp:已装载到船上的古董的重量 int ans=0;//ans:已装载古董的个数 for(int i=0;i<b;i++) { tmp=tmp+a[i]; if(tmp<=c) { ans++; } else { break; } } System.out.println("装载的产品数量:"+ans); // TODO 自动生成的方法存根 } }
算法分析:
- 时间复杂度:按古董重量排序并调用sort函数,其平均时间复杂度为O(nlogn),输入和贪心策略求解的两个for语句的时间复杂度均为0("),因此总时间复杂度为C»(nlogn)o
- 空间复杂度:在程序中使用了 tmp、ans等辅助变量,空间复杂度为0(1)。