当前位置: 首页 > news >正文

动态规划与贪心算法:核心区别与实例分析

动态规划与贪心算法:核心区别与实例分析

动态规划和贪心算法是计算机科学中用于解决优化问题的两种著名方法。它们各自的思路和应用场景有显著的区别,理解这些区别对解决相关问题至关重要。本文将详细探讨这两种算法的最优子结构、解法策略、适用场景,并通过具体的代码示例加以说明。

一、最优子结构

动态规划(Dynamic Programming, DP)

动态规划适用于具有最优子结构性质的问题。也就是说,问题的最优解可由其子问题的最优解组合而成。在 DP 中,通常会存储和复用这些子问题的结果,以避免重复计算,从而提高效率。

例子:斐波那契数列

动态规划可以用来高效地计算斐波那契数列。

public class Fibonacci {public int fib(int n) {if (n <= 1) return n;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]; // 状态转移}return dp[n];}
}

贪心算法(Greedy Algorithm)

贪心算法适用于通过局部最优选择来构造全局最优解的问题。在每一步,贪心算法都选择当前最优选项,而不考虑全局最优解,这种方法虽不保证最佳解,但在特定问题下可以得到全局最优解。

例子:找零问题

在给定硬币面额的情况下,贪心算法可以用来找零。

public class CoinChange {public int minCoins(int[] coins, int amount) {Arrays.sort(coins); // 先排序,贪心选择最大面额的硬币int count = 0;for (int i = coins.length - 1; i >= 0; i--) {while (amount >= coins[i]) {amount -= coins[i];count++;}}return count; // 最少硬币数量}
}

二、解法策略

动态规划的策略

  1. 自底向上:通过先解决较小的子问题,逐步构建出最终解决方案。
  2. 状态转移:定义状态的转换规则,从而构造 DP 表。

贪心算法的策略

  1. 自顶向下:逐步构造解决方案,每一步都选择当前认为最佳的选项。
  2. 局部最优选择:在当前状态下选择最优选项,构建全局解决方案。

三、适用场景

1. 动态规划的适用场景

动态规划通常适用于需要考虑所有可能选项的场景,典型问题包括:

  • 背包问题
  • 最长公共子序列
  • 最短路径问题(如 Dijkstra 算法)
  • 编辑距离
例子:最长公共子序列
public class LongestCommonSubsequence {public int lcs(String text1, String text2) {int[][] dp = new int[text1.length() + 1][text2.length() + 1];for (int i = 1; i <= text1.length(); i++) {for (int j = 1; j <= text2.length(); j++) {if (text1.charAt(i - 1) == text2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[text1.length()][text2.length()];}
}

2. 贪心算法的适用场景

贪心算法则适用于那些局部选择能够构建全局解决方案的情况,例如:

  • 活动选择问题
  • 霍夫曼编码
  • 最小生成树(Prim/Kruskal 算法)
例子:最小生成树(Kruskal 算法)
public class KruskalAlgorithm {public List<Edge> kruskal(List<Edge> edges, int numVertices) {Collections.sort(edges); // 按权重排序UnionFind uf = new UnionFind(numVertices);List<Edge> result = new ArrayList<>();for (Edge edge : edges) {if (uf.find(edge.src) != uf.find(edge.dest)) {uf.union(edge.src, edge.dest);result.add(edge); // 选择此边}}return result; // 返回最小生成树的边}
}

四、总结

  • 动态规划:通过记忆化存储中间状态以减少计算量,适合状态具有重叠子问题的情况。它是解决复杂问题的强大工具。

