一、贪心算法基础解析

1.1 贪心算法的核心思想

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。简单来说,就是"只顾眼前,不看长远"的策略。

想象你是一个贪婪的人,每次都选择当前看起来最有利的选项,不考虑这个选择对未来可能产生的影响。贪心算法就是这样工作的:

  • 「局部最优选择」:在每一步选择中,贪心算法都会选择当前看来最优的选项

  • 「无后悔性」:选择一旦做出,就不会再回头修改

  • 「简单高效」:通常具有较低的时间复杂度,实现相对简单

❝ 「思考问题」:为什么贪心算法不总是能得到全局最优解?你能想出一个贪心策略失效的例子吗?❞

1.1.1 贪心选择性质

「贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择(即贪心选择)来达到。」这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。通常使用数学归纳法来证明贪心选择性质。

1.1.2 最优子结构性质

「当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。」问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

❝贪心选择性质保证了每一步的局部最优选择不会影响最终整体最优解的正确性,而最优子结构性质保证了问题可以分解成子问题递归求解❞

1.2 贪心算法的适用条件

并非所有问题都适合使用贪心算法。要判断一个问题是否适合贪心算法,需要考虑以下几点:

  1. 「问题是否具有贪心选择性质」:局部最优选择能否导致全局最优解

  2. 「问题是否具有最优子结构性质」:问题的最优解是否包含子问题的最优解

  3. 「是否可以通过数学归纳法或反证法证明贪心策略的正确性」

1.3 贪心算法的优缺点

「优点」

  • 简单直观,易于理解和实现

  • 时间复杂度通常较低,效率高

  • 不需要考虑所有可能的解,只关注当前最优选择

「缺点」

  • 不一定能得到全局最优解

  • 适用范围有限,只适用于具有贪心选择性质和最优子结构性质的问题

  • 贪心策略的正确性通常需要严格的数学证明

图片

二、经典贪心算法问题详解

2.1 无重叠区间(LeetCode 435: Non-overlapping Intervals)

  • 「问题描述」:给定一个区间集合 intervals,其中 intervals[i] = [start_i, end_i]。返回需要移除的最小区间数量,使剩余区间互不重叠。示例如下:

- 输入: `[[1,2], [2,3], [3,4], [1,3]]` → 输出: `1`
  - 解释: 移除 `[1,3]` 后,剩余区间不重叠

- 输入: `[[1,2], [1,2], [1,2]]` → 输出: `2`
  - 解释: 需移除两个 `[1,2]` 区间
  • 「贪心策略」:本题可以转化为:「保留最多数量的不重叠区间」。核心贪心策略是:

    这种方法确保我们能在有限的时间轴上安排最多的区间。

    1. 按区间的「结束时间」升序排序

    2. 优先选择结束时间早的区间

    3. 移除所有与已选区间重叠的区间

  • 「为什么这个策略是正确的?」
    选择结束时间最早的区间,能为后续区间留出更多空间。

    假设存在另一种选择方案比我们的贪心策略更优,那么第一个选择的区间结束时间一定不晚于贪心策略选择的区间。

  • 「代码实现」

class Solution:
    def eraseOverlapIntervals(self, intervals: list[list[int]]) -> int:
        ifnot intervals:
            return0
            
        # 按结束时间排序
        intervals.sort(key=lambda x: x[1])
        
        count = 1# 保留的区间数量
        end = intervals[0][1]  # 当前保留区间的结束时间
        
        # 遍历所有区间
        for i in range(1, len(intervals)):
            # 如果当前区间的开始时间 >= 上一个保留区间的结束时间
            if intervals[i][0] >= end:
                # 不重叠,可以保留
                count += 1
                end = intervals[i][1]
        
        # 需要移除的区间数 = 总区间数 - 保留的区间数
        return len(intervals) - count
  • 「算法执行过程」:[[1,5], [2,4], [3,6], [4,5]]

    1. 初始区间

    图片

   2. 按结束时间排序

图片

    3. 贪心算法结果

图片

2.2 分数背包问题

  • 「问题描述」:有n个物品和一个容量为W的背包。每个物品都有一个价值vi和重量wi。与0-1背包不同,这里可以选择物品的一部分放入背包。目标是使背包中物品的总价值最大。

  • 「贪心策略」:计算每个物品的单位价值(价值/重量),按照单位价值从高到低的顺序选择物品。

