【贪心算法经典应用】活动选择详解 python

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

活动选择问题是算法研究中的一个经典问题,广泛应用于资源分配领域,如会议室预订、课程安排等场景。问题的核心是在给定一组活动,每个活动都有一个开始时间和一个结束时间,要求选择最大数量的互不重叠的活动。

问题定义

给定( n )个活动,每个活动( i )都有一个开始时间 ( s_i )和结束时间 ( e_i )。选择一组最大的互不相交的活动集合,即在任意选定的两个活动( i )和( j ),满足( i =!j ),则( e_i <= s_j )或( e_j <= s_i )。

贪心选择策略

活动选择问题的贪心策略是基于活动的结束时间进行选择,即总是选择结束时间最早的活动。按照这种策略进行选择的理由如下:

  • 选择结束最早的活动将留给剩余活动最大的时间空间,从而增加后续选择活动的可能性。
  • 这种策略确保了每次选择都是局部最优的,即在当前剩余的活动集合中,选择一个与已选择的活动都不重叠且结束最早的活动。

算法步骤

  1. 输入:活动时间对列表 ((s_1, e_1), (s_2, e_2), …, (s_n, e_n))。
  2. 排序:按照活动的结束时间( e_i )进行升序排序。
  3. 初始化:选择排序后的第一个活动,因为它的结束时间最早。
  4. 迭代选择
    • 从剩余的活动中选择一个与已选择集合中所有活动都不重叠的活动,具体为选择结束时间最早且开始时间不早于最后一个已选择活动的结束时间的活动。
  5. 输出:返回选择的活动集合。

示例代码

以下是用 Python 实现的活动选择问题的贪心算法:

def activity_selection(activities):"""贪心算法选择最大的互不相交活动集:param activities: 列表,每个元素是元组(start_time, end_time):return: 最大互不相交活动集"""# 按活动的结束时间进行升序排序sorted_activities = sorted(activities, key=lambda x: x[1])# 选择的活动集selected_activities = []# 最后一个选择活动的结束时间last_end_time = 0# 遍历排序后的活动列表for start, end in sorted_activities:if start >= last_end_time:selected_activities.append((start, end))last_end_time = endreturn selected_activities# 给定的活动列表
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (8, 9), (5, 9)]# 获取最大互不相交的活动集
max_activities = activity_selection(activities)# 打印结果
print("Selected activities (Start, End):")
for activity in max_activities:print(activity)

算法分析

  • 时间复杂度:排序活动的时间复杂度为 ( O(n log n) ),选择活动的时间复杂度为 ( O(n) ),因此总时间复杂度为 ( O(n log n) )。
  • 空间复杂度:算法的空间复杂度为 ( O(1) ),如果不考虑输入数据的存储,只需常数空间用于索引和临时变量。
    为了更清晰地理解活动选择问题及其贪心算法实现,我们可以通过图解的方式来逐步展示算法的工作原理。图解将帮助我们可视化贪心选择策略是如何在实践中被应用以解决问题的。

活动选择问题的图解

以下一组活动,每个活动都有一个开始时间和结束时间:

步骤 1: 活动按结束时间排序

活动编号开始时间结束时间
114
235
306
457
589
659

步骤 2: 选择活动

接下来,我们选择结束时间最早的活动,并排除所有与其重叠的活动:

  1. 选择活动 1 (结束时间 4) - 选择这个活动因为它是第一个结束的。
  2. 排除活动 2 (因为它在活动 1 还未结束时开始了,即与活动 1 重叠)。
  3. 排除活动 3 (同样重叠于活动 1)。
  4. 选择活动 4 (下一个未重叠活动,开始时间 5,结束时间 7)。
  5. 排除活动 6 (与活动 4 重叠)。
  6. 选择活动 5 (下一个未重叠活动,开始时间 8,结束时间 9)。

图解表示

以下是活动时间线的图示,显示了如何选择活动:

