Python算法详解:贪心算法
贪心算法(Greedy Algorithm)是一种通过选择当前最优解以期望达到全局最优解的算法思想。它在每一步选择时只考虑当前状态下的局部最优,而不关心全局问题的复杂性。这种算法简单高效,适用于某些特定问题,尤其是存在贪心选择性质和最优子结构的问题。本文将从贪心算法的基础思想出发,结合Python代码,详细解析其应用与实现。
目录
贪心算法的核心思想
案例 1:活动选择问题
解题步骤:
Python 实现:
代码说明:
案例 2:哈夫曼编码
解题步骤:
Python 实现:
代码说明:
案例 3:最小零钱问题
解题步骤:
Python 实现:
代码说明:
贪心算法的核心思想
贪心算法的基本逻辑可以总结为:
- 贪心选择性质: 每一步选择当前的最优解,能够逐步形成问题的整体最优解。
- 最优子结构: 子问题的最优解可以递归地构成原问题的最优解。
- 不可回退: 贪心算法一旦作出选择,就不能回头修改之前的选择。
适用场景: 贪心算法通常适用于以下类型的问题:
- 优化类问题(如最小化成本、最大化收益)。
- 可以通过局部最优解递推到全局最优解的问题。
典型案例包括活动选择问题、最小生成树、哈夫曼编码等。
案例 1:活动选择问题
问题描述: 给定一组活动,每个活动有一个开始时间和结束时间。需要选择尽可能多的活动,且任意两个活动不能重叠。
解题步骤:
- 贪心选择: 按活动的结束时间从早到晚排序。
- 选择活动: 每次选择当前结束时间最早的活动,且该活动与前一个活动不冲突。
Python 实现:
# 活动选择问题的实现
def activity_selection(activities):# 按结束时间排序activities.sort(key=lambda x: x[1])selected = []last_end_time = 0for start, end in activities:if start >= last_end_time:selected.append((start, end))last_end_time = endreturn selected# 测试数据
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)]
selected_activities = activity_selection(activities)
print("Selected activities:", selected_activities)
代码说明:
- 排序:
- 按活动的结束时间排序,确保每次选择的活动与后续活动有最大可能的兼容性。
- 选择活动:
- 遍历活动列表,选择开始时间大于等于上一个活动结束时间的活动。
- 时间复杂度:
- 排序的时间复杂度为 ( O(nlogn) ),选择活动的复杂度为 ( O(n) )。
案例 2:哈夫曼编码
问题描述: 哈夫曼编码是一种数据压缩算法,用于构建最优前缀编码,使得高频字符使用较短的编码。
解题步骤:
- 贪心选择: 每次从当前权值最小的两个节点合并,形成新的节点。
- 重复步骤: 直到所有节点被合并为一棵哈夫曼树。
Python 实现:
import heapq# 哈夫曼编码实现
def huffman_coding(frequencies):heap = [[weight, [symbol, ""]] for symbol, weight in frequencies.items()]heapq.heapify(heap)while len(heap) > 1:low1 = heapq.heappop(heap)low2 = heapq.heappop(heap)for pair in low1[1:]:pair[1] = '0' + pair[1]for pair in low2[1:]:pair[1] = '1' + pair[1]heapq.heappush(heap, [low1[0] + low2[0]] + low1[1:] + low2[1:])return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))# 测试数据
frequencies = {'A': 45, 'B': 13, 'C': 12, 'D': 16, 'E': 9, 'F': 5}
encoding = huffman_coding(frequencies)
print("Huffman Encoding:", encoding)
代码说明:
- 优先队列:
- 使用 Python 的
heapq
构建最小堆,方便每次快速找到权值最小的两个节点。
- 使用 Python 的
- 合并节点:
- 每次弹出两个最小节点,合并后重新压入堆中。
- 生成编码:
- 在树中通过向左加
0
,向右加1
的方式生成编码。
- 在树中通过向左加
- 时间复杂度:
- 建堆和合并操作的时间复杂度为 ( O(nlogn) )。
案例 3:最小零钱问题
问题描述: 给定一组硬币面额和一个总金额,求最少需要多少硬币凑出该金额。
解题步骤:
- 贪心选择: 每次选择面额最大的硬币。
- 验证: 减去当前硬币面额后,继续选择直到总金额为 0。
Python 实现:
# 最小零钱问题的实现
def coin_change(coins, amount):coins.sort(reverse=True) # 按面额从大到小排序count = 0for coin in coins:while amount >= coin:amount -= coincount += 1return count if amount == 0 else -1# 测试数据
coins = [1, 2, 5, 10]
amount = 27
result = coin_change(coins, amount)
print("Minimum coins needed:", result)
代码说明:
- 排序:
- 按面额从大到小排序,确保优先选择较大面额的硬币。
- 减金额:
- 每次选择一个硬币,减少目标金额,直到目标为 0。
- 限制条件:
- 贪心策略不一定适用于所有硬币组合。对于无法凑出的情况,返回 (-1)。
贪心算法通过逐步选择局部最优解,简化了问题的求解过程。本文通过活动选择问题、哈夫曼编码和最小零钱问题的实例,详细讲解了贪心算法的应用场景和实现方式。掌握贪心思想后,读者可以灵活运用它解决各类优化问题,并理解其局限性。
相关文章:
Python算法详解:贪心算法
贪心算法(Greedy Algorithm)是一种通过选择当前最优解以期望达到全局最优解的算法思想。它在每一步选择时只考虑当前状态下的局部最优,而不关心全局问题的复杂性。这种算法简单高效,适用于某些特定问题,尤其是存在贪心…...
5.3.2 软件设计原则
文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…...
sublime_text的快捷键
sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行:通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行:通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…...
【项目集成Husky】
项目集成Husky 安装初始化 Husky在.husky → pre-commit文件中添加想要执行的命令 安装 使用 Husky 可以帮助你在 Git 钩子中运行脚本,例如在提交代码前运行测试或格式化代码pnpm add --save-dev husky初始化 Husky npx husky init这会在项目根目录下创建一个 .hu…...
本地运行大模型效果及配置展示
电脑上用ollama安装了qwen2.5:32b,deepseek-r1:32b,deepseek-r1:14b,llama3.1:8b四个模型,都是Q4_K_M量化版。 运行过程中主要是cpu和内存负载比较大,qwen2.5:32b大概需要22g,deepseek-r1:32b类…...
数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...
进阶数据结构——高精度运算
目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版(c)六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…...
第一届“启航杯”网络安全挑战赛WP
misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...
前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局
一、盒模型 题目:简述CSS的盒模型 答:盒模型有两种类型,可以通过box-sizing设置 1.标准盒模型(content-box):默认值,宽度和高度只包含内容区域,不包含内边距、边框和外边距。 2.边框盒模型&a…...
使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI,是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手,感觉收获还蛮多的,今天来分享下开发过程中的一些经验~ 为啥要做这个…...
Windows程序设计10:文件指针及目录的创建与删除
文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…...
Rk3588芯片介绍(含数据手册)
芯片介绍:RK3588是一款低功耗,高性能的处理器,适用于基于arm的PC和边缘计算设备,个人移动互联网设备和其他数字多媒体应用,集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面:提供…...
golang 使用双向链表作为container/heap的载体
MyHeap:container/heap的数据载体,需要实现以下方法: Len:堆中数据个数 Less:第i个元素 是否必 第j个元素 值小 Swap:交换第i个元素和 第j个元素 Push:向堆中追加元素 Pop:从堆…...
HTML DOM 修改 HTML 内容
HTML DOM 修改 HTML 内容 引言 HTML DOM(文档对象模型)是浏览器内部用来解析和操作HTML文档的一种机制。通过DOM,我们可以轻松地修改HTML文档的结构、样式和行为。本文将详细介绍如何使用HTML DOM来修改HTML内容,包括元素的增删改查、属性修改以及事件处理等。 1. HTML …...
基于51单片机和WS2812B彩色灯带的流水灯
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯,谁不喜欢呢? 所用单片机:STC15W204S (也可以用其他1T单片机,例如,S…...
React第二十八章(css modules)
css modules 什么是 css modules 因为 React 没有Vue的Scoped,但是React又是SPA(单页面应用),所以需要一种方式来解决css的样式冲突问题,也就是把每个组件的样式做成单独的作用域,实现样式隔离,而css modules就是一种…...
瑞芯微方案:RV1126定制开发板方案定制
产品简介 RV1126 核心板是常州海图电子科技有限公司推出的一款以瑞芯微 RV1126处理器为核心的通用产品,其丰富的设计资源、稳定的产品性能、强力的设计支持,为客户二次开发快速转化产品提供强有力的技术保障。RV1126 核心板集多种优势于一身,…...
吴恩达深度学习——有效运作神经网络
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...
ollama改模型的存盘目录解决下载大模型报c:盘空间不足的问题
使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1,非常简单方便,参见:使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1…...
springboot集成钉钉,发送钉钉日报
目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api,主要用到以下几个api: ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...
Day49:添加字典元素
在 Python 中,字典是一个可变的数据类型,这意味着你可以随时添加新的键值对。今天我们将学习如何向字典中添加元素。 1. 使用方括号 ([]) 添加新元素 最简单的方法是通过字典的键,使用方括号 [] 来添加新的键值对。如果该键已经存在&#x…...
Keepalived 安装
环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64…...
AI应用部署——streamlit
如何把项目部署到一个具有公网ip地址的服务器上,让他人看到? 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库,也包括这些库的…...
C++中vector追加vector
在C中,如果你想将一个vector追加到另一个vector的后面,可以使用std::vector的成员函数insert或者std::copy,或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法: 方法1:使用insert方…...
普通人可以从DeepSeek工具获得什么帮助?
普通人可以从DeepSeek工具获得多方面的帮助,具体如下: 学习与教育 DeepSeek可以为学生提供作业辅导、知识点整理、论文思路生成等服务,帮助他们更好地理解和掌握学习内容。例如,学生可以通过DeepSeek获得详细的解题步骤和思路&…...
EtherCAT-快速搭建
EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...
[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头…...
【AIGC专栏】AI在自然语言中的应用场景
ChatGPT出来以后,突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类,虽然这是一句夸大其词的话,但是经过未来几十年的迭代,ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说,ChatGPT毫无疑问在当前…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
数科OFD证照生成原理剖析与平替方案实现
数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD(Open Fixed-layout Document)是一种基于XML的固定版式文档格式,广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面: OFD文…...
未来无线技术的发展方向
未来无线技术的发展趋势呈现出多样化、融合化的特点,涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升:Wi-Fi 技术迭代加快,如 Wi-Fi7 理论峰值速率达 46Gbps&#…...
验证二叉搜索数(98)
98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
Day51:type()函数
在 Python 中,type() 是一个内置函数,用于返回对象的类型。它可以用于检查变量的类型,也可以用于动态创建新的类型。今天,我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...
DeepSeek-R1大模型本地部署及简单测试
目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世,这是一款免费、开源且隐私优…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...
灵芝黄金基因组注释-文献精读109
The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝(Ganoderma lingzhi)的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...
【Proteus仿真】【51单片机】多功能计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、加减乘除,开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含:程序&…...
MySQL数据类型转换应注意什么?
文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时,需要注意以下几个关键点ÿ…...
【LLM-agent】(task1)简单客服和阅卷智能体
note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:Role (角色) -> Profile(角色…...
【Linux】使用管道实现一个简易版本的进程池
文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
力扣017_最小覆盖字串题解----C++
题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动…...
C++:函数
在之前的博客中已经讲过了C语言中的函数概念了,重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充,在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变…...
linux asio网络编程理论及实现
最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…...
第一篇:数据库基础与概念
第一篇:数据库基础与概念 目标读者: 没有接触过数据库的初学者。 内容概述: 在本篇文章中,我们将从零开始,详细介绍数据库的基本概念、常见的数据库管理系统(DBMS)以及数据库设计的基础知识…...
从理论到实践:Django 业务日志配置与优化指南
在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...
基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...
常用的 ASCII 码表字符
ASCII(美国信息交换标准代码,American Standard Code for Information Interchange)是一种字符编码标准,用于表示英文字符、数字、标点符号以及一些控制字符。ASCII 码表包含 128 个字符,每个字符用 7 位二进制数表示&…...