❝ 「关键点」:分数背包问题之所以可以用贪心算法解决,是因为我们可以选择物品的一部分,而不必整个选择。这使得每次选择单位价值最高的物品成为最优策略。❞
  • 「示例」:假设有以下物品:

    物品

    重量

    价值

    单位价值

    物品1

    10kg

    60元

    6元/kg

    物品2

    20kg

    100元

    5元/kg

    物品3

    30kg

    120元

    4元/kg

    背包容量为50kg,如何选择才能使总价值最大?

  • 「贪心解决过程」

    • 选择物品1(10kg),剩余容量40kg

    • 选择物品2(20kg),剩余容量20kg

    • 选择物品3的一部分(20kg,总共30kg的2/3),背包已满

    1. 计算每个物品的单位价值(价值/重量)

    2. 按单位价值从高到低排序:物品1 > 物品2 > 物品3

    3. 依次选择:

    4. 总价值 = 60 + 100 + 120*(2/3) = 240元

  • 「代码实现」

def fractional_knapsack(values, weights, capacity):
    # 计算每个物品的单位价值
    items = [(values[i] / weights[i], values[i], weights[i]) for i in range(len(values))]
    # 按单位价值从高到低排序
    items.sort(reverse=True)
    
    total_value = 0
    for unit_value, value, weight in items:
        if capacity >= weight:
            # 如果能够完全装入,则装入整个物品
            capacity -= weight
            total_value += value
        else:
            # 否则,装入部分物品
            total_value += unit_value * capacity
            capacity = 0
            break
    
    return total_value