时间线: 0---------1---------2---------3---------4---------5---------6---------7---------8---------9
活动 1:          [-----------------------------]
活动 2:                               [--------------------]
活动 3: [-----------------------------------------------------------]
活动 4:                                                   [-------------------]
活动 5:                                                                                 [----------]
活动 6:                                                   [----------------------------------------]

选择的活动: 1, 4, 5

步骤 3: 最终结果

我们最终选择的活动集合为活动 1, 4, 5,这是根据贪心算法从排序后的活动列表中选择的最大互不相交集。

结论

活动选择问题的贪心算法非常高效且易于实现。通过基于结束时间的排序和选择,它可以找到最大的互不相交的活动集合,适用于许多实际的调度和资源分配问题。此外,该问题的解法也深刻地体现了贪心算法设计的美妙和实用性,即通过每步的局部最优选择达到全局最优解

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

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

相关文章

2007. 从双倍数组中还原原数组

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一个整数数组 original 可以转变成一个 双…

ChatGPT版论文写作秘籍

ChatGPT无限次数:点击直达 ChatGPT版论文写作秘籍 在当今科技飞速发展的时代&#xff0c;人工智能技术的应用越来越广泛。其中&#xff0c;自然语言处理领域的ChatGPT模型在辅助写作方面展现出了非凡的能力。本文将为大家介绍如何利用ChatGPT改善论文写作的效率和质量。 Chat…

Android开发:发送验证码验证手机号——榛子云短信服务

榛子云短信官网 点击注册后进行登录 页面如下图所示很是简洁&#xff0c;也省去了很多复杂的流程 需要进行充值 价格相对公道&#xff0c;个人开发测试完全够用 我的应用中有后续开发要用到的AppId和AppSecret 短信模板中可以根据个人需要进行编辑但是要进行审核 后续开发中需…

python自动化之网易自动点歌

这个代码是是使用的pyautogui库和pyperclip库完成的&#xff0c;这个库是开源的地址如下&#xff1a;https://github.com/asweigart/pyautogui这里详细的用法想学习的可以到这看看 下面是代码&#xff1a; import pyautogui import subprocess import pyperclip import time i…

【大模型书籍分享】从零开始大模型开发与微调:基于PyTorch与ChatGLM

今天又来给大家推荐一本大模型方面的书籍<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM>。 本书使用PyTorch 2.0作为学习大模型的基本框架&#xff0c;以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术&#xff0c;为读者揭…

【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

素数判断:从O( n 2 n^2 n2)到O(n)学习之路 背景:每一个初学计算机的人肯定避免不了碰到素数&#xff0c;素数是什么&#xff0c;怎么判断&#xff1f; 素数的概念不难理解:素数即质数&#xff0c;指的是在大于1的自然数中&#xff0c;除了1和它本身不再有其他因数的自然数。 …

执行 kubeadm join 报错

执行 kubeadm join 192.168.31.220:6443 --token 2fn4t4.syeegrav0nadt9mh --discovery-token-ca-cert-hash sha256:df5eee**********************************2e6e653aa83ea8c32 报如下错误 error execution phase preflight: [preflight] Some fatal errors occurred: …

SPI接口的74HC595驱动数码管实现

摸鱼记录 Day_17 (((^-^))) review 前边已经学习了&#xff1a; 数码管显示原理&#xff1a;数码管动态扫描显示-CSDN博客 且挖了个SPI的坑坑 1. 今日份摸鱼任务 学习循环移位寄存器18 串行移位寄存器原理详解_哔哩哔哩_bilibili 学习SPI接口的74HC595驱动数码管19 SPI…

List实现(2)| LinkedList

参考&#xff1a;LinkedList 源码分析 在Java中&#xff0c;LinkedList是一个双向链表&#xff0c;实现了List和Deque接口&#xff0c;可以被当作列表&#xff08;List&#xff09;、队列&#xff08;Queue&#xff09;或者双端队列&#xff08;Deque&#xff09;使用。它允许…

简单3步制作纸质英语绘本的mp3英语朗读音频

