贪心算法教程(个人总结版)

背景

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优的选择,期望通过局部最优选择达到全局最优解决方案的算法。贪心算法的应用广泛,包括图算法、动态规划、贪心选择、装载问题等。它通常用于解决优化问题,例如最短路径、最小生成树、背包问题等。

贪心算法的基本思想

贪心算法的核心思想是,在每一步都选择当前最优解,以期最终达到全局最优。贪心算法通常包括以下几个要素:

  1. 贪心选择性质:可以通过局部最优选择构造出全局最优解。
  2. 最优子结构性质:一个问题的最优解包含其子问题的最优解。

贪心算法的应用

贪心算法在许多经典问题中有着广泛的应用,如:

  1. 活动选择问题:选择不重叠的最大活动集合。
  2. 背包问题:选择最大价值的物品装入背包。
  3. 哈夫曼编码:构造最优前缀码。
  4. 最小生成树问题:如Prim算法和Kruskal算法。
  5. 最短路径问题:如Dijkstra算法。

贪心算法的实现

1. 活动选择问题

问题描述

给定一组活动,每个活动有一个开始时间和结束时间。要求选择尽可能多的互不重叠的活动。

贪心策略

每次选择结束时间最早且不与已选活动重叠的活动。

算法实现
def activity_selection(activities):
    # 按照结束时间排序
    activities.sort(key=lambda x: x[1])
    
    # 选择活动
    selected_activities = []
    last_end_time = 0
    
    for activity in activities:
        if activity[0] >= last_end_time:
            selected_activities.append(activity)
            last_end_time = activity[1]
    
    return selected_activities

# 示例
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)]
selected_activities = activity_selection(activities)
print("选择的活动:", selected_activities)
详细解释
  1. 排序:首先按照活动的结束时间对活动进行排序。
  2. 选择活动:遍历排序后的活动列表,每次选择第一个不与已选择活动重叠的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃辣椒的年糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值