贪婪算法入门指南

news2024/11/16 6:04:09

想象一下,你在玩一款捡金币的游戏。在这个游戏里,地图中散布着各种大小不一的金币,而你的目标就是尽可能快地收集到最多的金币。你可能会采取一个直观的策略:每次都去捡最近的、看起来最大的金币。这种在每一步都采取局部最优解的策略,正是所谓的“贪婪算法”。

什么是贪婪算法?

贪婪算法(Greedy Algorithm)是一种在计算机科学和数学中使用的算法设计策略,其核心思想是通过一系列局部最优选择来寻求全局最优的解决方案。
but,这听起来很完美,但实际上,贪婪算法并不总是能够得到全局最优解,尤其是在那些需要考虑多阶段结果的复杂问题中。

贪婪算法的工作原理

贪心算法的工作模式很简单:

  1. 确定问题的最优结构。
  2. 从问题的某个初始解出发。
  3. while(可以向给定问题的解决方案中添加更多的元素时)
    3.1. 将下一个元素添加到解决方案中。
  4. 返回已经找到的解决方案。

它不断地寻求解决方案的局部最优解,而不回头考虑先前的选择。这经常导致解决方案是最优的或者至少是近似最优的。

实例:找零钱问题

想象你是一位收银员,一个客户购买了一件商品,你需要给他找零。假设你的注册机中有足够的零钱,而且你希望使用尽可能少的纸币来找零。在这里,你可以采用贪婪算法。

例如,如果你需要找零30元,而你有25元、10元、5元和1元的纸币,你会怎么做?

  1. 首先,你会取一张25元的元。
  2. 然后,你需要再找5元,于是你取一张5元的纸币。

完成!你只用了两张纸币就找回了30元。

Python实现贪婪算法

– 找零钱问题

假设在我们有四种纸币:[25, 10, 5, 1],现在我们用Python来实现找零钱的贪心算法。

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 24 17:50:12 2024

@author: 李立宗

公众号:计算机视觉之光

知识星球:计算机视觉之光

"""

def greedy_coin_change(coins, amount):
    sorted_coins = sorted(coins, reverse=True)  # 从大到小排序硬币
    result = []
    for coin in sorted_coins:
        count = amount // coin  # 计算当前硬币可以使用多少个
        amount -= coin * count  # 更新剩余的金额
        result.extend([coin] * count)  # 将当前硬币添加到结果中相应次数
        if amount == 0:
            break
    return result

# 测试找零零钱算法
coins = [25, 10, 5, 1]
amount = 30
print(greedy_coin_change(coins, amount))

输出

运行上述代码,你将得到输出:[25, 5],显示了贪婪算法如何使用最少的纸币数量完成找零。
输出结果如下图所示:
(运行了多次,运行一次是一个细条图像,看不清楚)

在这里插入图片描述

贪婪算法的局限

虽然贪婪算法可以很好地解决某些类型的问题,比如我们刚才演示的找零问题(在大多数货币系统中),但在其他的情境下,贪婪算法可能就不是最佳选择了。贪心算法没有考虑全局最优解,因此当问题需要全局最优解的时候,我们可能需要考虑其他算法。

总的来说,贪婪算法是理解算法设计中局部最优解如何影响全局解的一个极好的起点,并且在实践中,它们经常是得到一个“足够好”解决方案的快速而有效的方法。

相关博文

理解并实现OpenCV中的图像平滑技术

OpenCV中的边缘检测技术及实现

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

我的图书

下面两本书欢迎大家参考学习。

OpenCV轻松入门

李立宗,OpenCV轻松入门,电子工业出版社,2023
本书基于面向 Python 的 OpenCV(OpenCV for Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。

在介绍 OpenCV 函数的使用方法时,提供了大量的程序示例,并以循序渐进的方式展开。首先,直观地展示函数在易于观察的小数组上的使用方法、处理过程、运行结果,方便读者更深入地理解函数的原理、使用方法、运行机制、处理结果。在此基础上,进一步介绍如何更好地使用函数处理图像。在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的实例来说明问题,避免使用过多复杂抽象的公式。

本书适合计算机视觉领域的初学者阅读,包括在校学生、教师、专业技术人员、图像处理爱好者。
本书第1版出版后,深受广大读者朋友的喜爱,被很多高校选为教材,目前已经累计重印9次。为了更好地方便大家学习,对本书进行了修订。
在这里插入图片描述

计算机视觉40例

李立宗,计算机视觉40例,电子工业出版社,2022
近年来,我深耕计算机视觉领域的课程研发工作,在该领域尤其是OpenCV-Python方面积累了一点儿经验。因此,我经常会收到该领域相关知识点的咨询,内容涵盖图像处理的基础知识、OpenCV工具的使用、深度学习的具体应用等多个方面。为了更好地把所积累的知识以图文的形式分享给大家,我将该领域内的知识点进行了系统的整理,编写了本书。希望本书的内容能够对大家在计算机视觉方向的学习有所帮助。
本书以OpenCV-Python(the Python API for OpenCV)为工具,以案例为载体,系统介绍了计算机视觉从入门到深度学习的相关知识点。
本书从计算机视觉基础、经典案例、机器学习、深度学习、人脸识别应用等五个方面对计算机视觉的相关知识点做了全面、系统、深入的介绍。书中共介绍了40余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

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

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

相关文章

ONLYOFFICE 桌面编辑器现已更新至v8.0啦

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

ETL:数据转换与集成的关键过程

ETL:数据转换与集成的关键过程 在现代数据驱动的世界中,有效地管理和处理数据对于企业的成功至关重要。ETL(提取、转换、加载)是一种关键的数据处理过程,有助于将数据从源系统提取、清洗、转换并加载到目标系统中&…

【LeetCode-337】打家劫舍III(动态规划)

目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目: 考察内容: for if max 代码: """ 题目分析:投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入: 产品数int; 总投资额int; 总风险int 产品投资…

