贪心算法--区间调度问题

news2024/11/24 17:30:24

贪心算法

引言

贪心算法是一种简单而有效的算法设计技巧,在解决一些优化问题时具有广泛的应用。其基本思想是通过每一步的局部最优选择,最终达到全局最优解。贪心算法通常不会回溯之前的决策,而是根据当前状态作出最优决策,因此其执行效率较高。

贪心算法的应用十分广泛,涵盖了诸多领域,如图论、计算机网络、调度问题等。在某些情况下,贪心算法能够给出最优解,但也存在一些问题并不适合贪心策略的情况。因此,了解贪心算法的原理、应用场景以及适用性是十分重要的。

原理

贪心算法(Greedy Algorithm)是一种解决问题的算法范式,其基本思想是通过每一步的局部最优选择,最终达到全局最优解。在贪心算法中,每一步都选择当前情况下的最优解,并希望通过这种局部最优的选择,最终得到全局最优解。

贪心算法的核心思想可以概括为以下两点:

  1. 贪心选择性质:贪心算法每一步都做出一个局部最优的选择,即当前情况下看起来最好的选择。
  2. 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称该问题具有最优子结构性质。贪心算法通过递归地求解子问题,并利用最优子结构性质,可以保证每一步的选择都是最优的。

贪心算法通常不会回溯之前的决策,而是根据当前状态作出最优决策。这使得贪心算法执行效率较高,但也限制了其能够解决的问题范围。贪心算法通常适用于满足贪心选择性质和最优子结构性质的问题,例如最小生成树、最短路径、任务调度等。

需要注意的是,并非所有问题都适合使用贪心算法求解,因为贪心算法可能会得到局部最优解而不是全局最优解。因此,在应用贪心算法时,需要仔细分析问题的特点,确保问题满足贪心选择性质和最优子结构性质,以及贪心算法能够得到正确的解。

应用场景

贪心算法在许多领域都有广泛的应用,特别是在以下几个方面:

  1. 最小生成树: 在图论中,贪心算法经常用于构建最小生成树,例如 Prim 算法和 Kruskal 算法。这些算法通过每次选择权值最小的边来构建最小生成树,从而实现图的最优连通。
  2. 最短路径问题: 在图论中,Dijkstra 算法和 A* 算法等都是基于贪心策略的最短路径算法。它们通过每次选择当前距离最短的顶点来逐步确定起点到其他顶点的最短路径。
  3. 任务调度问题: 在任务调度问题中,贪心算法可以用于优化任务的执行顺序,以使得总执行时间最小化。例如,按照任务的截止时间或处理时间进行排序,然后依次执行。
  4. 背包问题: 在背包问题中,贪心算法可以用于近似求解,例如分数背包问题中的分数贪心算法。这种算法每次选择单位价值最高的物品放入背包中,以尽可能达到背包的容量限制并使总价值最大化。
  5. 区间调度问题: 在区间调度问题中,贪心算法可以用于确定最大数量的互不重叠的区间。例如,会议安排问题中,每次选择结束时间最早的会议安排,以尽可能安排更多的会议。
  6. Huffman 编码: Huffman 编码是一种用于数据压缩的贪心算法。它通过构建一棵最优前缀树来实现对字符的编码,使得出现频率较高的字符拥有较短的编码,从而实现数据的高效压缩。

实现贪心算法

本篇我们主要分享的是区间调度问题相关例题。

452. 用最少数量的箭引爆气球

image-20240524180422090

我们以**[[10,16],[2,8],[1,6],[7,12]]**为例:

原气球的排列为:

image-20240524190910742

题目要求求出引爆所有气球所必须射出的 最小 弓箭数

如果按照原来顺序去判断的话,很难找出有重复的气球,所以我们可以对气球先进行排序(按照左边界或者右边界排序都可以,本题我按照左边界排序来进行讲解)

排序后为:

image-20240524191023959

排序了之后我们就可以从上往下遍历去判断是否重合了。

当下面的气球的左边界小于等于上面气球的右边界时,证明两个气球重合,可以用一支箭引爆。

当然下面一个气球有可能和上面两个气球都重合,如果只和上面一个气球重合而不和上上面气球重合的话,那么还需要额外的一支箭去引爆。为了实现判断,当两支气球重合时,我们可以把右边界缩小为两个气球右边界较小的一个值(因为此时新气球的左边界一定大于等于上面两个气球的左边界,所以不用判断),如果新气球左边界小于上面气球的右边界,那么就不需要额外的箭就能引爆。

遍历完所有的气球,我们便可以统计出需要的箭的数量。

