ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构与算法-贪心算法

2020-12-21 21:01:23  阅读:244  来源: 互联网

标签:数据结构 int 算法 startTime endTime Meeting 贪心


贪心算法的套路:一定会有一个排序。哈夫曼编码,贪心算法,压缩算法。最短路径
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

贪心算法其最重要的两个点就是:
贪心策略:排序
通过局部最优解能够得到全局最优解
一般通过以下问题就可以通过贪心算法解决:
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 + "]";
    }

}

标签:数据结构,int,算法,startTime,endTime,Meeting,贪心
来源: https://blog.csdn.net/lht337636295/article/details/111499710

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有