贪心算法(活动选择、分数背包问题)

一、贪心算法

        贪心算法是指:在对问题求解时,总是做出在当前看来是最好的选择,而不从整体最优考虑,做出的仅是在某种意义上的局部最优解。                                                                                            贪心算法不是对所有问题都能得到整体最优解,但能产生整体最优解或者其近似解

        基本思路:

        通过一种贪心的想法,使得得到当前的局部最优解,从而拓展至整体最优解(不一定)。所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

        贪心算法的弊端: 

              1.不能保证得到的最后解一定是最佳的,可能存在近似解(不保证一定的正确)。

              2.不能用来求最大或最小解问题。

              3.只能求满足某些约束条件的可行解的范围。

二、活动选择问题

        1.题目描述:

    假定有一个n个活动(activity)的集合S={a1, a2, ..., an},这些活动使用同一个资源(例如一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。 每个活动ai都有一个开始时间si和一个结束时间fi。 如果两个活动[si, fi)和[sj, fj)不重叠,则称它们是兼容的

        目标: 找到互相兼容的最大活动子集

        互相兼容的最大活动子集样例:

   

            2.贪心思想的策略

                针对每个新活动,计算其与已经举办过的活动之间的兼容性。

                ①最早启动优先:对于所有活动,以 si 升序排列

                ②最短时长优先:以 fi - si 升序排列

                ③最少冲突优先:对于每个 i,统计与其冲突的活动数量 ci ,以 ci  升序排列

                ④最早结束优先:以 fi 升序排列

        贪心算法不保证正确性,以上四种想法,对于 ① ② ③ 均存在反例验证出其错误。

        3.贪心思想的正确性验证(最早结束优先): 

        设E={a1,a2,.....,an}为活动集合,且E中的活动是按照活动结束时间升序排列的,显然a1为最早结束。设A是问题的一个最优解,明显A是E的一个子集,设A的第一个活动为k

        ① 若 k = a1,则A的第一个活动就是最早结束的,故A是以贪心选择开始的最优解

        ② 若 k ≠ a1,设集合B=(A-{k})∪a1 ,即用活动a1可替换掉活动k

        因为a_{1}的结束时间小于k,故a_{1}k提前结束。另外由于A中的活动是相容的,故B中的活动也相容。      又因为A中的活动个数和B中的活动个数相同,故B也是最优解(需要注意的是最优解一般不唯一)。所以 B 是一个以贪心选择活动 a1 为开始后的最优解。

        或者另一种想法:

        对于最早结束的第一个活动 a1, 局部最优解考虑a1,再考虑 a2 :

         若 s2>f1 a1,a2 兼容,则问题只需要考虑 a2 ~ an,问题变成了子问题 a2 ~ an 。

         若 s2<f1  a1,a2 冲突,不考虑 a1, 令 a2 为最优解的第一个活动,则此时在 a3~an 的最优解中,加上 a1 或者 a2 的活动(不冲突时),才成为整体的最优解。此时考虑 a1 或者 a2 都是最优解,活动兼容的个数都相同,所以此贪心思想是正确的。

        4. 此外该问题还存在另一种贪心思想:

        选择最晚开始的活动依次排序考虑,其他与上述思想一致。

三、拓展问题:最少资源投入

        1.问题描述

        假定有一个n个活动的集合S={a1, a2, ..., an},这些活动可以同时使用多个资源(例如一个阶梯教室),但一个资源在某个时刻只能供一个活动使用。 每个活动 ai 都有一个开始时间 si 和一个结束时间 fi 。 如果两个活动 [ si ,  fi ) 和 [ sj , fj ) 不重叠,则称它们是兼容的

        目标: 找到最少资源数量,使得所有活动能够正常举行.

         2.贪心思想:

        ①首先将所有课程按照开始时间升序排列,并且将每门课程赋予任何可兼容的教室。

        ②通过维护一个优先队列,按照结束时间升序排列(队列首端的结束时间最早),队列中的每个元素对应着各教室的结束时间。

        ③这样当新的一个活动加入时,只需要与队首元素对应的结束时间比较,若大于结束时间则直接替换,若小于最早的结束时间,则需要加入一个元素(添加一个新的教室)

四、分数背包问题

       1.问题描述 

        给定背包容量和一些物品,每个物品有重量和价值两个属性。允许只取一个物品的一部分加入背包,求问如何才能使背包装的物品价值最大。

背包问题实质上是一个线性规划问题,可以用单纯形法、椭球法、内点法(后两者均为多项式时间算法)等求解。但在这个问题中,简单的贪心算法就能够求出最优解。

        2.贪心思想:

        既然能够取某个物品的一部分加入背包,则可以先计算出每个物品的单位重量对应的价值再从高到低依次排序,依次放入背包,直至达到背包的总容量(贪心)。

        即先取最划算的,从最划算的依次往下取。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始的软件测试学习之旅(九)jmeter直连数据库及jmeter断言,关联

jmeter直连数据库及断言,关联 jmeter直连数据库步骤jmeter断言jmeter逻辑控制器if控制器ForEach控制器循环控制器 Jmeter关联Jmeter关联XPath提取器Jmeter关联正则表达式提取器二者比较跨线程组关联 每日复习 jmeter直连数据库 概念 这不叫直连:Jmeter -> java/python 提供的…

【linuxC语言】fcntl和ioctl函数

文章目录 前言一、功能介绍二、具体使用2.1 fcntl函数2.2 ioctl函数 三、拓展&#xff1a;填写arg总结 前言 在Linux系统编程中&#xff0c;经常会涉及到对文件描述符、套接字以及设备的控制操作。fcntl和ioctl函数就是用来进行这些控制操作的两个重要的系统调用。它们提供了对…

JavaEE 多线程详细讲解(1)

1.线程是什么 &#xff08;shift F6&#xff09;改类名 1.1.并发编程是什么 &#xff08;1&#xff09;当前的CPU&#xff0c;都是多核心CPU &#xff08;2&#xff09;需要一些特定的编程技巧&#xff0c;把要完成的仍无&#xff0c;拆解成多个部分&#xff0c;并且分别让…

Leetcode—933. 最近的请求次数【简单】

2024每日刷题&#xff08;128&#xff09; Leetcode—933. 最近的请求次数 实现代码 class RecentCounter { public:RecentCounter() {}int ping(int t) {q.push(t);while(t - 3000 > q.front()) {q.pop();}return q.size();} private:queue<int> q; };/*** Your Re…

嵌入式学习69-C++(Opencv)

知识零碎&#xff1a; QT的两种编译模式 1.debug 调试模式 …

c 双向链表

图片 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void){ struct film{char name[20];int id;struct film *pre; //前向指针struct film *next; //后向指针 };struct film *headNULL;struct film *ls,*lspre,*work;in…

rabbitmq集群搭建失败解决

1. 现象 1. 三台机器都已经修改hosts&#xff0c;各个节点ping节点名正常 2. erlang.cookie各节点值一样 执行下面步骤加入失败 rabbitmqctl stop_app # 停止rabbitmq服务 rabbitmqctl reset # 清空节点状态 rabbitmqctl join_cluster rabbitrabbitmq3 rabbitmqctl start_ap…

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…

全栈开发之路——前端篇(5)组件间通讯和接口等知识补充

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 辅助文档&…

游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)

所用工具下载地址&#xff1a; https://pan.quark.cn/s/d54e7cdc55e6 在上次课程中&#xff0c;我们成功获取了人物对象的基址&#xff1a;[[[0xd75db8]1C]28]&#xff0c;而人物血量的地址则是基址再加上偏移量278。 接下来&#xff0c;我们需要执行以下步骤来进一步操作&a…

牛客题-链表内区间反转

链表内区间反转 这是代码 typedef struct ListNode listnode; struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {if (head NULL) {return NULL;}listnode* findhead head;listnode* findtail head;listnode* prev NULL;int count1 m;int count2…

Mysql总结

推荐你阅读 互联网大厂万字专题总结 Redis总结 JUC总结 操作系统总结 JVM总结 Mysql总结 互联网大厂常考知识点 什么是系统调用 CPU底层锁指令有哪些 AQS与ReentrantLock原理 旁路策略缓存一致性 Java通配符看这一篇就够 基础篇 Mysql 的一条语句是如何执行的 Server 层是上层…

C++学习笔记——对仿函数的理解

文章目录 思维导图仿函数出现的逻辑仿函数使用上的巧妙 仿函数的本质仿函数的优势仿函数语法的巧妙 思维导图 仿函数出现的逻辑 我们在学习stack时会遇到一些新的问题&#xff0c;这些问题需要我们使用非类型模板参数去解决&#xff0c;即我们需要在设计类时需要有一个途径去快…

C++反射之检测struct或class是否实现指定函数

目录 1.引言 2.检测结构体或类的静态函数 3.检测结构体或类的成员函数 3.1.方法1 3.2.方法2 1.引言 诸如Java, C#这些语言是设计的时候就有反射支持的。c没有原生的反射支持。并且&#xff0c;c提供给我们的运行时类型信息非常少&#xff0c;只是通过typeinfo提供了有限的…

【练习3】

1.将二叉搜索树转为排序的双向链表 (好久没看数据结构&#xff0c;忘完了&#xff0c;学习大佬的代码&#xff09; class Solution { public:Node* prenullptr,*headnullptr; //pre为每次遍历时的前一个节点&#xff0c;head记录头节点Node* treeToDoublyList(Node* root) {if…

Tomcat 优化

在目前流行的互联网架构中&#xff0c;Tomcat在目前的网络编程中是举足轻重的&#xff0c;由于Tomcat的运行依赖于JVM&#xff0c;从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分。 一、JVM组成 1. JVM 组成 JVM组成部分 类加载子系统: 使用Ja…

第 8 章 电机测速(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.3.3 电机测速01_理论 测速实现是调速实现的前提&#xff0c;本节主要介绍AB相增量式编码器测速原理。 1.概…

JavaScript异步编程——04-同源和跨域

同源和跨域 同源 同源策略是浏览器的一种安全策略&#xff0c;所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口完全相同。 跨域问题的解决方案 从我自己的网站访问别人网站的内容&#xff0c;就叫跨域。 出于安全性考虑&#xff0c;浏览器不允许ajax跨域获取…

轻量级密码算法可用于哪些应用场景?

轻量级密码算法&#xff0c;以其设计简洁、计算效率高、资源消耗低的特点&#xff0c;成为密码学中一个重要的分支。这些算法特别适用于资源受限的环境&#xff0c;能够在保证安全性的同时&#xff0c;满足对处理能力、存储空间和能耗的限制。 轻量级密码算法特点及应用 近年来…

[C++]哈希应用-布隆过滤器快速入门

布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是一个由布隆在1970年提出的概率型数据结构&#xff0c;它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器的主要特点是高效的插入和查询&#xff0c;可以用于检索一个元素是否在一个集合中。 原理…