分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。
1.分治法
分治法(divide-and-conquer):将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
分治模式在每一层递归上都有三个步骤:
- 分解(Divide):将原问题分解成一系列子问题;
- 解决(conquer):递归地解各个子问题。若子问题足够小,则直接求解;
- 合并(Combine):将子问题的结果合并成原问题的解。
合并排序(merge sort)是一个典型分治法的例子。其对应的直观的操作如下:
- 分解:将n个元素分成各含n/2个元素的子序列;
- 解决:用合并排序法对两个子序列递归地排序;
- 合并:合并两个已排序的子序列以得到排序结果。
2. 动态规划法
动态规划算法的设计可以分为如下4个步骤:
- 描述最优解的结构
- 递归定义最优解的值
- 按自底向上的方式计算最优解的值
- 由计算出的结果构造一个最优解
分治法是指将问题划分成一些独立地子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题独立且重叠的情况,也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。
适合采用动态规划方法的最优化问题中的两个要素:最优子结构和重叠子问题。
最优子结构:如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。
重叠子问题:适用于动态规划求解的最优化问题必须具有的第二个要素是子问题的空间要很小,也就是用来求解原问题的递归算法课反复地解同样的子问题,而不是总在产生新的子问题。对两个子问题来说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,则它们是重叠的。
“分治法:各子问题独立 动态规划:各子问题重叠”
算法导论: 动态规划要求其子问题既要独立又要重叠,这看上去似乎有些奇怪。虽然这两点要求听起来可能矛盾的,但它们描述了两种不同的概念,而不是同一个问题的两个方面。如果同一个问题的两个子问题不共享资源,则它们就是独立的。对两个子问题俩说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,是重叠的,则它们是重叠的。
3. 贪心算法
对许多最优化问题来说,采用动态规划方法来决定最佳选择有点“杀鸡用牛刀”了,只要采用另一些更简单有效的算法就行了。贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解。贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样的。
贪心算法只需考虑一个选择(亦即,贪心的选择);在做贪心选择时,子问题之一必须是空的,因此只留下一个非空子问题。
贪心算法与动态规划与很多相似之处。特别地,贪心算法适用的问题也是最优子结构。贪心算法与动态规划有一个显著的区别,就是贪心算法中,是以自顶向下的方式使用最优子结构的。贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果子问题,而不是先寻找子问题的最优解,然后再做选择。
贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时看起来是最佳的选择。这一点是贪心算法不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。因此,解动态规划问题一般是自底向上,从小子问题处理至大子问题。贪心算法所做的当前选择可能要依赖于已经做出的所有选择,但不依赖于有待于做出的选择或子问题的解。因此,贪心算法通常是自顶向下地做出贪心选择,不断地将给定的问题实例归约为更小的问题。贪心算法划分子问题的结果,通常是仅存在一个非空的子问题。
分享到:
相关推荐
3. **算法**:排序(快速排序、归并排序、堆排序等)、搜索(深度优先搜索、广度优先搜索)、动态规划、贪心算法、回溯法、分治策略等。LeetCode主要考察的就是这些问题解决策略,掌握这些算法对提升编程能力至关...
实训商业源码-130个微信小程序源码-论文模板.zip
内容概要:本文详细介绍了光伏交直流混合微电网系统的离网(孤岛)模式下双下垂控制的Matlab/Simulink仿真模型。该系统由直流微电网、交流微电网和互联变换器(ILC)组成,分别采用了不同的控制策略来确保系统的稳定性。直流微电网采用电压电流双闭环控制,交流微电网则利用LCL逆变器进行下垂控制,而ILC通过双下垂控制策略协调交流母线频率和直流母线电压。仿真结果显示,在负载突变情况下,系统能够迅速恢复并保持稳定运行,展示了良好的鲁棒性和波形质量。 适合人群:对电力电子、微电网技术和Matlab仿真感兴趣的科研人员和技术开发者。 使用场景及目标:适用于研究和开发光伏交直流混合微电网系统的离网控制策略,特别是双下垂控制的应用。目标是在不同负载条件下验证系统的稳定性和效率,优化控制参数以提高系统性能。 其他说明:该仿真模型需要Matlab 2020b及以上版本,并使用SPS工具箱中的特定模块。文中提供了详细的控制参数设置和仿真结果分析,有助于深入理解各组件的工作原理及其协同效应。
内容概要:本文深入解析了基于SMIC 180nm工艺的10bit 20MHz SAR(Successive Approximation Register)ADC设计及其仿真实现。文中详细介绍了各个关键模块的设计原理和技术细节,如栅压自举开关、Vcm-Based开关时序、差分CDAC阵列、两级动态比较器、异步时钟生成以及动态SAR逻辑等。此外,提供了完整的仿真文档、电路图和预设好的仿真参数,使读者能够快速上手并进行实验验证。文章还特别强调了设计中的优化技巧,如通过动态电平转换降低THD、利用Vcm-Based时序减少冗余比较周期、优化比较器时钟脉冲宽度等,确保设计的高性能和稳定性。 适合人群:对模拟集成电路设计感兴趣的初学者和有一定经验的研发人员,特别是希望深入了解SAR ADC设计原理和仿真实践的人群。 使用场景及目标:① 学习SAR ADC的基本原理和设计方法;② 掌握基于SMIC 180nm工艺的具体实现细节;③ 进行仿真实验,验证设计效果并理解各模块的工作机制;④ 提升对低功耗、高精度ADC设计的理解。 其他说明:本文不仅提供理论讲解,还包括大量实用的Verilog和Matlab代码片段,便于读者理解和实践。同时,预设的蒙特卡洛仿真参数有助于读者探索工艺偏差对性能的影响。
基于聚类特征随机凸组合的非对抗图像生成算法 本研究旨在提供一种从给定数据集生成新图像的方法,而无需训练任何生成对抗网络(GAN)。其想法是使用主成分分析(PCA)算法提取数据集的特征,寻找图像像素空间和特征空间之间的线性变换,执行降维,并对结果集进行聚类。然后,通过随机凸组合生成新的特征向量,随后通过应用相应变换的逆将其映射回图像像素空间。 拼音双语对照 笔记
实训商业源码-文件快递-论文模板.zip
更新说明: 1.新增加前台用户自助购买广告功能 2.新增加自动审核功能 3.自动定时提交百度收录! 4.前台模板1套、置顶在线购买,接口对接易支付) 5.【修复】修复在线支付产生的BUG 环境要求:PHP7.0 安装sg11拓展
内容概要:本文档《DeepSeek本地部署教程(非ollama)》详细介绍了DeepSeek大语言模型的本地部署流程。首先明确了环境要求,包括Python 3.8以上版本、CUDA 11.7(针对GPU用户)、至少16GB RAM以及推荐的操作系统。接着阐述了安装步骤,如克隆代码仓库、创建虚拟环境、安装依赖等。随后讲解了模型下载方式,支持从Hugging Face平台下载不同版本的DeepSeek模型,如DeepSeek-7B、DeepSeek-67B和DeepSeek-Coder。文档还提供了两种运行模型的方式:命令行运行和使用API服务。此外,针对常见的问题,如CUDA相关错误、内存不足和模型加载失败等,给出了详细的解决方案。最后,文档提出了性能优化建议,如使用量化技术减少内存占用、启用CUDA优化等,并强调了安全注意事项,包括定期更新模型和依赖包、注意API访问权限控制等方面。; 适合人群:对大语言模型感兴趣的研究人员、开发者,特别是希望在本地环境中部署和测试DeepSeek模型的技术人员。; 使用场景及目标:①帮助用户在本地环境中成功部署DeepSeek大语言模型;②解决部署过程中可能遇到的问题,如环境配置、模型下载和运行时的常见错误;③提供性能优化建议,确保模型在不同硬件条件下的最佳表现;④指导用户进行安全配置,保障模型和数据的安全性。; 阅读建议:在阅读本教程时,建议按照文档的步骤顺序逐步操作,同时结合实际情况调整环境配置和参数设置。对于遇到的问题,可以参考常见问题解决部分提供的解决方案。此外,性能优化部分的内容有助于提高模型的运行效率,值得深入研究。
Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目),该项目是个人大作业项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于SpringCloud架构的简易版个人网上银行系统源码(高分项目)Java基于S
内容概要:本文档详细介绍了基于JavaScript的俄罗斯方块游戏课程设计,旨在通过开发完整的俄罗斯方块游戏帮助学生掌握前端开发技术。课程设计分为课程背景与目标、项目意义、预期成果、需求分析、系统设计、详细设计、界面设计、实现方案、测试方案、项目进度安排以及总结与展望几个部分。系统设计采用模块化思想,包括游戏核心逻辑、界面渲染、用户交互和游戏状态管理四个主要模块。详细设计中定义了方块类、游戏类、渲染类和控制器类,明确了各组件的功能和交互方式。实现方案提供了HTML、CSS和JavaScript的具体代码示例,确保游戏在不同浏览器和设备上的兼容性。测试方案涵盖功能测试、边界测试、用户界面测试和兼容性测试,以保证游戏的质量。项目进度安排分为需求分析、编码实现、测试调试、文档编写和项目验收五个阶段,时间跨度约为11周。 适合人群:具备一定编程基础,特别是对JavaScript有一定了解的学生或初学者。 使用场景及目标:①巩固JavaScript基础知识,包括变量、函数、对象、数组、循环等;②理解并掌握DOM操作方法;③学习如何处理用户事件和实现交互效果;④掌握动画原理和实现方式;⑤培养解决实际问题的能力和逻辑思维。 其他说明:此课程设计不仅注重代码编写,还强调需求分析和方案设计,建议学习者在实践中结合这些内容,调试代码并不断优化游戏体验。此外,文档还提出了未来的改进方向,如添加更多游戏模式、实现多人对战、增加音效和动画效果等。
实训商业源码-13116-成语答题-论文模板.zip
实训商业源码-婚恋交友系统v6.0-论文模板.zip
K005_调试工具_串口调试软件3.0a-串口通讯.zip
内容概要:本文介绍了二维RRT(Rapidly-exploring Random Trees)算法与贝塞尔曲线结合用于路径规划的方法。RRT算法通过随机采样在复杂环境中寻找路径,而贝塞尔曲线则用于对路径进行平滑处理,使路径更加自然流畅。文中详细解释了两种算法的工作原理,并提供了具体的实现步骤和代码片段。此外,还展示了不同情况下的效果图,指出了在障碍物密集区域可能出现的问题及其解决方案。 适合人群:对机器人导航、自动驾驶等领域感兴趣的科研人员、工程师及学生。 使用场景及目标:①研究和开发高效的路径规划算法;②应用于机器人导航、自动驾驶等需要路径规划的实际项目中;③解决路径不平滑、易与障碍物相交等问题。 其他说明:虽然贝塞尔曲线可以使路径更加美观和平滑,但在障碍物密集的情况下可能会导致路径与障碍物相交。因此,需要进一步优化采样策略或增加避障逻辑以确保路径的安全性和有效性。
Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码.zip,该项目是个人大作业项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子跳绳队人员管理系统源码Java实现的洛杉矶第三人民医院女子
内容概要:本文档详细介绍了《C#超市收银系统课程设计》的内容,旨在通过实现一个简单的超市收银系统,帮助学生掌握C#语言的基础编程技巧、面向对象编程、Windows窗体应用程序开发以及数据库操作等知识点。系统主要功能包括商品信息的录入、存储和管理,支持扫码(或手动输入)结账、计算总价与找零、生成购物小票,并实现数据的持久化存储。系统采用三层架构设计,分别为表示层、业务逻辑层和数据访问层,确保系统的模块化、健壮性和可扩展性。此外,文档还提供了详细的类设计、数据库设计、源代码实现及系统测试用例,并总结了设计成果、遇到的问题及解决方案。 适合人群:计算机专业学生或具备一定C#编程基础的开发者,特别是对Windows窗体应用程序开发和数据库操作感兴趣的初学者。 使用场景及目标:① 学习C#语言的基本语法和面向对象编程;② 掌握Windows窗体应用程序的开发流程;③ 理解并实现数据库操作,如SQLite的使用;④ 提高程序设计和调试能力,增强对实际项目开发的理解。 其他说明:文档不仅提供了理论知识,还结合了实际操作,通过具体的功能实现和测试用例,帮助读者更好地理解和掌握C#编程技巧。此外,文档还提出了改进方向,如增加图形界面、会员管理、销售统计和报表功能等,鼓励读者进一步探索和完善系统。
实训商业源码-拼多多1.28完整包-论文模板.zip
本文详细介绍了基于STM32F103处理器的环境监测系统硬件连接、OneNET云平台配置、代码修改及固件烧录的全流程。系统通过PM2.5传感器、温湿度传感器、OLED显示屏和ESP8266 WiFi模块实现数据采集与显示,并通过OneNET云平台进行数据传输与监控。文章首先描述了各硬件模块与STM32的接线方法,包括OLED、ESP8266、PM2.5传感器、温湿度传感器和继电器模块的详细连接说明。接着,提供了OneNET平台的使用教程,包括账号注册、产品添加、设备配置和Token生成等步骤。
上传 jdk-8u152-linux-x64.tar.gz 到 /usr/local 执行命令:解压和配置环境 tar -zxvf jdk-8u152-linux-x64.tar.gz export JAVA_HOME=/usr/local/jdk1.8.0_152 export PATH=$JAVA_HOME/bin:$PATH source ~/.bashrc java -version
实训商业源码-mpvue-音乐播放器mpvue-music-论文模板.zip