简说贪心算法

贪心算法(Greedy Algorithm)是一类在每一步选择中都做出当前最优解,以期望通过一系列局部最优选择达到全局最优解的算法。贪心算法的核心思想是通过一次次的局部优化来构建全局解。尽管这种方法不总是能找到全局最优解,但在许多情况下,贪心算法能提供一个有效且接近最优的解。

贪心算法的基本特征

1. **贪心选择性质**:每一步都做出一个看似最优的选择,即局部最优选择。这种选择不考虑未来的结果,只是当前的最佳选项。

2. **最优子结构性质**:问题的全局最优解包含了其子问题的最优解。换句话说,贪心算法的选择步骤可以用于解决子问题,并且这些子问题的解可以组合成全局最优解。

贪心算法的应用场景

贪心算法在解决某些特定类型的问题时非常有效,常见的应用场景包括但不限于:

1. **最短路径问题**:如Dijkstra算法用于单源最短路径。
2. **最小生成树问题**:如Kruskal和Prim算法。
3. **活动选择问题**:如安排最大数量的不重叠活动。
4. **背包问题**:如分数背包问题(Fractional Knapsack Problem)。
5. **霍夫曼编码**:用于数据压缩的霍夫曼树构建。

贪心算法的设计步骤

1. **选择贪心策略**:确定每一步的贪心选择标准。
2. **证明贪心选择的正确性**:确保每一步选择不会影响最终的全局最优解。
3. **证明最优子结构**:确保每个子问题的最优解可以组合成全局问题的最优解。
4. **构建算法**:将贪心选择策略应用于具体问题,构建完整的算法步骤。

 贪心算法的优缺点

 优点

- **简单高效**:贪心算法通常比动态规划和回溯算法更为简单,并且能够更快速地找到解。
- **实时性强**:在某些情况下,贪心算法能迅速给出一个可行解,这在需要实时决策的问题中尤为重要。

缺点

- **不保证最优解**:贪心算法不总是能找到全局最优解,尤其是当局部最优解无法组合成全局最优解时。
- **需要问题特性支持**:贪心算法只有在满足贪心选择性质和最优子结构性质的问题上才能有效应用。

经典案例分析

 1. 分数背包问题
在分数背包问题中,我们有一个容量为W的背包和n种物品,每种物品都有一个重量和价值。目标是选择物品装入背包,使得总价值最大化,并且可以分割物品。

**贪心策略**:选择单位重量价值最高的物品,尽可能装入背包。

```python
class Item:
    def __init__(self, value, weight):
        self.value = value
        self.weight = weight

def fractional_knapsack(items, capacity):
    # 按照单位重量价值排序
    items.sort(key=lambda x: x.value / x.weight, reverse=True)
    
    total_value = 0.0
    for item in items:
        if capacity >= item.weight:
            total_value += item.value
            capacity -= item.weight
        else:
            total_value += item.value * (capacity / item.weight)
            break
    
    return total_value

items = [Item(60, 10), Item(100, 20), Item(120, 30)]
capacity = 50
print(f'最大价值: {fractional_knapsack(items, capacity)}')
```

#### 2. 活动选择问题
在活动选择问题中,我们有一组活动,每个活动都有一个开始时间和结束时间。目标是选择最大的非重叠活动集。

**贪心策略**:每次选择结束时间最早且不与已选择活动重叠的活动。

