贪婪算法入门指南

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

什么是贪婪算法?

贪婪算法(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:breakreturn 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.mzph.cn/news/700457.shtml

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

相关文章

新版Java面试专题视频教程——虚拟机篇①

新版Java面试专题视频教程——虚拟机篇① 1 JVM组成1.1 JVM由那些部分组成,运行流程是什么?1.2 什么是程序计数器?1.3 你能给我详细的介绍Java堆吗?1.3.1 1.7和1.8 堆的区别1.3.2 元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.4.1 堆和栈的区…

普中51单片机学习(AD转换)

AD转换 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位,或者说分辨率为满刻度的1/(2^12)。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V1/(2^12 )2.4mV。 量化误差 …

【Kafka】消息重复场景及解决

目录 生产者阶段重复根本原因过程记录顺序问题解决方案 生产者和broker阶段消息丢失原因解决 消费者阶段重复根本原因解决 生产者阶段重复 根本原因 生产发送的消息没有收到正确的broke响应,导致生产者重试。 生产者发出一条消息,broke落盘以后因为网…

linux drm mipi dsi lcd 点屏之设备树配置

linux drm mipi dsi lcd 点屏之设备树配置 设备树文档: https://elixir.bootlin.com/linux/v6.8-rc5/source/Documentation/devicetree/bindings/display/dsi-controller.yaml https://elixir.bootlin.com/linux/v6.8-rc5/source/Documentation/devicetree/binding…

网络安全笔记总结

IAE引擎 1.深度检测技术--DFI和DPI技术 DFI和DPI都是流量解析技术,对业务的应用、行为及具体信息进行识别,主要应用于流量分析及流量检测。 DPI:深度包检测技术 DPI是一种基于应用层的流量检测和控制技术,对流量进行拆包&#x…

我花了5天时间,开发了一个在线学习的小网站

大三寒假赋闲在家,闲来无事,用了5天时间做了一个在线学习的小网站,一鼓作气部署上线,制作的过程比较坎坷。内心经历过奔溃,也经历过狂喜。 按照惯例先放出网址,欢迎大家来访问学习:www.pbjlove…

LabVIEW串口通信的激光器模块智能控制

LabVIEW串口通信的激光器模块智能控制 介绍了通过于LabVIEW的VISA串口通信技术在激光器模块控制中的应用。通过研究VISA串口通信的方法和流程,实现了对激光器模块的有效控制,解决了数据发送格式的匹配问题,为激光器模块的智能控制提供了一种…

【Nginx】微信小程序后端开发、一个域名访问多个服务

【Nginx】微信小程序后端开发、一个域名访问多个服务 1. 微信小程序后端开发 对于后端程序员,其实你们的职责就是干老本行,即写接口和服务,让前端能够访问你的接口就行,必要时需要查看微信小程序开发文档去向微信服务器发请求。…

c#高级——插件开发

案例:WinForm计算器插件开发 1.建立插件库,设置各种自己所需的插件组件 如下图所示:进行了计算器的加减法插件计算组件 Calculator_DLL为总插件父类 Calculator_DLL_ADD 为插件子类的控件对象 Calculator_DLL_Sub Calculator_DLL_Factory 为…

即时设计和Axure对比,哪一个好用?

无论是国外页面设计工具,页面设计工具的发展从来没有停滞过, Axure,无论是国产设计工具即时设计,其功能都在不断更新迭代,为设计带来更高效的设计体验。今天对比两个设计工具,帮你找到最适合自己的&#xf…

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增 数据源平台:用友NC65 用友NC是为集团与行业企业提供的全线管理软件产品,由亚太本土最大的企业管理软件提供商用友公司研发提供,用友NC率先采用J2EE架构和先进开放的集团级开发平台UAP&#xff0…

计算机网络-无线通信网

1.各种移动通信标准 1G:第一代模拟蜂窝:频分双工FDD。2G:第二代数字蜂窝 I.GDM(全球移动通信)采用TDMA。II.CDMA(码分多址通信)。2.5G:第2.5代通用分组无线业务GPRS。2.75G&#xf…

C语言-指针详解速成

1.指针是什么 C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存,以及进行复杂的数据操作。在C语言中&#…

Redis篇之Redis持久化的实现

持久化即把数据保存到可以永久保存的存储设备当中(磁盘)。因为Redis是基于内存存储数据的,一旦redis实例当即数据将会全部丢失,所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复,这一过程就称…

链表和顺序表的优劣分析及其时间、空间复杂度分析

链表和顺序表的优劣分析及其时间、空间复杂度分析 一、链表和顺序表的优劣分析二、算法复杂度<font face "楷体" size 5 color blue>//上面算法的执行次数大致为&#xff1a;F&#xff08;N&#xff09; N^22*N10;   N 10,F(10) 1002010 130次   N 1…

【Java】多线程编程(实验十)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1、 了解线程的调度和执行过程&#xff0c;掌握Java 语言中多线程编程的基本方法 2、 掌握Runnable 接口实现多线程的方法 3、 掌握Thread 类实 现多线程的用法 二、实验内容 采用多线程机制模拟汇款业务。定…

C++中的STL数据结构

内容来自&#xff1a;代码随想录&#xff1a;哈希表理论基础 1.常见的三种哈希结构 当我们想使用哈希法来解决问题的时候&#xff0c;我们一般会选择如下三种数据结构 数组 set &#xff08;集合&#xff09; map(映射) 在C中&#xff0c;set 和 map 分别提供以下三种数据结构…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…