孩子学英语&#xff0c;需要看很多英语绘本&#xff0c;而且要听配套的音频。但有些英语绘本是没有对应音频的&#xff0c;下面简单三步&#xff0c;就可以将任意英语绘本制作出对应的英语朗读音频。 第一步&#xff0c;手机拍照做成PDF文件&#xff1a; 绘本每一页拍照后&…

第三方软件测评报告测试内容详解

随着信息技术的迅猛发展&#xff0c;软件产品在各行各业的应用越来越广泛。为了确保软件产品的质量和性能&#xff0c;第三方软件测评报告成为了不可或缺的一环。那么&#xff0c;第三方软件测评报告测试内容究竟包括哪些呢&#xff1f;本文将从多个方面进行详细解析。 一、功…

解决IDEA https://start.spring.io/连接不上

1.换成下边这个地址试试 https://start.springboot.io/2.换成阿里云试试&#xff0c;绝对可行&#xff0c;但是版本有点低 https://start.aliyun.com

Centos7 一键yum阿里云源脚本;一键安装docker docker-compse ;一键安装 GParted;

目录 安装docker和设置阿里源 安装docker-compose YUM 一键安装 GParted 可以通过以下一键 Shell 脚本 测试机型x86-64平台 安装docker和设置阿里源 install_docker.sh #!/bin/bash# 设置阿里云的YUM仓库 cat > /etc/yum.repos.d/docker-ce.repo <<EOF [docker-c…

使用kafka的几种场景

1.消息异步化 在一个分布式的微服务架构中&#xff0c;实现一个聊天的功能&#xff0c;小明和小红互相给对方发消息&#xff0c;如果有两个netty服务器&#xff0c;小明连的是netty服务器1&#xff0c;小红连的是netty服务器2&#xff0c;现在小明给小红发消息&#xff0c;但是…

【C++]C/C++的内存管理

这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…

Cesium实现加载离线地形数据(nginx发布数据,cesiumLab地形切片数据)

实现效果如图&#xff1a; 详细步骤 1 下载地形数据&#xff08;DEM&#xff09; 下载地址&#xff1a;地理空间数据云 (gscloud.cn) 操作步骤&#xff1a; 注意&#xff1a;第3步可以自主选择DEM的分辨率&#xff0c;然后下载。 下载结果解压后如下图&#xff1a; 2 使用…

【php快速上手(八)】

目录 PHP快速上手&#xff08;八&#xff09;PHP 数组1. 数组的定义2. 数组的操作3. 多维数组4. 数组遍历 PHP数组排序1. 排序索引数组2. 排序关联数组3. 自然排序4. 自定义排序 PHP快速上手&#xff08;八&#xff09; PHP 数组 在 PHP 中&#xff0c;数组是一种数据结构&am…

Redis延迟双删

什么是延迟双删&#xff1f; 做法&#xff1a;先删除redis&#xff0c;再更新数据库&#xff0c;延迟N秒后再删除一次redis。 延迟双删策略是分布式系统中数据库存储和缓存数据保持最终一致性的常用策略&#xff0c;但它不是强一致。其实不管哪种方案&#xff0c;都避免不了Red…

生存分析机器学习

生存分析&#xff1a;时间背后的数据价值&#xff01; &#x1f4a1; 生存分析是一种研究现象或物体随时间推移而发生的变化的方法&#xff0c;可广泛应用于金融、医疗、保险、交通等领域&#xff0c;比如预测疾病复发风险、评估投资产品收益、估算保险赔付概率等。通过挖掘数…

excel里如何的科学计数法的数字转换成数值?

比如下图&#xff0c;要想把它们转换成3250跟1780&#xff0c;有什么快捷的办法吗&#xff1f; 科学计数法在excel里的格式&#xff0c;与我们常规在数学上写的有差异。这个转换可以这样做&#xff1a; 1.转换后的效果&#xff1a; 2.问题分析 题目中所附截图&#xff0c;单元…