想象一下,你在玩一款捡金币的游戏。在这个游戏里,地图中散布着各种大小不一的金币,而你的目标就是尽可能快地收集到最多的金币。你可能会采取一个直观的策略:每次都去捡最近的、看起来最大的金币。这种在每一步都采取局部最优解的策略,正是所谓的“贪婪算法”。
什么是贪婪算法?
贪婪算法(Greedy Algorithm)是一种在计算机科学和数学中使用的算法设计策略,其核心思想是通过一系列局部最优选择来寻求全局最优的解决方案。
but,这听起来很完美,但实际上,贪婪算法并不总是能够得到全局最优解,尤其是在那些需要考虑多阶段结果的复杂问题中。
贪婪算法的工作原理
贪心算法的工作模式很简单:
- 确定问题的最优结构。
- 从问题的某个初始解出发。
- while(可以向给定问题的解决方案中添加更多的元素时)
3.1. 将下一个元素添加到解决方案中。 - 返回已经找到的解决方案。
它不断地寻求解决方案的局部最优解,而不回头考虑先前的选择。这经常导致解决方案是最优的或者至少是近似最优的。
实例:找零钱问题
想象你是一位收银员,一个客户购买了一件商品,你需要给他找零。假设你的注册机中有足够的零钱,而且你希望使用尽可能少的纸币来找零。在这里,你可以采用贪婪算法。
例如,如果你需要找零30元,而你有25元、10元、5元和1元的纸币,你会怎么做?
- 首先,你会取一张25元的元。
- 然后,你需要再找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余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。