(算法设计与分析)第四章贪心算法-第一节:贪心算法概述

news2024/11/18 6:44:43

文章目录

  • 一:贪心算法
    • (1)概述
    • (2)特点
    • (3)框架
  • 二:典型贪心算法问题
    • (1)无重叠区间
      • ①:题目描述
      • ②:解题思路
      • ③:完整代码
    • (2)活动安排问题
      • ①:题目描述
      • ②:解题思路
      • ③:完整代码

一:贪心算法

(1)概述

贪心算法概述:贪心算法可以认为是动态规划算法的一个特例,该算法需要满足的条件(贪心选择性质)要多余动态规划,但效率要比动态规划高。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择(贪心选择)得到,当然这个问题只对部分问题成立

  • 例如:你面前摆放着100张人民币,要求你只能拿十张,才能拿到最多的面额。显然,每次选择剩下钞票中面值最大的一张,最后选择一定是最优的
  • 但现实中大部分问题不具有贪心选择性质,例如斗地主,对方出了“对3”,按照贪心策略,你应该尽可能出小的牌刚好压住对方,但现实情况并不这样,有可能我们会出王炸或其他牌。所以在这种情况下就只能使用动态规划解决了(这属于博弈问题

(2)特点

贪心算法特点

  • 贪心算法法在解决问题的策略上“目光短浅”,只根据当前已有的求解信息就做出局部最优选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变
  • 贪心法每次所做出的选择只是在某种意义上的局部最优选择,这种局部最优选择并不总能保证获得问题的整体最优解,但通常能获得近似最优解
  • 在众多的计算机算法中,贪心策略是最接近人们日常思维的一种解题策略

(3)框架

框架

Greedy(A, n) // A[1:n]代表n个输入
{
	Sort(A);
	solution = {}; //初始化解向量为空集
	for i to n do
		xi := Select(A)
		if Feasible(soltion, xi) then solution := Union(solution, xi)
		A = A - xi
		end if
		End for
		return (solution)
}

二:典型贪心算法问题

(1)无重叠区间

①:题目描述

给你很多形如 [start, end] 的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间,注意边界相同不算相交

  • 这个问题具有现实意义:比如你今天有好几个活动,每个活动都可以用区间 [start, end] 表示开始和结束的时间,请问你今天最多能参加几个活动呢?显然你一个人不能同时参加两个活动,所以说这个问题就是求这些时间区间的最大不相交子集
int intervalSchedule(int[][] intvs);

举个例子,intvs = [[1,3], [2,4], [3,6]],这些区间最多有 2 个区间互不相交,即 [[1,3], [3,6]],你的算法应该返回 2

②:解题思路

基本思路

  • 1:从区间集合intvs中选择一个区间 x x x,这个区间 x x x是在当前所有区间中结束最早的(也即end最小)
  • 2:把所有与 x x x区间相交的区间从区间集合intvs删除
  • 3:重复步骤1和步骤2,知道intvs为空为止,此时所有选出的区间 x x x就是最大不想交子集

贪心算法在解决问题时往往首先需要对数据进行预处理(常见的就是排序),所以这里为了方便步骤1和步骤2,我们可以先按照每个区间的end进行排序,然后再去执行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在判断是否相交时,如果它的start小于 x x xend,那么就是相交的,防止则是不相交的

在这里插入图片描述

③:完整代码

  • 这里采用Java,比较写反比较简单
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 0) return 0;
        //按照end进行升序排序
        Arrays.sort(intervals, new Comparator<int[]>(){
            public int compare(int[]a, int[]b){
                return a[1] - b[1];
            }
        });
        //count返回最大不相交区间,除非区间为空,所以至少有一个不相交的区间
        int count = 1;
        int x_end = intervals[0][1];
        for(int[] interval : intervals){
            int start = interval[0];
            if(start >= x_end){
                //说明终于找到了一个区间不相交
                count++;
                //更新下一个x
                x_end = interval[1];
            }
        }
        
        //注意题目问的是需要移除几个
        return intervals.length - count;
    }
}

(2)活动安排问题

①:题目描述