[word] 怎么把word表格里的字放在正中间? #职场发展#知识分享#知识分享

怎么把word表格里的字放在正中间? word表格中文字在中间的处理方式如下: 1、在表格中选择需要居中的文字的单元格,具体如下图。 2、全选后,鼠标在工具栏中找到:对齐方式,点击它后面的倒三角,如…

Vue学习之计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [Vue 2 - Advan…

P1927 防护伞

题目传送门:P1927 防护伞 作业出了这道题,写一篇题解纪念一下。 这道题可以简化为“先枚举所有点,然后把这些点到另外点距离的最大距离和其他点比较,求出最小距离”。 这样说可能也听不懂,还可以再简化: …

【SpringBoot3】Spring Security 常用配置总结

注:本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例(简单使用、JWT模式) 【SpringBoot3】…

Docusaurus框架——快速搭建markdown文档站点介绍sora

文章目录 ⭐前言⭐初始化项目💖 创建项目(react-js)💖 运行项目💖 目录文件💖 创建一个jsx页面💖 创建一个md文档💖 创建一个介绍sora的文档 ⭐总结⭐结束 ⭐前言 大家好&#xff0…

智能风控体系之PagePank算法应用

PageRank算法,即网页排名算法,由Google创始人Larry Page在斯坦福上学的时候提出来的。该算法用于对网页进行排名,排名高的网页表示该网页被访问的概率高。PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重…

Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解 文章目录 Linux笔记之LD_LIBRARY_PATH详解1.常见使用命令来设置动态链接库路径2.LD_LIBRARY_PATH详解设置 LD_LIBRARY_PATH举例注意事项 3.替代方案使用标准路径编译时指定链接路径优先使用 rpath 还是 runpath?注意事项 1.常见使用…

高级RAG:重新排名,从原理到实现的两种主流方法

原文地址:https://pub.towardsai.net/advanced-rag-04-re-ranking-85f6ae8170b1 2024 年 2 月 14 日 重新排序在检索增强生成(RAG)过程中起着至关重要的作用。在简单的 RAG 方法中,可以检索大量上下文,但并非所有上下…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

NPM私服搭建(verdaccio)

官网地址:https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依…

Linux:Jenkins:GitLab+Maven+Jenkins的部署

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存:6G 名字:Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存:2G 名字:Jenkins-server 192.168.6.2 3.用于打包测试…

设计模式——三大工厂模式

工厂模式 简单工厂模式(静态工厂模式) 介绍: 1、简单工厂模式是属于创建型模式,是工厂模式的一种,**简单工厂模式是由一个工厂对象决定创建出哪种产品的实例**。是工厂模式中最简单使用的模式 2、简单工厂模式&#…

ONLYOFFICE8.0——赋能办公

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

挑战30天学完Python:Day18 正则表达式

📘 Day 18 🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

24款奔驰C260L升级C63包围 渣男的外观

今天店里来了一台24款奔驰C260L 一提车就过来升级 我们公司还有包上牌服务 车主说 升级完包围 帮忙安排一下 原车的包围 没有那么霸气 特别是后杠 光溜溜的 升级后 四出尾喉 尾翼 直接牌面就起来了,星骏汇小许Xjh15863