```python
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)]
print(f'选择的活动: {activity_selection(activities)}')
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springMVC的bug

写SpringMVC时,配置视图解析器路径中少写了个“/”导致url拼接错误,无法返回视图

支持向量机 (SVM) 算法详解

支持向量机 (SVM) 算法详解 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 特别适合高维数据,并且在处理复杂非线性数据时表现出色。本文将详细讲解 SVM 的原理、数学公式、应用场景…

三目运算符中间的表达式可以省略吗(a?:c)?

熟悉C语言的童靴对三目运算符都非常熟悉,a? b : c; 如果a为true,则整个运算符的值为b,否则为c;那么问题来了,三目运算符中间的表达式可以省略吗?即a? : c; 1、linux内核中出现的省略情况 本人在阅读内核代码是发现了下面的代码: preferr…

centos7 低版本docker 升级为高版本

删除 docker yum -y remove docker*安装 yum 管理工具 yum install -y yum-utils添加国内镜像 manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo查看可用软件版本yum list docker-ce --showduplicates|sort -r安装 yum -y install docke…

机器学习实验--- 金融数据基础与计算在线实验闯关

第1关:申万家用电器行业股票代码获取 任务描述 本关任务:根据右边测试平台的提示,补充代码。 # -*- coding: utf-8 -*- #1.读取“申万行业分类.xlsx”表,字段如下所示: # 行业名称 股票代码 股票名称 # 获得“…

项目中选择Entity Framework Core还是Dapper?

我是将 Dapper 还是 Entity framework core 用于下一个 .NET 项目?当你必须做出这个决定时,总是令人困惑,为了项目的成功,你需要做出正确的决定。让我来帮你... 介绍 使用 .NET 开发的应用程序可以根据其使用的对象关系映射器 &…

「前端+鸿蒙」鸿蒙应用开发-在线教育测验案例

在鸿蒙应用开发中,状态管理是确保应用能够响应用户交互并保持数据一致性的关键。以下是一个状态管理的真实案例,包括功能简介、布局和样式、状态定义、业务逻辑、UI交互等。 案例 - 在线教育测验应用 功能简介 用户可以进行选择题测验。应用提供自动评分和统计信息。用户可以…

Java | Leetcode Java题解之第168题Excel表列名称

题目: 题解: class Solution {public String convertToTitle(int columnNumber) {StringBuffer sb new StringBuffer();while (columnNumber ! 0) {columnNumber--;sb.append((char)(columnNumber % 26 A));columnNumber / 26;}return sb.reverse().t…

【APP移动端性能测试】第一节.APP应用架构、环境和敏捷开发模型介绍

文章目录 前言一、APP应用架构二、APP项目环境 2.1 后端项目环境 2.2 前端项目环境三、Scrum敏捷开发模型 3.1 Scrum敏捷模型基础介绍 3.2 Scrum敏捷开发开发流程总结 前言 一、APP应用架构 (1)APP应用架构 (2&#xff0…

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程, top可以看全局那个进程耗cpu,而jps则默认是java最耗cpu的,比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号,查询进程里那个线程最占用cpu,发…

js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据

要使用正则表达式匹配尖括号()之间的数据,可以使用以下代码示例: 在JavaScript中,你可以使用正则表达式来匹配括号()之间的数据。以下是一个简单的例子,它展示了如何使用正则表达式来获取两对括号之间的文本。 // 示例字符串 con…

LENOVO联想 小新 16 IAH8 2023款(83BG)笔记本原厂Windows11系统,恢复出厂开箱状态预装OEM系统镜像安装包下载

适用型号:小新 16 IAH8【83BG】 链接:https://pan.baidu.com/s/18VbGbBXtQEW5P8wLIyJtAQ?pwddv1s 提取码:dv1s 联想原装Win11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家…

董宇辉的人生关键词:年轻人的成长指南

在当今这个信息爆炸、竞争激烈的社会中,年轻人面临着前所未有的挑战与机遇。如何从纷繁复杂的世界中找到属于自己的道路?近日,知名人生导师董宇辉为年轻人提出了几个人生关键词,这些词汇不仅凝聚了他多年的人生感悟,更…

服务器负载均衡

什么是服务器负载 1. 常见理解的平均负载 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况。比如下列情况 [rootkube-node1 ~]# uptime09:44:37 up 74 days, 11:53, 1 user, load average:…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵, 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

架构设计 - Nginx Lua 缓存配置

摘要: web 应用业务缓存通常3级: 一级缓存:JVM 本地缓存 二级缓存:Redis集中式缓存 三级缓存:Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存:静态资源CDN缓存 本文主要分享 Nginx Lua 缓存配置开发 鉴于 Nginx Proxy Cache 缓存的劣势,在生产项目中很少使用…

如何做好技术管理与技术规划?

一、背景 做好技术管理不仅要求紧跟行业前沿动态,同时也需把握好产品开发的阶段性分期,确保技术成果转化和产品落地的顺畅进行。技术管理的成功与否,在很大程度上取决于能否精准捕捉市场需求,据此调整任务优先级。面对瞬息万变的…

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据,是指具有Schema信息的数据,例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同,Spark SQL提供了对结构化数据的查询和计算接口。 Spark …

IDEA上MySQL的jar包导入教程

jar包下载网址——》https://mvnrepository.com/ 1.进入界面,点击搜索框,搜索mysql: 外国网站,可能有点慢,耐心等待即可。 2.点击查询结果: 进入界面,点击前两个结果的其中一个,两个都可以 …

计算机毕业设计Python+Vue.js+Flask+Scrapy电影大数据分析 电影推荐系统 电影爬虫可视化 电影数据分析 大数据毕业设计 协同过滤算法

开发技术 协同过滤算法、机器学习、vue.js、echarts、Flask、Python、MySQL 创新点 协同过滤推荐算法、爬虫、数据可视化 补充说明 两种Python协同过滤推荐算法集成 (ItemCF推荐算法 和 UserCF 推荐算法) 2.专业美工整体设计的细腻的酷黑主题,前后端分离一体化系统&…