Python算法L5:贪心算法

Python贪心算法简介

目录

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优或最优解的算法。它的核心思想是, 在保证每一步局部最优的情况下,希望通过贪心选择达到全局最优解 。虽然贪心算法并不总能得到全局最优解,但在很多实际问题中,它能够高效地找到一个近似解。

贪心算法的基本步骤

  1. 问题分解:将一个问题分解成多个子问题,每一步都通过贪心策略选择最优解。
  2. 贪心选择:在当前的选择中,做出最优的选择,确保每一步都能得到局部最优解。
  3. 结果验证:通过多步贪心选择后,得到全局解,最后验证是否符合题目的要求。

贪心算法的适用场景

贪心算法并不适用于所有问题,只有当问题满足贪心选择性质和最优子结构性质时,它才有可能获得全局最优解。具体来说:

  • 贪心选择性质:局部最优选择不会影响全局最优解。
  • 最优子结构性质:问题的全局最优解可以通过若干个局部最优解组合得到。

经典贪心算法问题

1. 零钱兑换问题

假设你有不同面值的硬币,如何用最少数量的硬币凑齐给定的金额?

问题描述 :给定一个硬币面值数组 coins 和一个目标金额 amount,每次你可以从硬币数组中选择一个硬币,如何选择最少的硬币数量来凑齐这个金额?

Python代码实现:

python 复制代码
def coin_change(coins, amount):
    # 按照面值从大到小排序
    coins.sort(reverse=True)
    
    count = 0  # 硬币数量
    for coin in coins:
        if amount == 0:
            break
        # 当前硬币可以使用的最大数量
        count += amount // coin
        amount %= coin
    
    return count if amount == 0 else -1

# 示例
coins = [1, 5, 10, 25]
amount = 37
result = coin_change(coins, amount)
print(f"最少硬币数量: {result}")

运行结果:

复制代码
最少硬币数量: 4  (25+10+1+1)
2. 区间调度问题

给定若干个区间,要求选择最多数量的不重叠区间。

问题描述:给定一个区间数组,每个区间表示任务的开始和结束时间,找到可以完成的最多不重叠任务的数量。

Python代码实现:

python 复制代码
def interval_scheduling(intervals):
    # 按照区间的结束时间升序排序
    intervals.sort(key=lambda x: x[1])
    
    count = 0  # 可安排的任务数量
    last_end = float('-inf')  # 上一个任务的结束时间
    
    for interval in intervals:
        if interval[0] >= last_end:
            count += 1
            last_end = interval[1]  # 更新为当前任务的结束时间
    
    return count

# 示例
intervals = [(1, 3), (2, 4), (3, 5), (7, 8)]
result = interval_scheduling(intervals)
print(f"最多不重叠区间数量: {result}")

运行结果:

复制代码
最多不重叠区间数量: 3
3. 背包问题

这是一个经典的优化问题,要求在背包容量一定的情况下,选择尽量多的物品,使得背包中的物品价值最大。

问题描述:给定物品的重量和价值,背包的最大承载重量,如何选择物品使得总价值最大?

Python代码实现:

python 复制代码
def knapsack(items, max_weight):
    # 按照单位价值(价值/重量)降序排序
    items.sort(key=lambda x: x[1] / x[0], reverse=True)
    
    total_value = 0  # 背包中的总价值
    for weight, value in items:
        if max_weight >= weight:
            total_value += value
            max_weight -= weight
        else:
            total_value += (value / weight) * max_weight  # 部分选取
            break
    
    return total_value

# 示例
items = [(10, 60), (20, 100), (30, 120)]  # 每个元组表示(重量, 价值)
max_weight = 50
result = knapsack(items, max_weight)
print(f"背包中的最大价值: {result}")

运行结果:

复制代码
背包中的最大价值: 240.0

贪心算法的优缺点

优点:
  1. 高效:贪心算法每次选择都是局部最优的,因此时间复杂度往往较低。
  2. 简单易理解:相比动态规划等复杂算法,贪心算法更容易实现和理解。
缺点:
  1. 不保证最优解:贪心算法有时会导致错过全局最优解。
  2. 问题局限性:贪心算法适用于满足贪心选择性质和最优子结构的少部分问题,不是所有问题都能应用。

结语

贪心算法在处理许多优化问题时非常有效,特别是当问题具有贪心选择性质时,它可以快速得到近似最优解。通过对问题的分析,我们可以判断是否适合使用贪心算法,并设计出高效的解决方案。

希望这篇博客能够帮助你理解贪心算法的基本原理及其应用。如果你有任何疑问或希望进一步探讨,欢迎在评论区留言!关注我,更多精彩内容敬请期待《Python算法》系列博客的下一课--Python图算法!

相关推荐
happylifetree2 小时前
Python70:核心语法-函数进阶-案例2
python
王中阳Go3 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳3 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
Sakura_j_h_4 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
supabc1235 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi5 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
企业数字化笔记6 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
ZhengEnCi6 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
?abc!6 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
镜子AI7 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft