贪心算法
2016-09-27 23:11
211 查看
贪心算法
一、定义
什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。
贪心算法的基本思路如下:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每个子问题求解,得到每个子问题的局部最优解。
4.把每个子问题的局部最优解合成为原来问题的一个解。
实现该算法的过程:
从问题的某一初始状态出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
二:活动安排问题
设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si >= fj或sj >= fi时,活动i与活动j相容.怎么尽可能地安排多的相容活动呢?设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
注意要按结束时间的早晚排列,没排好的话,你可以回去用各种方法自己排.既然贪心么就是越早结束越好,给后面留尽可能多的空间.其次"目光短浅",从排列好的里一个个选,能选一个是一个,别管后面的...
显然,我们选择到了
(1)1-4,(4)5-7,(8)8-11,(11)12-14
感觉不靠谱么,其实对于这个活动安排问题,贪心算法总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。
我们还是来代码:
三:代码如下
package com.sangfor.tree; import java.util.ArrayList; import java.util.List; public class greedy { public static void main(String[] args) { int[] start = {1,3,0,5,3,5,6,8,8,2,12}; int[] end = {4,5,6,7,8,9,10,11,12,13,14}; int[] arrangement = arrange1(start, end); int count = 0; for (int val : arrangement) { if (val != 0) { System.out.println("startTime:" + start[val-1] + "endTime" + end[val -1]); count++; } } System.out.println("一共有几段" + count); System.out.println("------------------"); List<Integer> list = arrange2(start, end); for (int val : list) { System.out.println("startTime:" + start[val] + "endTime" + end[val]); } System.out.println("一共有几段" + list.size()); } public static int[] arrange1(int[] start, int[] end){ if (start == null) { return null; } if (end == null) { return null; } int length = start.length; int[] arrangement = new int[length]; int endTime = end[0]; int count = 1; arrangement[0] = 1;//结束时间最短的 for (int i = 0;i < length; i++) { if (start[i] > endTime) { arrangement[count++] = i + 1; endTime = end[i]; } } return arrangement; } public static List<Integer> arrange2(int[] start, int[] end){ if (start == null) { return null; } if (end == null) { return null; } List arrangement = new ArrayList(); int length = start.length; int endTime = end[0]; arrangement.add(0); for (int i = 0; i < length; i++) { if (start[i] > endTime) { arrangement.add(i); endTime = end[i]; } } return arrangement; } }
结果:
startTime:1endTime4 startTime:5endTime7 startTime:8endTime11 startTime:12endTime14 一共有几段4 ------------------ startTime:1endTime4 startTime:5endTime7 startTime:8endTime11 startTime:12endTime14 一共有几段4
附带一些很好的博客地址:
http://blog.csdn.net/caroline_wendy/article/details/37914103 http://blog.csdn.net/keshuai19940722
python learn http://blog.csdn.net/u012515223/article/category/1702735 http://www.jianshu.com/p/b617a4be86b9 很值得一看 http://langgengxin.com/2016/02/14/Structure-5/#u6700_u77ED_u8DEF_u5F84_u95EE_u9898_28Dijkstra_26amp_3BFloyd_29 图的学习 http://langgengxin.com/ 很不错 简书里面的