设有 n n n个活动的集合 E = { 1 , 2 , … , n } E = \{1,2,…,n\} E={1,2,,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i i i 都有一个要求使用该资源的起始时间 s i s_{i} si 和一个结束时间 f i f_{i} fi,且 s i < f i s_{i} < f_{i} si<fi。如果选择了活动 i i i,则它在半开时间区间 [ s i , f i ) [s_{i}, f_{i}) [si,fi)内占用资源。若区间 [ s i , f i ) [s_{i}, f_{i}) [si,fi)与区间 [ s j , f j ) [s_{j}, f_{j}) [sj,fj)不相交,则称活动 i i i与活动 j j j是相容的。也就是说,当 s i ≥ f j s_{i}\geq f_{j} sifj s j ≥ f i s_{j}\geq f_{i} sjfi时,活动 i i i与活动 j j j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合

②:解题思路

此问题本质就是无重叠区间问题,但相比上一题,我们需要把未重叠的子区间给打印出来

③:完整代码

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 0) return 0;
        // 用于保存最后的无重叠区间
        List<List<Integer>> arr = new ArrayList<>();

        //按照end进行升序排序
        Arrays.sort(intervals, new Comparator<int[]>(){
            public int compare(int[]a, int[]b){
                return a[1] - b[1];
            }
        });
        //count返回最大不相交区间,除非区间为空,所以至少有一个不相交的区间
        int count = 1;
        int x_end = intervals[0][1];

        List<Integer> first_temp = new ArrayList<>();
        first_temp.add(intervals[0][0]);
        first_temp.add(intervals[0][1]);
        arr.add(first_temp);

        for(int[] interval : intervals){
            
            int start = interval[0];
            if(start >= x_end){
                //说明终于找到了一个区间不相交
                List<Integer> temp = new ArrayList<>();
                temp.add(interval[0]);
                temp.add(interval[1]);
                arr.add(temp);

                count++;
                //更新下一个x
                x_end = interval[1];
            }
        }
        
        //注意题目问的是需要移除几个

        for(int i = 0; i < arr.size(); i++){
            System.out.println(arr.get(i));
        }
        return intervals.length - count;
    }
}

在这里插入图片描述

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

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

相关文章

【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、扫描识别二维码 不仅可以利用zxing库生成二维码&#xff0c;同样利用zxing库可以扫描二维码并解析得到原始文本&#xff0c;此时除了给build.gradle添加如下一行依赖配置 implementation com.google.zxing:core:3.4.1 还需要…

一文读懂什么是云原生|推荐收藏

Forrester数据显示&#xff0c;在2021年&#xff0c;全球云原生应用持续上升&#xff0c;组织中容器和无服务器技术的使用率在一年内都增长了75%以上。 Gartner预测&#xff0c;到2025年&#xff0c;将会有超过95%的新数字工作负载被部署在云原生平台上。 “未来的软件一定是长…

Qt第二十六章:QWidget、QMainWindow自定义标题栏

工具类&#xff08;读者直接复制到项目中&#xff09; class QCustomTitleBar:def __init__(self, window: QtWidgets):self.window window# 默认标题栏高度 必须设self.DEFAULT_TITILE_BAR_HEIGHT 40# 存储父类的双击事件self.mouseDoubleClickEvent_parent self.window.mo…

【数学】旋转后仍为函数图像问题