  • 贪心算法:通过在每一步选择中做出局部最优解,适合解决能够通过局部选择构建全局解决方案的问题。

在实际的应用中,选择使用动态规划还是贪心算法,取决于问题的性质及其最优解的结构。理解这两者的区别与联系是解决许多优化问题的关键所在。

相关文章:

动态规划与贪心算法:核心区别与实例分析

动态规划与贪心算法&#xff1a;核心区别与实例分析 动态规划和贪心算法是计算机科学中用于解决优化问题的两种著名方法。它们各自的思路和应用场景有显著的区别&#xff0c;理解这些区别对解决相关问题至关重要。本文将详细探讨这两种算法的最优子结构、解法策略、适用场景&a…...

.NET 公共语言运行时(Common Language Runtime,CLR)

.NET 的公共语言运行时&#xff08;Common Language Runtime&#xff0c;CLR&#xff09;是 .NET Framework 和 .NET Core 的核心组件&#xff0c;负责运行和管理 .NET 程序。CLR 提供了一个高效、安全和稳定的执行环境&#xff0c;支持多种编程语言并处理各种系统级的任务。下…...

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; 有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务器查询…...

YOLO11 旋转目标检测 | OBB定向检测 | ONNX模型推理 | 旋转NMS

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行旋转目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 本文提供源代码&#xff0c;支持不同尺寸图片输入、支持旋转NMS过滤重复…...

PCL 点云拟合 拟合空间直线

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 设置RANSAC算法参数 2.1.2拟合直线模型 2.1.3 提取拟合直线内点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更…...

我的创作纪念日-20241112-感谢困难

我的创作纪念日-20241112-感谢困难 一、机缘二、收获1、积累2、感谢困难 三、日常四、成就五、憧憬 一、机缘 我之前有一个自己的私人博客&#xff0c;但是后来发现CSDN的功能更强大&#xff0c;更专业&#xff0c;所以我就把自己博客内容转到CSDN上面来了。 二、收获 1、积累…...

苍穹外卖05-Redis相关知识点

目录 什么是Redis&#xff1f; redis中的一些常用指令 value的5种常用数据类型 各种数据类型的特点 Redis中数据操作的常用命令 字符串类型常用命令&#xff1a; 哈希类型常用命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis 环境…...

unity 玩家和炸弹切线计算方式

脚本挂在炸弹上&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TargetDetaction : MonoBehaviour {private Transform PlayerTF;private Transform bomb;private float radius;private string Player "Play…...

【MySQL】MySQL中的函数之REGEXP_LIKE

在 MySQL 中&#xff0c;REGEXP_LIKE() 函数用于检查一个字符串是否与正则表达式匹配。不过需要注意的是&#xff0c;REGEXP_LIKE() 并不是所有版本的 MySQL 都支持的函数。这个函数是在 MySQL 8.0 版本中引入的。 基本语法 REGEXP_LIKE(str, pat [, match_type ])str: 要测试…...

跟着尚硅谷学vue2—进阶版4.0—Vuex1.0

5. Vuex 1. 理解 Vuex 1. 多组件共享数据-全局事件总线实现 红线是读&#xff0c;绿线是写 2. 多组件共享数据-vuex实现 vuex 不属于任何组件 3. 求和案例-纯vue版 核心代码 1.Count.vue <template><div><h1>当前求和为&#xff1a;{{ sum }}</h1&…...

深度学习服务器租赁AutoDL

省钱绝招 #AutoDL #GPU #租显卡...

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 1.2 进度条百分比显示设置 开始 ---> 条件格式 --->新建规则--->编辑规则 1.3 相对引用和绝对引用…...

Mac电脑中隐藏文件(即以 . 开头的文件/文件夹)的显示和隐藏的两种方法

方法一&#xff1a;使用电脑快捷键&#xff0c;步骤如下&#xff1a; 1、点击一下桌面&#xff0c;用来激活 Finder &#xff1b; 2、同时按下 Command Shift 点&#xff0c;即 【Command Shift . 】&#xff1b; 3、 打开可能包含此类文件的文件夹&#xff0c;比如磁盘…...

【Linux】:进程信号(信号概念 信号处理 信号产生)

✨ 眼里有诗&#xff0c;自向远方 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#…...

Flink运行时架构以及核心概念

1.运行构架 1.提交作业后启动一个客户端进程&#xff0c;客户端解析参数&#xff08;-d -t 等等&#xff09;&#xff0c;后进行封装由Actor通信系统提交&#xff0c;取消&#xff0c;更新任务给JobManager。 2.JobManager&#xff08;进程&#xff09;通信系统一个组件叫分发…...

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…...

[CKS] K8S RuntimeClass SetUp

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于RuntimeClass创建和挂载的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS…...

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、SessionPage &#xff08;一&#xff09;SessionPage 模块的基本功能 &#xff08;二&#xff09;基本使…...

计算机网络-2.1物理层

文章目录 通信的基础概念信源、信宿、信号、信道码元、速率、波特带宽&#xff08;Hz&#xff09; 奈奎斯特采样定律和香农采样定律编码&解码&#xff0c;调制&解调常用的编码方法常用的调制方法 传输介质1. 导向型传输介质2. 非导向型传输介质物理层接口的特性 物理层…...

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...