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

简介: 【贪心算法经典应用】活动选择详解 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. 迭代选择
  • 从剩余的活动中选择一个与已选择集合中所有活动都不重叠的活动,具体为选择结束时间最早且开始时间不早于最后一个已选择活动的结束时间的活动。
  1. 输出:返回选择的活动集合。

示例代码

以下是用 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 = end
    return 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: 活动按结束时间排序

活动编号 开始时间 结束时间
1 1 4
2 3 5
3 0 6
4 5 7
5 8 9
6 5 9

步骤 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,这是根据贪心算法从排序后的活动列表中选择的最大互不相交集。

结论

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


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
3月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
3月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
144 5
|
4月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
219 26
|
4月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
304 0
|
4月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
274 3
|
4月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
4月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
417 4
|
4月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
588 4
|
4月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
4月前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。

推荐镜像

更多