下面为代码实现:

class Solution {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0)
            return 0;
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));//不使用a[0] - b[0]而使用Integer.compare(a, b)是为了防止整数溢出
        int ans = 1;
        for (int i = 1; i < points.length; i++) {
            if (points[i][0] <= points[i - 1][1]) {
                points[i][1] = Math.min(points[i][1], points[i - 1][1]);//把上一个气球右边界修改为较小值
            } else {
                ans++;
            }
        }
        return ans;
    }
}

435. 无重叠区间

image-20240524184413408

本题相比于上一题增加了一点难度,下面我是按照我的思路来讲解。

首先我们依然是要先进行排序(用**[[1,2],[2,3],[3,4],[1,3]]**举例):

在这里插入图片描述

排序后为:
在这里插入图片描述

我们可以直观地看出只要删除1,3便可以实现剩下的区间没有重叠。

那么具体代码上怎么去实现呢?

整体思路和上一道题有些类似,当本区间左边界比上一个区间右边界小的时候我们就需要去删除了。删除在代码上只需要将此区间右边界设置为此区间与上一个区间中的较小值就可以了。如果此区间左边界大于等于上一个区间右边界,那么就证明两个区间没有重合,不需要进行操作。

下面是代码实现:

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals.length == 0)
            return 0;
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        int ans = 0;
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);
                ans++;
            } 
        }
        return ans;
    }
}

56. 合并区间

image-20240524192004312

本题和上面两道题也比较类似,大致讲一下思路。

先进行排序,然后用此区间左边界与上一个区间右边界进行比较,如果满足重叠,则进行记录。

下面用代码来具体看一下:

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        List<int[]> list = new LinkedList<>();
        for (int i = 0; i < intervals.length; i++) {
            if (list.isEmpty() || list.get(list.size() - 1)[1] < intervals[i][0]) {//如果集合为空或者此区间左边界大于最后录入集合的区间右边界,则直接记录答案就可以了,反之就证明有重叠
                list.add(intervals[i]);
            } else {
                list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1], intervals[i][1]);//重叠的区间左边界是不用变的,右边界需要修改成两个区间右边界的较大值,就可以了
            }
        }
        return list.toArray(new int[list.size()][]);
    }
}

结语

在本文中,我们深入探讨了贪心算法的原理、应用场景以及实现方法。贪心算法作为一种简单而强大的算法设计技巧,已经在许多领域得到了广泛的应用,如图论、任务调度、最优化问题等。通过每一步的局部最优选择,贪心算法能够快速地找到问题的最优解,具有较高的执行效率。

在实际应用中,贪心算法的灵活运用能够为我们带来更多的便利和效益。通过深入理解贪心算法的原理和特点,我们可以更好地利用这一算法工具,为解决实际问题提供有效的解决方案。

希望本文能够帮助读者更好地理解贪心算法,并在实际应用中取得更好的效果。

贪心算法能够快速地找到问题的最优解,具有较高的执行效率。

在实际应用中,贪心算法的灵活运用能够为我们带来更多的便利和效益。通过深入理解贪心算法的原理和特点,我们可以更好地利用这一算法工具,为解决实际问题提供有效的解决方案。

希望本文能够帮助读者更好地理解贪心算法,并在实际应用中取得更好的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

Leetcode刷题2

文章目录 前言寻找两个正序数组的中位数1️⃣ 双指针快速排序2️⃣ 第k小数解法 Z 字形变换1️⃣ 个人解法2️⃣巧妙解法13️⃣巧妙解法2 字符串转换整数 (atoi)1️⃣ 常规方法2️⃣ 作弊方法&#x1f62b; 整数转罗马数字1️⃣ 常规方法&#xff1a;按照给定规则写出判断条件即…

Python使用thread模块实现多线程

介绍&#xff1a; 线程&#xff08;Threads&#xff09;是操作系统提供的一种轻量级的执行单元&#xff0c;可以在一个进程内并发执行多个任务。每个线程都有自己的执行上下文&#xff0c;包括栈、寄存器和程序计数器。 在Python中&#xff0c;可以使用threading模块创建和管理…

Mybatis源码剖析---第一讲

Mybatis源码剖析 基础环境搭建 JDK8 Maven3.6.3&#xff08;别的版本也可以…&#xff09; MySQL 8.0.28 --> MySQL 8 Mybatis 3.4.6 准备jar&#xff0c;准备数据库数据 把依赖导入pom.xml中 <properties><project.build.sourceEncoding>UTF-8</p…

面试问题小结