2.3 跳跃游戏(LeetCode 55: Jump Game)

  • 「问题描述」:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例如下:

    输入: [2,3,1,1,4]  输出: true 
  • 「贪心策略」:维护一个变量表示当前能够到达的最远位置,遍历数组更新这个变量。

  • 「解题思路」

      • 初始化最远可达位置 max_reach = 0

      • 遍历数组中的每个位置:

        • 如果当前位置i已经超过了max_reach,说明无法到达该位置,返回false

        • 更新max_reach = max(max_reach, i + nums[i])

        • 如果max_reach已经可以到达最后一个位置,提前返回true

    • 「代码实现」

    class Solution:
        def canJump(self, nums: List[int]) -> bool:
            max_reach = 0
            for i in range(len(nums)):
                if i > max_reach:  # 如果当前位置已经超出了能够到达的最远位置,则无法到达最后一个位置
                    return False
                max_reach = max(max_reach, i + nums[i])  # 更新能够到达的最远位置
                if max_reach >= len(nums) - 1:  # 如果能够到达的最远位置已经超过了最后一个位置,则可以到达最后一个位置
                    return True
            return True  # 如果能够遍历完整个数组,则可以到达最后一个位置
    

    🔍 「思考问题」:如果要求出到达最后一个位置的最少跳跃次数,应该如何修改上述算法?(提示:这是LeetCode 45. Jump Game II)

    三、贪心算法的进阶技巧

    3.1 贪心+其他算法的组合应用

    贪心算法可以与其他算法结合使用,解决更复杂的问题:

    1. 「贪心+动态规划」:先用贪心算法解决一部分问题,然后用动态规划解决剩余的子问题

      例如:在某些区间DP问题中,可以先用贪心算法确定初始区间,再用DP求解最优解

    2. 「贪心+回溯」:用贪心策略进行剪枝,减少回溯的搜索空间

      例如:在旅行商问题的求解中,可以用贪心策略选择下一个城市,减少搜索空间

    3. 「贪心+二分查找」:用二分查找确定贪心策略的参数

      例如:在求解最小化最大值类型的问题时,可以用二分查找确定参数,再用贪心验证可行性

    3.2 反向思考的贪心策略

    有时候,从结果反推比从起点开始更容易找到贪心策略。例如:

    1. 「区间覆盖问题」:从右向左贪心,每次选择能覆盖最左边未覆盖点的最右区间

    2. 「任务调度问题」:从截止时间最晚的任务开始安排

    3. 「最大正方形问题」:从右下角开始考虑,而不是从左上角

    💡 「技巧」: 当正向思考遇到困难时,尝试反向思考,可能会有意想不到的收获!

    3.3 多角度贪心

    同一个问题可能有多种贪心策略,需要从多个角度思考:

    1. 「排序标准」:按照不同的标准排序可能得到不同的贪心策略

      例如:区间调度问题可以按开始时间、结束时间或区间长度排序

    2. 「选择标准」:选择最大、最小、最优比率等不同标准可能得到不同的贪心策略

      例如:在背包问题中,可以按价值、重量或价值/重量比选择物品

    3. 「处理顺序」:正向处理、反向处理、双向处理等不同顺序可能得到不同的贪心策略

      例如:在分发糖果问题中,需要从左到右和从右到左两次遍历

      图片

    四、总结

    4.1 贪心算法的核心思想回顾

    贪心算法的核心在于通过每一步的局部最优选择,期望达到全局最优解。它的关键在于正确设计贪心策略并验证其正确性。贪心算法在效率上有明显优势,在实际问题中有广泛应用。

    4.2 最佳实践建议

    1. 「分析问题特性」:面对问题时,首先分析是否满足贪心算法的两个关键性质(贪心选择性质和最优子结构性质)

    2. 「多角度思考」:多角度思考可能的贪心策略,并通过反例验证

    3. 「灵活运用」:结合具体场景灵活运用贪心思想,不拘泥于固定模式

    4. 「系统练习」:系统练习经典贪心问题,建立解题直觉

    5. 「证明正确性」:对于复杂问题,尝试证明贪心策略的正确性,可以使用数学归纳法或反证法

    4.3 习题集

    LeetCode平台上的贪心算法题集,包含从易到难的题目分类,适合系统练习和面试准备。

    • 「推荐题目」

      • 简单:455(Assign Cookies)、860(Lemonade Change)

      • 中等:55(Jump Game)、134(Gas Station)、621(Task Scheduler)

      • 困难:135(Candy)、1326(Minimum Number of Taps to Open to Water a Garden)

    • 「链接」:https://leetcode.com/tag/greedy/

    五、大模型风口已至:月薪30K+的AI岗正在批量诞生

    在这里插入图片描述

    2025年大模型应用呈现爆发式增长,根据工信部最新数据:

    国内大模型相关岗位缺口达47万

    初级工程师平均薪资28K(数据来源:BOSS直聘报告)

    70%企业存在"能用模型不会调优"的痛点

    真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!

    这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

    六、如何学习大模型 AI ?

    🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀

    由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

    但是具体到个人,只能说是:

    “最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

    这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

    我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

    我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
    2️⃣ RAG系统:让大模型精准输出行业知识
    3️⃣ 智能体开发:用AutoGPT打造24小时数字员工

    📦熬了三个大夜整理的《AI进化工具包》送你:
    ✔️ 大厂内部LLM落地手册(含58个真实案例)
    ✔️ 提示词设计模板库(覆盖12大应用场景)
    ✔️ 私藏学习路径图(0基础到项目实战仅需90天)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    第一阶段(10天):初阶应用

    该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

    • 大模型 AI 能干什么?
    • 大模型是怎样获得「智能」的?
    • 用好 AI 的核心心法
    • 大模型应用业务架构
    • 大模型应用技术架构
    • 代码示例:向 GPT-3.5 灌入新知识
    • 提示工程的意义和核心思想
    • Prompt 典型构成
    • 指令调优方法论
    • 思维链和思维树
    • Prompt 攻击和防范

    第二阶段(30天):高阶应用

    该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

    • 为什么要做 RAG
    • 搭建一个简单的 ChatPDF
    • 检索的基础概念
    • 什么是向量表示(Embeddings)
    • 向量数据库与向量检索
    • 基于向量检索的 RAG
    • 搭建 RAG 系统的扩展知识
    • 混合检索与 RAG-Fusion 简介
    • 向量模型本地部署

    第三阶段(30天):模型训练

    恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

    到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

    • 为什么要做 RAG
    • 什么是模型
    • 什么是模型训练
    • 求解器 & 损失函数简介
    • 小实验2:手写一个简单的神经网络并训练它
    • 什么是训练/预训练/微调/轻量化微调
    • Transformer结构简介
    • 轻量化微调
    • 实验数据集的构建

    第四阶段(20天):商业闭环

    对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

    • 硬件选型
    • 带你了解全球大模型
    • 使用国产大模型服务
    • 搭建 OpenAI 代理
    • 热身:基于阿里云 PAI 部署 Stable Diffusion
    • 在本地计算机运行大模型
    • 大模型的私有化部署
    • 基于 vLLM 部署大模型
    • 案例:如何优雅地在阿里云私有部署开源大模型
    • 部署一套开源 LLM 项目
    • 内容安全
    • 互联网信息服务算法备案

    学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

    如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

    这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

    在这里插入图片描述

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