∣旋转后仍为函数图像问题NightguardSeries.∣\begin{vmatrix}\huge{\textsf{ 旋转后仍为函数图像问题 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 旋转后仍为函数图像问题 Nightguard Series. ​∣∣∣∣∣​ ♣例1\clubsuit \textsf{例1}♣例1 f(x)ln⁡(x…

经典bloom算法(**布隆过滤器**)-levelDB拆分

bloom算法(布隆过滤器) 原理 先说一下什么是布隆过滤器&#xff0c;Bloom Filter是1970年由布隆提出的&#xff0c;它实际上是一个很长的二进制向量&#xff0c;和一系列随机值映射的函数&#xff0c;主要用于判断一个元素是否在一个集合中。 通常判断一个元素是否在一个集合…

Hasse diagram

In order theory, a Hasse diagram (/ˈhsə/; German: [ˈhasə]) is a type of mathematical diagram used to represent a finite partially ordered set, in the form of a drawing of its transitive reduction. Concretely, for a partially ordered set (S, ≤) one rep…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生宿舍管理信息系统3x4rz

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

記錄下用google colab 进行GPU(TPU)训练

文章目录温馨提示打开网站上传资源下载资源到google colab温馨提示 需要科学上网&#xff0c;没有的话可以点这个 https://shandianpro.com/#/register?codewCXwkCOU下个clashx进行 挂载 https://download.csdn.net/download/monk96/87231589 配置自行百度 打开网站 google…

Win11系统提示backgroundtaskhost.exe系统错误解决方法

Win11系统提示backgroundtaskhost.exe系统错误解决方法分享。backgroundTaskHost.exe是与Microsoft Cortana的虚拟助手相关联的关键系统进程。近期有Win11用户在电脑的使用中遇到了系统提示“backgroundTaskHost.exe – ApplicATIon Error”的错误&#xff0c;今天我们一起来看…

[附源码]计算机毕业设计JAVA学生考试成绩分析系统

[附源码]计算机毕业设计JAVA学生考试成绩分析系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

疫情可视化part3

前言 之前在part2中说的添加自定义主题配色已经开发完成了&#xff0c;除此之外我还添加了一些的3d特效。 前期文章 这是part1的文章&#xff1a;https://blog.csdn.net/xi1213/article/details/126824752这是part2的文章&#xff1a;https://blog.csdn.net/xi1213/article/…

[附源码]Python计算机毕业设计Django基于VUE的网上订餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Linux】进程

1.linux操作系统要不要管理进程呢&#xff1f;必须要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2.linux是如何管理大量进程的呢&#xff1f;先组织&#xff0c;再描述。 1.什么是进程 进程就是系统运行中…

WordPress批量修改数据库内文章内容文字关键字标题

WordPress网站内容标题文字一键修改&#xff0c;注意到了网站上很多要一个个的修改&#xff0c;那工作了巨大&#xff0c;怎么快速在数据库中用SQL命令批量替换呢&#xff1f; 通过数据库替换方法 1.进入宝塔面板-数据库-选择对应的数据库-管理数据库-登录进来。就可以直接对数…

2022年小美赛“认证杯”数学建模ABCD题初步分析选题建议

​ 2022年小美赛数学建模赛题已经发布&#xff1a; A题 翼龙是如何飞行的 B题 序列的遗传过程 C题 对人类活动进行分类 D题 是否应长期禁止野生动物贸易 总体来说&#xff0c;从赛题难度来看B>A>C>D&#xff0c;其中CD属于ICM交叉学科类赛题&#xff0c;难度系数相对…

腾讯云原生安全“3+1”一体化方案发布,重构云上安全防御体系

12月1日&#xff0c;2022腾讯全球数字生态大会上&#xff0c;以“安全守护&#xff0c;行稳致远”为主题的「云原生安全专场」顺利召开&#xff0c;论坛深入讨论了云原生安全的行业发展趋势、技术探索、产品创新和落地实践。 会上&#xff0c;腾讯安全发布了云原生安全“31”一…

java面向对象-----再谈方法

目录 方法的重载(overload) 可变个数的形参 方法参数的值传递机制 基本数据类型的参数传递 引用数据类型的参数传递 递归(recursion)方法 总结 方法的重载(overload) 重载的概念 &#xff1a;在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参…

基于粒子群优化的神经网络PID控制(Matlab)代码实现

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

“空间代谢组学“用于食管鳞状细胞癌早期筛查的研究

​ 代谢组学文献分享—研究背景 近几年代谢组学的研究如火如荼的开展&#xff0c;极大地促进了各学科的发展&#xff0c;如疾病诊断与治疗、营养学、环境毒理学、进化和发育及药物等&#xff1b;与此同时&#xff0c;质谱成像技术&#xff08;mass spectrometry imaging, MSI…

动态规划思想

1.动态规划思想&#xff1a;因为计算量太大而提出的解放方式。将一件大的事情分成若干个小的事情。2.找一个最优的隐藏序列&#xff0c;结合动态规划思想&#xff0c;可以把这个隐藏序列分成多个时间步&#xff0c;如果每个时间步都是最优的&#xff0c;那么最终的这个序列就是…