贪心算法的套路:一定会有一个排序。哈夫曼编码,贪心算法,压缩算法。最短路径
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
贪心算法其最重要的两个点就是:
贪心策略:排序
通过局部最优解能够得到全局最优解
一般通过以下问题就可以通过贪心算法解决:
1.针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。
2.一般会有一个排序,找出贡献最大的。
3.举例看贪心是否可以解决。
一般用在任务调度,教师排课等系统。
实际上,用贪心算法解决问题的思路,并不总能给出最优解,比如来看下一个问题:
package edu.sort;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 贪心算法
* 贪心算法又称贪婪算法,它在求解问题时,总是做出眼前利益最大化
* 也就说只顾眼前不顾大局,所以他是局部最优解。
* 核心:通过局部最优,推出全局最优
* 场景:
* 1,N个会议室,N个会议,如何保证会议室利用率最大化
* 2,购物消费券,如何能够最大可能的利用优惠券,如淘宝的300
* 3,最短路径
* 4,最高效使用
* 5,任务调度
* 6,教师排课系统
* <p>
* 能够使用贪心算法的场景一般有以下场景
* 1,针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。
* 2,一般会有一个排序,找出最优解
* 3,举例贪心算法是否可以解决
* <p>
* 实际上贪心算法,并不总能给出最优解
*
* @author: LHT
* @date: 2020/12/21 19:38
*/
public class GreedyAlgorithm {
/**
* 举例会议室时间安排
*/
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
List<Meeting> meetings = new ArrayList<Meeting>();
int n = cin.nextInt(); //n个会议
for (int i = 0; i < n; i++) {
int start = cin.nextInt();
int end = cin.nextInt();
Meeting meeting = new Meeting(i + 1, start, end);
meetings.add(meeting);
}
meetings.sort(null);
int curTime = 0; //当前的时间,从一天的0点开始,如果领导要求从8点开始 那curTime=8
for (int i = 0; i < n; i++) {
Meeting meeting = meetings.get(i);
if (meeting.startTime >= curTime) { //会议的开始时间比我们当前的要大 表示可以开
System.out.println(meeting.toString());
curTime = meeting.endTime;
}
}
}
}
class Meeting implements Comparable<Meeting> {
int meNum; // 编号
int startTime; // 开始时间
int endTime; // 结束时间
public Meeting(int meNum, int startTime, int endTime) {
super();
this.meNum = meNum;
this.startTime = startTime;
this.endTime = endTime;
}
public int compareTo(Meeting o) {
if (this.endTime > o.endTime)
return 1;
return -1;
}
@Override
public String toString() {
return "Meeting [meNum=" + meNum + ", startTime=" + startTime
+ ", endTime=" + endTime + "]";
}
}