简述递归和分治的关系_漫画:到底什么是分治算法?和递归有什么关系?

708846f560b69f705a3cabc734051b51.png

欢迎关注微信公众号:视学算法,后台回复【学习】获取5T程序员全栈资料。

3150924e316ad77a2bed9e9122ad75b8.png

23634666b95a7890de7c2bdd9884e4db.png

c0bba94dc77acd7f61ceef4847393cf4.png

分治顾名思义“分而治之”,英文的意思翻译为“分割并征服”。

分治思想,简而言之就是将原问题分解成与“原问题相同但是规模更小”的子问题,并可以反复执行这个过程,使得问题规模减小到可以求解为止。

af95b160b3e54fad1200938bd9d08c68.png

3f64d4f127ba75cb9363701e05f758e7.png

504f664cb4507c9ace011dfaf730b152.png

1、快速排序算法

2、快速傅里叶变换算法

3、Karatsuba大数乘法算法

41cde1e7ae9c9cb1a7ce3981fc7281b1.png

问题:给定1000个数,从小到大进行排序。

39e04fcba42bfff89d0580fe2a97222d.png

f8155b42928a3e930c9b9f49976045ef.png

1cd3280f626874e1e6cf2765bb719515.png

先选择一个“标准”A,按照“比A小”和“比A大”将原来的数列分为两类,这样,只需要将两个子序列分别排好序,然后再合并到一块就ok了。

0cf95201eb277b50c0aa49fee607e92b.png

96fc2ed18e43452bf88a13c34104416c.png

3ac84235e18a02a9fd9403da03943739.png

770d96a43e98f91af360eb417f3ce8b2.png

直接做该运算,需要做平方级别的复数乘法,这样的复杂度超级高!如何进行分解呢?

首先,不可能像上边排序算法一样,找一个“标准数”,取前一半和后一半采样点来做!

bc25c0999a4b5c3cf8cbc120ea44ab1c.png

a903d78f05f6590c3d9f0751025e19c0.png

752221d621e952227a79625794a15051.png

f6388ed09e044b99994da19ee28f82fa.png

问题:两个很大的数相乘,如何更快的解决?

两个很大的数相乘,普通算法的时间复杂度为O(n^2)。

1f151406d795f2d4e3527e6e4e692a65.png

5b904be59135bb758f3f74a7da8ded72.png

5e0c0703f59d1990b1c081d8fa35a132.png

首先,将n位大数x和y进行分解。

3c01529036c938525787b3e5885b6d01.png

然后,x·y就变成了下面这样

a3365224f0692362fd1865b56705872c.png

并且满足

92393e74fbbcae209117bc8e50f53e29.png

所以,原来的大数乘法就变成了小数乘法!其实这位博士研究的算法不仅这里巧妙,而且还有一个小技巧!

be204b399aaaf6878a45bc3529c647e7.png

这样的话,乘法又能变成加法了!计算复杂度又大大的降低了!

a7aa92507e7d2c2336e8b992d8303400.png

7053ea0d3fe3f077c20feffed64f6476.png

0f829fb2161b1c27b56cfb8fcbaf18d6.png

第一:数学归纳是使用分治思想

只要出现可以用数学归纳公式来表示的大规模问题,第一反应就应该想到分治算法,通过特定的函数参数安排,一定可以用同一个函数来表述不同规模的问题,套用递归结构,可迅速解决问题!

bd82b1ec8f5e99aaac3ea40213505b27.png

第二:分治思想不一定使用递归结构

递归结构是循环结构的一种,也是分治思想应用最多的一种程序结构,但是不一定要使用它!关键在于能够写出递归公式以及是否有必要使用递归算法。比如上边提到的快速傅里叶变换算法,就没有用到递归!

b855fd825769b145561f4311c253a63e.png

三:分治思想的核心是“如何分”

能够把问题很棒的进行分解,也是一种能力和本事!也就是说把问题用分治法来进行解决,是算法的难点,也是重点!一方面需要经验,另一方面也需要想象力!所以说呢?人生也是如此!不管遇到多大的苦难,我们需要在一次一次的锻炼中进行学会分解苦难,才能够大事化小,小事化了!

f9f00240e3c9a3513b232a9a314a2f7c.png

24a06cf7a21877463a583d6b4086d302.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值