【贪心算法经典应用】活动选择详解 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,这是根据贪心算法从排序后的活动列表中选择的最大互不相交集。

结论

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


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

相关文章
|
12天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
150 55
|
21天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
28 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
21天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
120 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
4天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
43 20
|
2天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
34 5
|
24天前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
36 2
|
2天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
28 0
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
108 80
|
21天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。