分治法的关键特征_经典算法思想2——分治(Divide-and-Conquer)

分治法是一种解决问题的策略,将大问题分解为规模较小的子问题,递归解决子问题后再合并结果。常见应用包括快速排序、归并排序、傅里叶变换等。该方法适用条件包括问题规模缩小后易解、具有最优子结构、子问题独立。二分搜索是分治法的经典应用,通过不断缩小查找范围来定位目标。熟练掌握分治法需要通过刷题来培养思维。
摘要由CSDN通过智能技术生成

分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。

分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解。

如果原问题可以分割成k个子问题,1

分治法使用场景该问题的规模缩小到一定的程度就可以容易的解决。

该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

利用该问题分解出的子问题的解可以合并为该问题的解。

该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

第一条特征是绝大多数问题可以满足的,问题的复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提。它是大多数问题可以满足的,此特征反映了递归思想的应用。第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条,而不具备第三条特征,则可以考虑使用贪心法或者动态规划法。第四条关系到分治法的效率,如果各个子问题是不独立的则分治法要做寻多不必要的工作,重复的解决公共的子问题,此时虽然可用分治法,但一般使用动态规划法较好。

分治法的基本步骤分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题

解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

合并:将各个子问题的解合并为原问题的解

分治法的复杂性分析

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阈值

,且最小子解规模为1的问题消耗一个单位时间。设将原问题分解为k个子问题以及用merge将K个子问题的解合并为原问题的解需用f(n)个单位时间,用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间:

可以使用分治法求解的一些经典问题二分搜索

大整数乘法

Strassen矩阵乘法

棋盘覆盖

线性时间选择

最接近点对问题

循环赛日程表

汉诺塔

二分搜索法

又叫做二分查找,折半查找,它是一种效率较高的查找方法。

线性表为有序表,先确定待查找记录所在的范围,然后逐步缩小范围直至找到或找不到该记录的位置。先确定中间位置:

;

将待查找的key值与data[middle].key的值比较,相等则查找成功并返回该位置,否则须确定新得查找区间,继续二分查找,如果data[middle].key大于key,由于data为有序线性表,可知data[middle...right].key均大于key,因此若表中存在关键字等于key的节点,则一定在位置middle左边的子表中。

反之,data[middle].key小于key,若表中存在关键字等于key的节点,则一定在位置middle右边的子表中,下一次查找对新的区域进行查找。

和动态规划一样,作为一种解决问题的算法思想,仅仅知道其概念是远远不够的,需要出培养这种思维方式,所以必须要有针对性的勤刷题,培养出一种解决问题的思维方式,这样以后遇到类似的问题才能迎刃而解。

参考博客:五大常用算法之一:分治算法 - Will_Don - 博客园​www.cnblogs.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值