算法- 递归算法 分治算法
递归算法
(1)递归需要满足的三个条件
一个问题的解可以分解为几个子问题的解
何为子问题?子问题就是数据规模更小的问题。
这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
存在递归终止条件
把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。
(2)如何编写递归代码?
写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。
编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
(3)递归的弊端:
递归有利有弊,利是递归代码的表达力很强,写起来非常简洁;而弊就是空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用会耗时较多等问题。
分治算法
(1)什么是分治算法
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
(2)基本思想及策略
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。
如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
(3)分治法适用的情况
分治法所能解决的问题一般具有以下几个特征:
- 该问题的规模缩小到一定的程度就可以容易地解决
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
(4)分治法的基本步骤
- 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
- 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
- 合并:将各个子问题的解合并为原问题的解。
递归使用的就是分治的思想,它是分治思想的一种具体实现。
算法- 递归算法 分治算法相关推荐
- 2.Python算法之分治算法思想
1.什么是分治算法? 2.为什么需要分治算法? 3.分治算法基础 4.分治算法的解题一般步骤 5. 用分治算法--求顺序表中的最大值 5. 用分治算法--判断某个元素是否在列表中 6. 用分治算法-- ...
- 分治法的关键特征_算法系列之常用算法之一----分治算法
一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...
- 贪心算法、分治算法和动态规划的区别
贪心算法.分治算法和动态规划的区别 (1)分治法(divide and conquer method) 将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就 ...
- 算法8.分治算法计算a^n
设a为一给定实数,设计一个分治算法,用于计算an (n为自然数),并分析其计算时间复杂度,要求该算法的计算效率高于蛮力算法. 1. 算法设计思路 1.当n为偶数的时候,an可以分治为(a^2/n)*( ...
- 搞定面试算法系列 | 分治算法三步走
戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...
- 五大常用算法之一——分治算法
分治算法(Divide and Conquer) 分治算法,简单理解就是把一个大规模的问题分成相同或者相似的子问题,直到最后子问题能很容易的求解,原问题的解通过子问题的解合并得到. 根据这个描述,我们 ...
- 十种常用算法之分治算法(java版)
十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...
- 【Java算法】分治算法
1.什么是分治算法? 分治法(Divide-and-Conquer)是一种很重要的算法. 分治就是"分而治之"的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子 ...
- 【Java -- 算法】分治算法、动态规划、回溯法、贪心算法
前言 一句话理解四种算法思想 分治:分而治之,先解决子问题,再将子问题的解合并求出原问题. 贪心:一条路走到黑,选择当下局部最优的路线,没有后悔药. 回溯:一条路走到黑,手握后悔药,可以无数次重来.( ...
最新文章
- 趣谈 23 种设计模式(多图 + 代码)
- Android中五种常用的menu
- 【Maven学习】定制库到Maven本地资源库
- Linux安装python-3.8
- 解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 问题
- 单片机小白学步系列(九) 用万用焊板搭建实验电路
- 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网
- JavaScript循环遍历对象的属性,只要对象内的Value
- python判断中文函数_如何判断(或如何编写)一个没有副作用的python函数?
- java二进制的相关知识_java二进制运算基础知识点详解
- siege linux 压力测试工具
- 湖南超级计算机研学,以超算之速,跨越弦歌千年 | 建宁实验中学中考励志研学...
- 重装系统后如何恢复oracle10g数据…
- skywalking-介绍
- 华为实验28-WAN接入配置
- TopK Question
- 【无标题】asdas
- uAvionix获得FAA合同,部署和演示多个无人机同时飞行的C波段频率分配管理(FAM)
- Verilog-组合电路设计
- eclips启动code=13的处理经验