说说你的项目&#xff0c;从里面学到啥了&#xff08;随便说&#xff09; CAS 线程池 的各个方面 线程咋创建&#xff08;4种方式&#xff09; 说一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B树中咋存储的&#xff08;类似下面的图&#xff0c;变通一下就行了&a…

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…

k8s集群部署成功后某个节点突然出现notready状态解决办法

通过&#xff1a; kubectl get nodes 查看master1节点为not ready 通过查看日志&#xff1a; journalctl -f -u kubelet.service 看到这里 查看状态&#xff1a; systemctl status kubelet.service 重启一样会报错 执行&#xff1a; swapoff -a 执行后&#xff0c;重启…

行业首发 | MS08067-SecGPT(送邀请码)

一、简介 MS08067-SecGPT基于LLM大模型技术专门为网络安全领域设计的智能助手&#xff0c;集问答、分析、工具为一体的对话式安全专家&#xff0c;支持可以创建多会话问答。目的是辅助用户完成网络安全相关的工作&#xff0c;学员通过问答方式体验到SecGPT所具备的威胁情报分…

查看目录或文件的磁盘使用情况

在排查问题过程中&#xff0c;会遇到磁盘占满&#xff0c;需要排查具体哪个文件占用比较大&#xff0c;此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括&#xff1a; -h 或 --human-readable&#xff1a;以人类可读的格式&#xff08;如 K、M、G&#xff09;…

机器学习第四十周周报 WDN GGNN

文章目录 week40 WDN GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 问题提出3.2 GNN3.3 CSI GGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据获取4.3.2 参数设置4.3.3 实验结果 5. 结论二、GGNN1. 代码解释2. 网络结构小结参考文献参考文…

汉明码(海明码)的计算的规则

一.汉明码的由来 1.汉明码&#xff08;Hamming Code&#xff09;&#xff0c;是在电信领域的一种线性调试码&#xff0c;以发明者理查德卫斯里汉明的名字命名。汉明码在传输的消息流中插入验证码&#xff0c;当计算机存储或移动数据时&#xff0c;可能会产生数据位错误&#x…

mdm 推送证书制作教程

第一步点击获取&#xff0c;点击以后会下载一个zip压缩包 解压以后&#xff1a;会得到四个文件&#xff0c;请务必保存好&#xff0c;待会需要使用 登录apple开发者官网 https://developer.apple.com/account/resources/certificates/list 点击添加证书 找到mdm csr 然后点击…

Python | Leetcode Python题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsequeue1 collections.deque([p])queue2 collections.deque([q])while queue1 and queue2:node…

在Windows上创建RAM Disk

在Windows 10上创建一个与Linux中的tmpfs相似的内存文件系统&#xff08;一个文件系统&#xff0c;它使用主内存作为存储&#xff09;通常不是操作系统直接提供的功能。不过&#xff0c;有一些方法可以实现类似的效果。 使用软件创建RAM Disk 有一些第三方软件可以帮助在Wind…

crmeb Pro版/多店版商城付费会员、会员卡功能说明

一、功能介绍 用户开通付费会员后&#xff0c;可获得多项商城优惠&#xff0c;商家可通过此功能锁定重要客户&#xff0c;培养客户消费习惯等 二、操作流程 用户 &#xff1e; 会员管理 &#xff1e; 付费会员 三、功能说明 会员类型 付费卡类型&#xff1a;月卡、季卡、年卡…

集合框框框地架

这一次来介绍一下常用的集合&#xff1a; 首先是两种集合的《家庭系谱图》&#xff1a; 接下来介绍一下集合的种类&#xff1a; Collection Set SetTreeSet&#xff1a;基于红⿊树实现&#xff0c;⽀持有序性操作&#xff0c;例如&#xff1a;根据⼀个范围查找元素的操作。但…

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃&#xff0c;其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性&#xff0c;使其能够无缝处理和生成文本、音频…

基于灰狼优化算法优化支持向量机(GWO-SVM)时序预测

代码原理及流程 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的时序预测代码的原理和流程如下&#xff1a; 1. **数据准备**&#xff1a;准备时序预测的数据集&#xff0c;将数据集按照时间顺序划分为训练集和测试集。 2. **初始化灰狼群体和SVM模型参数…

机器学习云环境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下载对应版本的 OBS Broswer 软件&#xff0c;如图&#xff0c;红框内的为安装文件&#xff0c;蓝色框内的为对应安装文件的校验文件&#xff08;无需下载&#xff09; 以 64 位机为例&#xff0c;下载完…

1.OLED

1.基础知识